Hadoop-伪分布式模式: 输入路径不存在

4
我是一位新手,正在学习Hadoop技术。 我已经在Standalone模式下运行了我的Hadoop应用程序,并且运行得很好。现在我决定将其移动到伪分布式模式下。我按照要求进行了配置更改。以下是我的xml文件的一些片段:
我的core-site.xml文件如下:
<name>fs.default.name</name>
<value>hdfs://localhost/</value>
</property>
<property>
    <name>hadoop.tmp.dir</name>
    <value>/tmp/hadoop-onur</value>
    <description>A base for other temporary directories.</description>
   </property>

我的hdfs-site.xml文件是

<property>
<name>dfs.replication</name>
<value>1</value>
</property>

我的mapred.xml文件如下:

<property>
<name>mapred.job.tracker</name>
<value>localhost:8021</value>
</property>

我运行了start-dfs.sh和start-mapred.sh脚本,它们都正常启动了。

root@vissu-desktop:/home/vissu/Raveesh/Hadoop# start-dfs.sh 
starting namenode, logging to /home/vissu/Raveesh/Hadoop/hadoop-0.20.2/bin/../logs/hadoop-root-namenode-vissu-desktop.out
localhost: starting datanode, logging to /home/vissu/Raveesh/Hadoop/hadoop-0.20.2/bin/../logs/hadoop-root-datanode-vissu-desktop.out
localhost: starting secondarynamenode, logging to /home/vissu/Raveesh/Hadoop/hadoop-0.20.2/bin/../logs/hadoop-root-secondarynamenode-vissu-desktop.out
root@vissu-desktop:/home/vissu/Raveesh/Hadoop# start-mapred.sh 
starting jobtracker, logging to /home/vissu/Raveesh/Hadoop/hadoop-0.20.2/bin/../logs/hadoop-root-jobtracker-vissu-desktop.out
localhost: starting tasktracker, logging to /home/vissu/Raveesh/Hadoop/hadoop-0.20.2/bin/../logs/hadoop-root-tasktracker-vissu-desktop.out
root@vissu-desktop:/home/vissu/Raveesh/Hadoop# 

现在我想运行我的应用程序,但是遇到了以下错误。

root@vissu-desktop:/home/vissu/Raveesh/Hadoop/hadoop-0.20.2# hadoop jar ResultAgg_plainjar.jar ProcessInputFile /home/vissu/Raveesh/VotingConfiguration/sample.txt 
ARG 0 obtained = ProcessInputFile
12/07/17 17:43:33 INFO preprocessing.ProcessInputFile: Modified File Name is /home/vissu/Raveesh/Hadoop/hadoop-0.20.2/sample.txt_modf
Going to process map reduce jobs
12/07/17 17:43:33 WARN mapred.JobClient: Use GenericOptionsParser for parsing the arguments. Applications should implement Tool for the same.
12/07/17 17:43:34 ERROR preprocessing.ProcessInputFile: Input path does not exist: hdfs://localhost/home/vissu/Raveesh/Hadoop/hadoop-0.20.2/sample.txt_modf
root@vissu-desktop:/home/vissu/Raveesh/Hadoop/hadoop-0.20.2#

该应用程序最初从路径中读取文件,然后修改它并创建一个名为sample.txt_modf的文件,该文件必须由map reduce框架使用。在独立模式下运行时,我已经给出了绝对路径,因此没有问题。但我无法确定在hadoop的Path api中应指定什么路径。如果我提供文件,则会添加hdfs:// localhost / ..所以我不确定如何在伪分布式模式下指定路径..是否应该确保修改后的文件在该位置创建..我的问题是如何提及路径..
包含路径的片段如下:
        KeyValueTextInputFormat.addInputPath(conf,
                new Path(System.getProperty("user.dir")+File.separator+inputFileofhits.getName()));
        FileOutputFormat.setOutputPath(
                conf,
                new Path(ProcessInputFile.resultAggProps
                        .getProperty("OUTPUT_DIRECTORY")));

谢谢

1个回答

5

这个文件是否存在于HDFS中?看起来你提供的是本地文件路径(在HDFS中,用户目录通常以/user为根目录,而不是/home)。

你可以通过输入以下命令来检查文件是否存在于HDFS中:

#> hadoop fs -ls hdfs://localhost/home/vissu/Raveesh/Hadoop/hadoop-0.20.2/sample.txt_modf

如果返回空值,则表示文件不在HDFS中,您可以使用hadoop fs命令将其复制到HDFS中:
#> hadoop fs -put /home/vissu/Raveesh/Hadoop/hadoop-0.20.2/sample.txt_modf hdfs://localhost/user/vissu/Raveesh/Hadoop/hadoop-0.20.2/sample.txt_modf

请注意,在HDFS中路径的根目录是/user,而不是/home。


嗨,谢谢。我还没有检查过那个。我该如何以编程的方式实现,使得每当修改后的文件生成时,它都会被放置在HDFS位置? - Raveesh Sharma
你可以在驱动程序代码中添加一些逻辑(创建和提交作业的地方)来检查/比较本地文件时间戳与HDFS中的时间戳,并在本地文件更新时进行替换。 - Chris White

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接