我在运行MapReduce作业时遇到以下异常,将存储在HDFS上的文件作为输入:
15/03/27 17:18:12 INFO mapreduce.Job: Task Id : attempt_1427398929405_0005_m_000005_2, Status : FAILED
Error: java.lang.NullPointerException
at org.apache.hadoop.mapred.Task.getFsStatistics(Task.java:347)
at org.apache.hadoop.mapred.MapTask$NewTrackingRecordReader.<init>(MapTask.java:486)
at org.apache.hadoop.mapred.MapTask.runNewMapper(MapTask.java:735)
at org.apache.hadoop.mapred.MapTask.run(MapTask.java:340)
at org.apache.hadoop.mapred.YarnChild$2.run(YarnChild.java:167)
at java.security.AccessController.doPrivileged(Native Method)
at javax.security.auth.Subject.doAs(Subject.java:415)
at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1556)
at org.apache.hadoop.mapred.YarnChild.main(YarnChild.java:162)
我不太了解这意味着什么,除了这看起来可能与文件权限有关。我还发现以下其他StackOverflow帖子具有相同的异常/跟踪:NullPointerException with MR2 in windows。
总结帖子:此异常是由于hadoop作为与MR作业不同的用户运行而引起的。
我尝试过以下方法:
chmod
- 将HDFS中的所有文件和目录转换为777(仅用于实验)sudo
但这两种方法都没有产生任何结果。
我在localhost上运行所有Hadoop进程(&#34;伪分布式模式&#34;)。我使用start-yarn.sh
和start-dfs.sh
与我的普通本地用户一起启动了hadoop。我和同一个用户一起运行hadoop作业。我还将dfs.datanode.data.dir
和dfs.namenode.name.dir
设置为我有权向本地用户读取/写入的本地计算机上的路径。我已将dfs.permissions.enabled
设置为false
。
我是否误解了这个例外?还有什么我应该尝试的吗?谢谢。
答案 0 :(得分:0)
最后,它是我自己的FileSplit
子类导致问题。我没有正确地(de)序列化FileSplit的Path
,因此当通过网络发送时,该字段变为null
。 Hadoop在空路径上调用getFsStatistics
,导致NullPointerException
。