与java的hadoop wordcount

时间:2016-12-21 17:51:18

标签: java hadoop mapreduce hdfs

大家好,我是Hadoop的新手。这是我的第一个程序,我需要帮助解决以下错误。

当我直接将文件放入HDFS而不使用hdfs:// localhost:9000 /然后我收到错误消息 dir不存在

所以我使用以下方式将文件放入hdfs

hadoop fs -put file.txt  hdfs://localhost:9000/sawai.txt

将此文件加载到HDFS后,如下所示:

<code>File added successfully</code>

  1. 好的,然后我尝试运行我的 wordcount jar 文件程序,如下所示:

    hadoop jar wordcount.jar hdp.WordCount sawai.txt outputdir

    我收到以下错误消息:

    org.apache.hadoop.mapred.InvalidInputException: Input path does not exist: hdfs://localhost:9000/user/hadoop_usr/sawai.txt
    
  2. 然后我尝试另一种方式,我尝试像这样指定hdfs路径。

    hadoop jar wordcount.jar hdp.WordCount hdfs://localhost:9000/sawai.txt hdfs://localhost:9000/outputdir

    我收到以下错误消息:

    org.apache.hadoop.mapred.FileAlreadyExistsException: Output directory hdfs://localhost:9000/sawai.txt already exists
        at org.apache.hadoop.mapred.FileOutputFormat.checkOutputSpecs(FileOutputFormat.java:131)    at org.apache.hadoop.mapreduce.JobSubmitter.checkSpecs(JobSubmitter.java:268) 
        at org.apache.hadoop.mapreduce.JobSubmitter.submitJobInternal(JobSubmitter.java:139)    at org.apache.hadoop.mapreduce.Job$10.run(Job.java:1290) 
        at org.apache.hadoop.mapreduce.Job$10.run(Job.java:1287) 
        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:1698) 
        at org.apache.hadoop.mapreduce.Job.submit(Job.java:1287) 
        at org.apache.hadoop.mapred.JobClient$1.run(JobClient.java:575) 
        at org.apache.hadoop.mapred.JobClient$1.run(JobClient.java:570) 
        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:1698) 
        at org.apache.hadoop.mapred.JobClient.submitJobInternal(JobClient.java:570) 
        at org.apache.hadoop.mapred.JobClient.submitJob(JobClient.java:561) 
        at org.apache.hadoop.mapred.JobClient.runJob(JobClient.java:870) 
        at hdp.WordCount.run(WordCount.java:40) 
        at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:70) 
        at org.apache.hadoop.util.ToolRunner.run(ToolRunner.java:84) 
        at hdp.WordCount.main(WordCount.java:17) 
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)    at java.lang.reflect.Method.invoke(Method.java:498) 
        at org.apache.hadoop.util.RunJar.run(RunJar.java:221) 
        at org.apache.hadoop.util.RunJar.main(RunJar.java:136)
    
  3. 我读了很多文章,他们建议我每次更改输出目录名称,我应用这种方式,但它不适用于我的情况,它似乎问题在于定义我们想要执行操作的源文件名。

    导致异常的原因是什么?如何解决?

2 个答案:

答案 0 :(得分:2)

我还没有看到你输入/输出的完整程序....

我认为sawai.txt是您想要计算单词数量的输入文件。你为什么要把它复制到输出?

但是,请参阅此示例将其添加到驱动程序。如果路径存在则删除。所以你不会得到FileAlreadyExistsException

   /*Provides access to configuration parameters*/
    Configuration conf = new Configuration();
    /*Creating Filesystem object with the configuration*/
    FileSystem fs = FileSystem.get(conf);
    /*Check if output path (args[1])exist or not*/
    if(fs.exists(new Path(args[1]))){
       /*If exist delete the output path*/
       fs.delete(new Path(args[1]),true);
    }

答案 1 :(得分:1)

您是否尝试过hadoop jar wordcount.jar hdp.WordCount /sawai.txt / outputdir? HDFS更喜欢FULL路径。

另外,我从来没有必要在“hdfs:// localhost:/”之前添加文件到HDFS或运行jar。通常你可以引用完整的文件路径及其罚款。也许在没有前置的情况下尝试一下?

如果修复它,最佳做法是将复制因子增加到 。此文件 尺寸 尺寸<相比 更小 < / em>这可能会成为问题。 Cloudera建议文件和块大小http://blog.cloudera.com/blog/2009/02/the-small-files-problem