Я попытался запустить программу mapReduce «подсчет слов» с потоковой передачей Hadoop. Мой код для картографа идеален. Он отлично работает на моей локальной машине с Linux и на виртуальной машине Cloudera. Но когда я использую Amazon AWS EMR, это никогда не удавалось. Это всего лишь несколько строк кода, и я понятия не имею, что пошло не так.
Код на самом деле является примером кода от Яндекса через Coursera (курс Big Data, который я сейчас изучаю).
Вот код:
#!/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.