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 的大量插入非常慢
如何在没有 Amazon GUI 的情况下在 Elastic MapReduce 上自动运行 Pig Batch 作业?