我试图运行一个简单的单词计数地图-减少作业在亚马逊的弹性地图减少,但输出是胡说八道。输入文件是普通爬行文件的一部分,这些文件是hadoop序列文件。该文件应该是从爬行的网页中提取的文本(从html中去掉)。
我的AWS弹性MapReduce步骤如下所示:
Mapper: s3://com.gpanterov.scripts/mapper.py
Reducer: s3://com.gpanterov.scripts/reducer.py
Input S3 location: s3://aws-publicdatasets/common-crawl/parse-output/segment/1341690169105/textData-00112
Output S3 location: s3://com.gpanterov.output/job3/作业成功运行,但输出却是胡说八道。只有奇怪的符号,根本就没有文字。我猜这是因为hadoop序列文件不能通过标准读取?但是,如何在这样的文件上运行job先生呢?我们必须先把序列文件转换成文本文件吗?
第00000部分的前几行如下所示:
'\x00\x00\x87\xa0 was found 1 times\t\n'
'\x00\x00\x8e\x01:\x1f\x8b\x08\x00\x00\x00\x00\x00\x00\x03\x05\xc1=K\x02\x01\x00\x80a\xf0\xbc\xf3N\xbd\x0f\xaf\x145\xcdJ!#T\x94\x88ZD\x89\x027i\x08\x8a\x86\x16\x97lp0\x02\x87 was found 1 times\t\n'这是我的地图:
#!/usr/bin/env python
import sys
for line in sys.stdin:
words = line.split()
for word in words:
print word + "\t" + str(1)我的减速机:
#!/usr/bin/env python
import sys
def output(previous_key, total):
if previous_key != None:
print previous_key + " was found " + str(total) + " times"
previous_key = None
total = 0
for line in sys.stdin:
key, value = line.split("\t", 1)
if key != previous_key:
output(previous_key, total)
previous_key = key
total = 0
total += int(value)
output(previous_key, total)输入文件没有任何问题。在本地机器上,我运行了hadoop fs -text textData-00112 | less,这会从网页中返回纯文本。任何关于如何在这些类型的输入文件(公共爬行hadoop序列文件)上运行python流mapreduce作业的输入都很受欢迎。
发布于 2014-01-19 11:06:39
您需要将SequenceFileAsTextInputFormat作为inputformat提供给hadoop流jar。
我从来没有使用过amazon,但是在正常的hadoop安装中会这样做:
HADOOP=$HADOOP_HOME/bin/hadoop
$HADOOP jar $HADOOP_HOME/contrib/streaming/hadoop-*-streaming.jar \
-input <input_directory>
-output <output_directory> \
-mapper "mapper.py" \
-reducer "reducer.py" \
-inputformat SequenceFileAsTextInputFormat发布于 2014-01-19 22:21:14
桑尼·南达的建议解决了这个问题。将-inputformat SequenceFileAsTextInputFormat添加到aws弹性mapreduce中的额外参数框中是有效的,作业的输出与预期的一样。
https://stackoverflow.com/questions/21214603
复制相似问题