Hadoop:调用 getFsStatistics 时出现 NullPointerException

Hadoop: NullPointerException when calling getFsStatistics

当运行使用存储在 HDFS 上的文件作为输入的 MapReduce 作业时,我遇到以下异常:

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.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)

我自己不太明白这意味着什么,除了这看起来可能与文件权限有关。我还发现了以下具有相同 Exception/trace 的其他 Whosebug post:NullPointerException with MR2 in windows.

总结 post:此异常是由于 hadoop 运行 与 MR 作业的用户不同。

我试过以下方法:

但这两种方法都没有产生任何结果。

我 运行 在本地主机 ("pseudo-distributed mode") 上运行所有 Hadoop 进程。我使用普通本地用户使用 start-yarn.shstart-dfs.sh 启动了 hadoop。我正在 运行 与同一个用户一起处理 hadoop 作业。我还将 dfs.datanode.data.dirdfs.namenode.name.dir 设置为本地计算机上我有权使用本地用户 read/write 访问的路径。我已将 dfs.permissions.enabled 设置为 false

我是否误解了这个异常?还有什么我应该尝试的吗?谢谢。

最后,是我自己的 FileSplit 子类导致了问题。我没有正确(反)序列化 FileSplit 的 Path,所以当通过网络发送时,这个字段变成了 null。 Hadoop 在空路径上调用 getFsStatistics,导致 NullPointerException.