我想在我的mapreduce中包括已编译的原型类,并且想出这样做的最简单方法是将所需的python文件压缩为tar.gz并将它们上传到S3。
我遇到了this stackoverflow answer,并按照以下步骤创建了存档文件。然后,我使用-cacheArchive
参数将文件分发到群集。
在这里使用boto启动EMR作业是我的配置:
Steps=[{
'Name': '...',
'ActionOnFailure': 'TERMINATE_CLUSTER',
'HadoopJarStep': {
'Jar': 'command-runner.jar',
'Args':
['hadoop-streaming',
'-files', 's3://myBucket/mapper.py,'
's3://myBucket/reducer.py',
'-mapper', 'mapper.py',
'-input', 's3://myBucket/input/',
'-output', 's3://myBucket/output',
'-reducer', 'reducer.py',
'-cacheArchive', 's3://myBucket/required.tgz#required']
}
}]
mapper.py
#!/usr/bin/env python
import sys
sys.path.append('./required')
from primitives_pb2 import Variant
for line in sys.stdin:
# DO THINGS
EMR时出现以下错误。
错误:java.lang.RuntimeException:PipeMapRed.waitOutputThreads():子进程失败,代码为1 在org.apache.hadoop.streaming.PipeMapRed.waitOutputThreads(PipeMapRed.java:332) 在org.apache.hadoop.streaming.PipeMapRed.mapRedFinished(PipeMapRed.java:545) 在org.apache.hadoop.streaming.PipeMapper.close(PipeMapper.java:130) 在org.apache.hadoop.mapred.MapRunner.run(MapRunner.java:81) 在org.apache.hadoop.streaming.PipeMapRunner.run(PipeMapRunner.java:34) 在org.apache.hadoop.mapred.MapTask.runOldMapper(MapTask.java:452) 在org.apache.hadoop.mapred.MapTask.run(MapTask.java:344) 在org.apache.hadoop.mapred.YarnChild $ 2.run(YarnChild.java:171) 在java.security.AccessController.doPrivileged(本机方法) 在javax.security.auth.Subject.doAs(Subject.java:415) 在org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1628) 在org.apache.hadoop.mapred.YarnChild.main(YarnChild.java:166)
在本地运行时,mapreduce似乎可以正常工作,所以我不认为我写mapper.py
或reducer.py
的方式有错误。