我试图实现eclipse文档中给出的简单字数。 相同的程序在终端上工作,但当我尝试在eclipse中运行它时,我从run config
传递它的参数论点是:
/home/rachit/wordcount/input /home/rachit/wordcount/output
得到了这个例外:
Exception in thread "main" java.lang.NullPointerException
at org.apache.hadoop.mapreduce.lib.input.FileInputFormat.getBlockIndex(FileInputFormat.java:442)
at org.apache.hadoop.mapreduce.lib.input.FileInputFormat.getSplits(FileInputFormat.java:411)
at org.apache.hadoop.mapreduce.JobSubmitter.writeNewSplits(JobSubmitter.java:302)
at org.apache.hadoop.mapreduce.JobSubmitter.writeSplits(JobSubmitter.java:319)
at org.apache.hadoop.mapreduce.JobSubmitter.submitJobInternal(JobSubmitter.java:197)
at org.apache.hadoop.mapreduce.Job$10.run(Job.java:1297)
at org.apache.hadoop.mapreduce.Job$10.run(Job.java:1294)
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:1656)
at org.apache.hadoop.mapreduce.Job.submit(Job.java:1294)
at org.apache.hadoop.mapreduce.Job.waitForCompletion(Job.java:1315)
然后我改变了这个
FileInputFormat.addInputPath(job, new Path(args[0]));
FileOutputFormat.setOutputPath(job, new Path(args[1]));
到
FileInputFormat.setInputPaths(job,new Path("hdfs://localhost:9000/home/rachit/wordcount/input"));
FileOutputFormat.setOutputPath(job, new Path("hdfs://localhost:9000/home/rachit/wordcount/output"));
指出要注意:dfs端口号为9000并且已连接,我可以在eclipse中从map_reduce透视图浏览文件结构,我从那里上传文件。
setInputPaths(..)
文档:
将给定的逗号分隔路径设置为map-reduce作业的输入列表。
addInputPaths(..)
文档:
将给定的逗号分隔路径添加到map-reduce作业的输入列表中。
b / w setInputPaths(..)
和addInputPaths(..)
有什么区别?
为什么会有所作为?
答案 0 :(得分:2)
作业可以有多个输入路径。假设您在工作中有五条路径。你可以这样做:
因此,addInputPath
允许您向现有路径列表添加单个路径。
addInputPaths
允许您向现有列表添加多个路径。如果作业有两条路径,并且您使用addInputPaths
再添加三条路径,那么您将在作业中有五条路径。
setInputPaths
允许您设置多个路径替换现有列表。因此,如果您有两条路径,并且使用setInputPaths
设置三条路径,则最后会有三条路径。
区别在于添加(到现有的路径列表),替换。
您遇到的错误可能是由于args[0]
中没有正确的路径,或者在您显示的代码部分之前的作业中存在错误的路径。如果您从一个具有空路径列表的作业开始,那么使用add
和使用set
之间应该没有区别。
答案 1 :(得分:-1)
只需添加@RealSkeptic的答案
当你说
时HDFS://本地主机:9000 /家庭/ rachit /单词计数/输入
它转到HDFS file system
。
当您不在路径前添加hdfs://localhost:9000/
时,它会尝试从local
文件系统和not HDFS
获取文件,因为在本例中,本地文件系统是default file system
。
要将默认文件系统从本地更改为HDFS,请更改core-site.xml
<property>
<name>fs.defaultFS</name>
<value>hdfs://localhost:9000/</value>
</property>
完成此操作后,您无需在hdfs://localhost:9000/
和addInputPath
中同时指定setInputPaths
,因为它会尝试从HDFS file system
获取文件。
由于你提供的路径存在于HDFS而不是本地,因此它抛出了NullPointerException。
另请查看此文档:https://github.com/hanborq/hadoop/blob/master/example-confs/conf.secure/core-site.xml
fs.default.name
已弃用。请改为使用fs.defaultFS
(Find port number where HDFS is listening)。