在我的映射器中,我想调用安装在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发行版附带的一个实用程序。该实用程序允许您创建和运行map/reduce作业,使用任何可执行文件或脚本作为映射器和/或reducer。
我倾向于从Hadoop Streaming内部的外部代码开始。根据你的语言,可能有很多关于如何在流媒体中使用它的好例子;一旦了解了所选择的语言,如果需要,通常可以将数据输送到另一个程序。除了让外层与Hadoop Streaming一起工作之外,我已经使用不同语言的几层程序运行得很好,没有额外的努力,如果我在普通的Linux机器上运行它。