1

我正在尝试建立一个完全分布式的 Hadoop/MapReduce 实例,其中每个节点将在某些输入上运行一系列 C++ Hadoop 流任务。但是我不想将所有输入任务移动到 HDFS 上——相反,我想看看是否有办法从每个节点的本地文件夹中读取输入数据。

有没有办法做到这一点?

编辑: 我想运行的 hadoop 命令示例类似于:

hadoop jar $HADOOP_STREAM/hadoop-streaming-0.20.203.0.jar \
            -mapper map_example \
            -input file:///data/ \
            -output /output/ \
            -reducer reducer_example \
            -file map_example \
            -file reducer_example 

在这种情况下,我每个节点中存储的数据都在 /data/ 目录中,我希望输出到每个单独节点的 /output/ 目录中。map_example 和 reducer_example 文件在所有节点本地可用。

我将如何实现一个 Hadoop 命令,如果它在主节点上运行,那么所有从节点基本上将在 x 个节点上运行相同的任务,从而在每个节点中生成一个本地输出文件(基于本地输入文件)?

谢谢

4

2 回答 2

1

正如这个问题所指出的,这似乎是可能的。尽管我没有对此进行测试,但您似乎可以设置fs.default.nameconf/core-site.xml引用fileURL 而不是 HDFS URL。

一些参考:

于 2011-11-21T01:49:07.900 回答
0

这不完全是一个 hadoop 解决方案,但您可以编写一个程序(比如 Python)来分叉多个进程,这些进程将 ssh 到每台从机并运行 map reduce 代码。

hadoop dfsadmin -report 允许您列出集群中的 ip。您可以使每个进程 ssh 进入每个 ips 并运行映射器和化简器。

*nix 中的 Map reduce 可以使用管道来实现。

cat <input> | c++ mapper | sort | c++ reducer > <output_location>

于 2014-05-08T05:37:49.403 回答