亚马逊EMR MAPREDUCE流媒体程序以错误终止



我试图使用Hadoop流运行" Word Count" 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 "%st%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)
...

我希望有人可以提供帮助,否则我不会再使用亚马逊了。

我认为问题是还原器。您似乎没有指定还原器,因此,尝试删除此行-reducer aggregate。请记住,您正在使用Hadoop流媒体,您应该指出所有映射器和还原器。另一件事是您用"发短信给映射器。请删除它,您不需要以这种方式指定,只有word_count_test.py

问题是'聚合'还原器期望密钥具有特定格式。专门尝试:

        print "LongValueSum:%st%d" % (word.lower(), 1)

它期望将密钥与要执行的聚合类型的类型前缀,您看到的例外是因为它在内部未能找到":"字符。

最新更新