我正在尝试实现Eclipse文档中给出的简单字数统计。
相同的程序可以在终端上运行,但是当我尝试在Eclipse中运行时,我从运行配置中传递了参数
论据是:
/home/rachit/wordcount/input /home/rachit/wordcount/output
Got this exception:
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透 View 浏览文件结构,然后从那里上传文件。
setInputPaths(..)
文档:addInputPaths(..)
文档:b / w
setInputPaths(..)
和addInputPaths(..)
有什么区别?为什么会有所作为?
最佳答案
一项作业可以有多个输入路径。假设您在工作中有5条想要的路径。您可以执行以下操作:
因此,
addInputPath
允许您将单个路径添加到现有路径列表中。addInputPaths
允许您向现有列表添加多个路径。如果作业有两个路径,并且您使用addInputPaths
再添加三个,则作业中将有五个路径。setInputPaths
允许您设置多个替换现有列表的路径。因此,如果您有两个路径,并且使用setInputPaths
设置了三个路径,那么最后会有三个路径。区别在于添加(到现有路径列表)并替换它。
您收到的错误可能是由于
args[0]
中没有正确的路径,或者作业在显示的部分代码之前存在现有的不良路径。如果您是从一个具有空路径列表的作业开始,那么使用add
和使用set
之间应该没有什么区别。