【发布时间】:2011-09-03 04:52:36
【问题描述】:
在我的映射器中,我想调用安装在 HDFS 之外的工作节点上的外部软件。这可能吗?最好的方法是什么?
我知道这可能会剥夺 MapReduce 的一些优势/可扩展性,但我想在 HDFS 中进行交互,并在我的映射器中调用已编译/安装的外部软件代码来处理一些数据。
【问题讨论】:
在我的映射器中,我想调用安装在 HDFS 之外的工作节点上的外部软件。这可能吗?最好的方法是什么?
我知道这可能会剥夺 MapReduce 的一些优势/可扩展性,但我想在 HDFS 中进行交互,并在我的映射器中调用已编译/安装的外部软件代码来处理一些数据。
【问题讨论】:
Mapper(和reducer)就像盒子上的任何其他进程一样——只要TaskTracker用户有权运行可执行文件,这样做没有问题。有几种方法可以调用外部进程,但由于我们已经使用 Java,ProcessBuilder 似乎是一个合乎逻辑的起点。
编辑:刚刚发现 Hadoop 有一个明确用于此目的的类:http://hadoop.apache.org/common/docs/current/api/org/apache/hadoop/util/Shell.html
【讨论】:
这当然是可行的。您可能会发现最好使用Hadoop Streaming。正如该网站上所说:
Hadoop 流是 Hadoop 发行版附带的实用程序。该实用程序允许您使用任何可执行文件或脚本作为映射器和/或减速器来创建和运行映射/缩减作业。
我倾向于从 Hadoop Streaming 内部的外部代码开始。根据您的语言,可能有很多很好的例子来说明如何在流式传输中使用它;一旦您进入您选择的语言,如果需要,您通常可以将数据输出到另一个程序。除了让外层与 Hadoop Streaming 一起工作之外,我已经让不同语言的几层程序运行得很好,而无需额外的努力,就像我在普通 Linux 机器上运行它一样。
【讨论】: