我正在尝试建立一个完全分布式的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个节点上运行相同的任务,导致每个节点上的本地输出文件(基于本地输入文件)?
谢谢
正如这个问题所指出的,这似乎是可能的。虽然我没有对此进行测试,但似乎可以将conf/core-site.xml
中的fs.default.name
设置为引用file
URL而不是HDFS URL。
一些参考文献:
- http://comments.gmane.org/gmane.comp.jakarta.lucene.hadoop.user/27100
- http://librarian.phys.washington.edu/athena/index.php/Running_Hadoop_on_Athena(这是指旧版本的Hadoop)。
这不是hadoop的解决方案,但你可以编写一个程序(比如Python),将多个进程分叉,ssh到每个从机并运行map reduce代码。
hadoop dfsadmin -report
列出集群中的ip。您可以让每个进程ssh到每个ip,并运行映射器和reducer。
*nix中的Map reduce可以使用管道实现。
cat <input> | c++ mapper | sort | c++ reducer > <output_location>