大家好,我是Hadoop的新手。这是我的第一个程序,我需要帮助解决以下错误。
当我直接将文件放入HDFS而不使用hdfs:// localhost:9000 /然后我收到错误消息 dir不存在。
所以我使用以下方式将文件放入hdfs
hadoop fs -put file.txt hdfs://localhost:9000/sawai.txt
将此文件加载到HDFS后,如下所示:
好的,然后我尝试运行我的 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
然后我尝试另一种方式,我尝试像这样指定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)
我读了很多文章,他们建议我每次更改输出目录名称,我应用这种方式,但它不适用于我的情况,它似乎问题在于定义我们想要执行操作的源文件名。
导致异常的原因是什么?如何解决?
答案 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