当前版本的hadoop流需要一个用于组合器的Java类,但我在某个地方读到,我们可以使用如下破解:
hadoop jar ./contrib/streaming/hadoop-0.20.2-streaming.jar -input /testinput -output /testoutput -mapper "python /code/triples-mapper.py | sort | python /code/triples-reducer.py" -reducer /code/triples-reducer.py
然而,这似乎并不奏效。我做错了什么?
我怀疑您的问题在于以下来源:
http://svn.apache.org/viewvc/hadoop/common/tags/release-0.20.2/src/contrib/streaming/src/java/org/apache/hadoop/streaming/PipeMapRed.java?view=markup
第69行splitArgs()
方法,它正在标记您传递的命令:
python /code/triples-mapper.py | sort | python /code/triples-reducer.py
转换为要运行的命令:/code/triples-mapper.py
(第131/132行),然后是一组要传入的参数。所有令牌都传递给ProcessBuilder(第164行)
用于ProcessBuilder 的Java Api
因此,操作系统不会解释您的管道,而是将其作为参数传递给映射程序(您应该能够通过转储映射程序代码中传递的参数来确认这一点)
这是0.20.2的全部内容,因此可能已经"修复",以满足您在hadoop的后续版本中的目的。