将Python文件从S3导入Amazon Elastic MapReduce

时间:2018-12-05 19:00:29

标签: python amazon-web-services hadoop amazon-emr hadoop-streaming

我想在我的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.pyreducer.py的方式有错误。

0 个答案:

没有答案