hadoop中MapReduce的job提交报空指针异常java.lang.Exception: java.lang.NullPointerException

MapReduce空指针异常详解
本文详细解析了一个常见的MapReduce编程错误——空指针异常,通过具体代码示例,阐述了在Map阶段如何因变量未正确实例化而引发异常,并提供了避免此类错误的有效策略。
java.lang.Exception: java.lang.NullPointerException
	at org.apache.hadoop.mapred.LocalJobRunner$Job.runTasks(LocalJobRunner.java:489)
	at org.apache.hadoop.mapred.LocalJobRunner$Job.run(LocalJobRunner.java:549)
Caused by: java.lang.NullPointerException
	at cn.edu360.app.log.mr.AppLogDataClean$AppLogDataCleanMapper.map(AppLogDataClean.java:135)
	at cn.edu360.app.log.mr.AppLogDataClean$AppLogDataCleanMapper.map(AppLogDataClean.java:1)

如图。。。。MapReduce的空指针异常错误对我来说真的太常见了,我这个错误犯得非常睿智。

 给大家看一下出错的代码行:

k即map方法中的key

		k.set(JsonToStringUtil.toString(headerObj));

为什么会报这个错呢,因为我创建key的时候忘记实例化了(/ □ \)我可真是个睿智

Exception in thread "main" java.lang.NullPointerException at java.lang.ProcessBuilder.start(ProcessBuilder.java:1012) at org.apache.hadoop.util.Shell.runCommand(Shell.java:483) at org.apache.hadoop.util.Shell.run(Shell.java:456) at org.apache.hadoop.util.Shell$ShellCommandExecutor.execute(Shell.java:722) at org.apache.hadoop.util.Shell.execCommand(Shell.java:815) at org.apache.hadoop.util.Shell.execCommand(Shell.java:798) at org.apache.hadoop.fs.RawLocalFileSystem.setPermission(RawLocalFileSystem.java:731) at org.apache.hadoop.fs.RawLocalFileSystem.mkOneDirWithMode(RawLocalFileSystem.java:489) at org.apache.hadoop.fs.RawLocalFileSystem.mkdirsWithOptionalPermission(RawLocalFileSystem.java:530) at org.apache.hadoop.fs.RawLocalFileSystem.mkdirs(RawLocalFileSystem.java:507) at org.apache.hadoop.fs.FilterFileSystem.mkdirs(FilterFileSystem.java:305) at org.apache.hadoop.mapreduce.JobSubmissionFiles.getStagingDir(JobSubmissionFiles.java:133) at org.apache.hadoop.mapreduce.JobSubmitter.submitJobInternal(JobSubmitter.java:144) at org.apache.hadoop.mapreduce.Job$10.run(Job.java:1290) at org.apache.hadoop.mapreduce.Job$10.run(Job.java:1287) at java.security.AccessController.doPrivileged(Native Method) at javax.security.auth.Subject.doAs(Subject.java:422) at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1657) at org.apache.hadoop.mapreduce.Job.submit(Job.java:1287) at org.apache.hadoop.mapreduce.Job.waitForCompletion(Job.java:1308) at com.kegc.Phoneflow.PhoneFlowDriver.main(PhoneFlowDriver.java:39)帮我解决一下这个问题
05-25
### 解决 `java.lang.ClassNotFoundException: hadoop.mapreduce.WordCountDriver` 的问题 在 Hadoop MapReduce 程序中,当运行时出现 `java.lang.ClassNotFoundException` 时,通常是因为类路径配置不正确或驱动类未被正确加载。以下是解决该问题的详细方法: #### 1. 配置 Hadoop 类路径 确保 Hadoop 的类路径已正确设置。可以通过修改 `$HBase_HOME/etc/hadoop/hadoop-env.sh` 文件来配置 `HADOOP_CLASSPATH`,以包含所有必要的 JAR 文件[^1]。例如: ```bash export HADOOP_CLASSPATH=$HADOOP_CLASSPATH:/path/to/your/jars/* ``` 此外,在运行 MapReduce 任务时,可以使用以下命令动态添加类路径: ```bash hadoop classpath ``` #### 2. 设置 MapReduce 应用程序类路径 如果运行自带的 WordCount 示例时出现 `ClassNotFoundException`,需要在 `mapred-site.xml` 中配置 `mapreduce.application.classpath` 参数,指定执行 MapReduce 时搜索的类路径[^2]。示例配置如下: ```xml <property> <name>mapreduce.application.classpath</name> <value>/path/to/your/jars/*</value> </property> ``` #### 3. 明确指定 JAR 文件 在提交 MapReduce 作业时,确保明确指定了包含驱动类的 JAR 文件。可以通过以下代码设置: ```java configuration.set("mapreduce.job.jar", "path/to/your/mapreduce.jar"); ``` 或者在命令行中指定 JAR 文件: ```bash hadoop jar path/to/your/mapreduce.jar com.example.WordCountDriver input output ``` #### 4. 检查驱动类是否打包 确保驱动类(如 `WordCountDriver`)已正确打包到 JAR 文件中。可以使用以下命令检查 JAR 文件的内容: ```bash jar tf path/to/your/mapreduce.jar ``` 如果未找到驱动类,则需要重新构建项目并确保所有相关类均被打包。 #### 5. 处理 YARN 相关异常 如果日志中还包含 `YarnRuntimeException` 的错误信息,则可能需要检查 YARN 的类路径配置[^4]。确保所有必要的 Hadoop 和 YARN JAR 文件均已正确加载。 #### 6. Spark 集成中的 LZO 支持 如果在 Spark 中处理 LZO 压缩文件时遇到类似问题,可以尝试设置 `SPARK_CLASSPATH` 环境变量[^5]。例如: ```bash export SPARK_CLASSPATH=$SPARK_CLASSPATH:/path/to/hadoop-lzo.jar ``` ### 示例代码 以下是一个完整的 WordCount 示例,包括驱动类和配置: ```java import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.Path; import org.apache.hadoop.io.IntWritable; import org.apache.hadoop.io.Text; import org.apache.hadoop.mapreduce.Job; import org.apache.hadoop.mapreduce.lib.input.FileInputFormat; import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat; public class WordCountDriver { public static void main(String[] args) throws Exception { if (args.length != 2) { System.err.println("Usage: WordCountDriver <input path> <output path>"); System.exit(-1); } Configuration conf = new Configuration(); conf.set("mapreduce.job.jar", "path/to/your/mapreduce.jar"); Job job = Job.getInstance(conf, "Word Count"); job.setJarByClass(WordCountDriver.class); job.setMapperClass(WordCountMapper.class); job.setReducerClass(WordCountReducer.class); job.setOutputKeyClass(Text.class); job.setOutputValueClass(IntWritable.class); FileInputFormat.addInputPath(job, new Path(args[0])); FileOutputFormat.setOutputPath(job, new Path(args[1])); System.exit(job.waitForCompletion(true) ? 0 : 1); } } ``` ###
评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值