Amazon EMR MapReduce 流程序因错误而终止

Amazon EMR MapReduce streaming program terminated with errors

我尝试 运行 "word count" 带有 Hadoop 流的 mapReduce 程序。我的映射器代码是完美的。它在我的本地 Linux 机器和 Cloudera VM 上运行良好。但是当我使用 Amazon AWS EMR 时,它从未成功过。这只是几行代码,我不知道哪里出了问题。

该代码实际上是通过Coursera(我现在正在学习的大数据课程)从Yandex 获得的示例代码。

代码如下:

#!/usr/bin/python
import sys
import re

reload(sys)
sys.setdefaultencoding('utf-8')

for line in sys.stdin:
    try:
        article_id, text = unicode(line.strip()).split('\t', 1)
    except ValueError as e:
        continue
    text = re.sub("^\W+|\W+$", "", text, flags=re.UNICODE)
    words = re.split("\W*\s+\W*", text, flags=re.UNICODE)   
    for word in words:
        print "%s\t%d" % (word.lower(), 1)

这是由 EMR 生成的:

hadoop-streaming -files s3://doc-sim/Python2code/word_count_test.py \ 
-mapper "word_count_test.py" \
-reducer aggregate \
-input s3://doc-sim/datasets/articles-part.txt \
-output s3://doc-sim/results/output2/

我不断从 AWS EMR 收到此错误:

Error: java.lang.StringIndexOutOfBoundsException: String index out of range: -1
    at java.lang.String.substring(String.java:1967)
    at org.apache.hadoop.mapred.lib.aggregate.ValueAggregatorCombiner.reduce(ValueAggregatorCombiner.java:59)
    at org.apache.hadoop.mapred.lib.aggregate.ValueAggregatorCombiner.reduce(ValueAggregatorCombiner.java:36)
    at org.apache.hadoop.mapred.Task$OldCombinerRunner.combine(Task.java:1702)
    at org.apache.hadoop.mapred.MapTask$MapOutputBuffer.sortAndSpill(MapTask.java:1657)
    at org.apache.hadoop.mapred.MapTask$MapOutputBuffer.flush(MapTask.java:1509)
    at org.apache.hadoop.mapred.MapTask.runOldMapper(MapTask.java:463)
    at org.apache.hadoop.mapred.MapTask.run(MapTask.java:344)
    at org.apache.hadoop.mapred.YarnChild.run(YarnChild.java:175)
    at java.security.AccessController.doPrivileged(Native Method)
    at javax.security.auth.Subject.doAs(Subject.java:422)
    at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1844)
    at org.apache.hadoop.mapred.YarnChild.main(YarnChild.java:169)
...

希望有人能帮帮我,不然我不会再用亚马逊了。

我觉得是reducer的问题。您似乎没有指定减速器,因此,尝试删除此行 -reducer aggregate。请记住,您使用的是 hadoop 流式处理,您应该指明所有映射器和缩减器。另一件事是您正在使用 " 向映射器发送短信。请删除它,您不需要以这种方式指定,只需 word_count_test.py.

问题是 'aggregate' reducer 期望键具有特定格式。具体尝试:

        print "LongValueSum:%s\t%d" % (word.lower(), 1)

它希望键以要执行的聚合类型为前缀,您看到的异常是因为它在内部找不到“:”字符。