使用MRJob将作业提交到EMR群集

时间:2016-04-26 19:50:58

标签: python hadoop emr mrjob

MRJob等待每个作业完成,然后再向用户提供控制权。我将大型EMR步骤分解为较小的一步,并希望一次性提交它们。

文档讨论programmatically submitting tasks,但示例代码也等待作业完成(因为他们调用了blocks until the job is complete)的runner.run()命令。

此外,EMR还有256个Active作业的限制,但是,我们如何填充这256个作业,而不是在连接的控制台上循环并获取输出。

1 个答案:

答案 0 :(得分:0)

经过几天的努力,以下是我能想到的最好成绩。

我的初始尝试,当我意识到当终端分离时提交的作业没有被剔除时,是(在bash脚本中)提交并终止作业。但是,这并没有很好地发挥作用,因为AWS限制了对EMR的调用,因此一些工作在提交之前被杀死了。

当前最佳解决方案

from jobs import MyMRJob
import logging

logging.basicConfig(
    level=logging.INFO,
    format = '%(asctime)-15s %(levelname)-8s %(message)s',
)
log = logging.getLogger('submitjobs')

def main():
    cluster_id="x-MXMXMX"
    log.info('Cluster: %s', cluster_id)
    for i in range(10):
        n = '%04d' % i
        log.info('Adding job: %s', n)
        mr_job = MyMRJob(args=[
            '-r', 'emr',
            '--conf-path', 'mrjob.conf',
            '--no-output',
            '--output-dir', 's3://mybucket/mrjob/%s' % n,
            '--cluster-id', cluster_id,
            'input/file.%s' % n
    ])
    runner = mr_job.make_runner()
    # the following is the secret sauce, submits the job and returns
    # it is a private method though, so may be changed without notice
    runner._launch()

if __name__ == '__main__':
    main()