Python Hadoop Mapper 输出为空

0 投票
1 回答
1161 浏览
提问于 2025-04-18 02:45

输入的文本是这样的,重复了无数次:

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

撰写回答