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

Posted

技术标签:

【中文标题】Amazon EMR MapReduce 流程序因错误而终止【英文标题】:Amazon EMR MapReduce streaming program terminated with errors 【发布时间】:2019-05-03 18:45:05 【问题描述】:

我尝试使用 Hadoop 流运行“字数统计”mapReduce 程序。我的映射器代码是完美的。它在我的本地 Linux 机器和 Cloudera VM 上运行良好。但是当我使用 Amazon AWS EMR 时,它从未成功过。这只是几行代码,我不知道出了什么问题。

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

代码如下:

#!/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$2.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)
...

希望有人能帮忙,否则我不会再使用亚马逊了。

【问题讨论】:

问题不在于 Amazon EMR。这是另一回事。 【参考方案1】:

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

【讨论】:

另一件事可能是权限,请记住chmod a+x 对您需要的所有文件的权限。【参考方案2】:

问题是“聚合”reducer 期望键具有特定格式。具体尝试一下:

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

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

【讨论】:

以上是关于Amazon EMR MapReduce 流程序因错误而终止的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Amazon EMR 上的 pig 中使用 Python 流 UDF

mrjob 在 Amazon EMR 5.x 上不起作用,但在 EMR4.8.3 上运行

Amazon Elastic MapReduce - 从 S3 到 DynamoDB 的大量插入非常慢

AWS EMR 并行映射器?

如何在没有 Amazon GUI 的情况下在 Elastic MapReduce 上自动运行 Pig Batch 作业?

即使在引导程序中安装 pip 后,导入也无法在 Amazon EMR 中工作