b / w setInputPaths(..)和addInputPaths(..)有什么区别?

时间:2016-04-30 14:04:48

标签: java eclipse ubuntu hadoop

我试图实现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(..)有什么区别? 为什么会有所作为?

2 个答案:

答案 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.defaultFSFind port number where HDFS is listening)。