Python Hadoop Mapper 输出为空
输入的文本是这样的,重复了无数次:
value1 | foo="bar" value2 | value3
我用Python写了一个基本的映射器,用于一个简单的流处理任务:
#!/usr/bin/env python
import sys
for line in sys.stdin:
line = line.replace('foo=','')
line = line.replace('"','') # kills double-quotes
print line
# alternatively, I have tried print >>sys.stdout, line
我这样运行这个任务;它没有报错,但输出文件是空的:
bin/hadoop jar contrib/streaming/hadoop-streaming.jar -file ~/mapper1.py -mapper mapper1.py -input hdfs:///rawdata/0208head.txt -output hdfs:///rawdata/clean0208.txt
我原以为不需要映射器,直接打印就能输出到文件里。现在我怀疑打印命令只是把输出放到了每个Java虚拟机的内存里,如果没有明确的方法把它写回去,最后就消失在虚拟机里了。
我写了一个基本的归约器,它只是把sys.stdin的内容打印到sys.stdout,就像上面提到的“#alternatively”。但这也没有成功。
非常欢迎任何指导。谢谢!
1 个回答
0
我按照以下步骤来执行 Hadoop 流处理任务:
1) 首先,我创建了一个叫做 head.txt
的文本文件,里面包含了你提到的那一行内容。
value1 | foo="bar" value2 | value3
2) 然后,我保存了这个文件,并使用以下命令把它放到了 HDFS 中:
hadoop fs -put /head.txt /head.txt
3) 我把你的 Python 代码复制粘贴到了 mapper.py
文件中,保存后也把它上传到了 HDFS:
hadoop fs -put /mapper.py /mapper.py
4) 最后,我执行了下面的 Hadoop 流处理命令:
hadoop jar /opt/hadoop/lib/hadoop-streaming-1.0.3.jar -D mapred.reduce.tasks=0 -file /mapper.py -mapper mapper.py -input /head.txt -output /out.txt
/opt/hadoop/lib/
是我的 Hadoop 库路径。你可以在这里添加你的路径。如果你在 .bashrc
文件中设置了 HADOOP_HOME
,那么就不需要再提到 bin/hadoop
了。
否则,你可以写 bin/hadoop
来执行这个任务。
这肯定能对你有帮助。我在 out.txt
文件中得到了以下输出。
value1 | bar value2 | value3