我试图使用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)
它期望将密钥与要执行的聚合类型的类型前缀,您看到的例外是因为它在内部未能找到":"字符。