在将控制权交还给用户之前,MRJob会一直等到每个作业完成。我将一个大的电子病历步骤分解为较小的步骤,并希望在一次拍摄中提交所有这些步骤。
文档谈到了programmatically submitting tasks,但示例代码也在等待作业完成(因为它们调用runner.run()命令,而这个命令是blocks until the job is complete)。
此外,EMR有256个活动作业的限制,然而,我们如何填充这256个作业,而不是在连接的控制台上循环并获取输出。
发布于 2016-04-26 19:59:52
经过几天的尝试,下面是我能想到的最好的。
我最初的尝试是(在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()
https://stackoverflow.com/questions/36874461
复制