我正在使用几年前使用 MRJob 的带有 EMR 的 commoncrawl 数据集构建一些旧代码。该代码使用以下 MRJob 子类映射器函数来确定是在本地运行还是在 emr 上运行:
self.options.runner == 'emr'
这似乎从未奏效或不再奏效, self.options.runner 没有传递给任务,因此始终设置为默认值'inline'
. 问题是,有没有办法使用当前版本的 MRJob (v0.5.0) 确定代码是在本地运行还是在 emr 上运行。
我正在使用几年前使用 MRJob 的带有 EMR 的 commoncrawl 数据集构建一些旧代码。该代码使用以下 MRJob 子类映射器函数来确定是在本地运行还是在 emr 上运行:
self.options.runner == 'emr'
这似乎从未奏效或不再奏效, self.options.runner 没有传递给任务,因此始终设置为默认值'inline'
. 问题是,有没有办法使用当前版本的 MRJob (v0.5.0) 确定代码是在本地运行还是在 emr 上运行。
感谢 @pykler 和 @sebastian-nagel 发布有关此问题的信息,因为试图让 Common Crawl Python 示例在 Amazon EMR 上运行一直很头疼。
作为对@pykler 发布的解决方案的回应,我相信此 PDF 中显示了一种更惯用的方式:
class CCJob(MRJob):
def configure_options(self):
super(CCJob, self).configure_options()
self.pass_through_option('--runner')
self.pass_through_option('-r')
然后剩下的代码,即if self.options.runner in ['emr', 'hadoop']
检查,可以保持原样,它应该在 EMR 上工作,只需-r emr
像往常一样传递选项。
mrcc
此外,在导入模块的 EMR 上运行脚本时似乎存在问题。我得到一个ImportError
说找不到模块。
为了解决这个问题,您应该创建一个要运行的代码的新文件,并将from mrcc import CCJob
导入替换为实际mrcc.py
代码。这显示在cc-mrjob 存储库的这个分支中。
我找到了一个解决方案,但如果有人知道的话,我仍在寻找内置解决方案。您可以添加一个自定义传递选项,该选项将传递给您的任务,如下所示:
class CCJob(MRJob):
def configure_options(self):
super(CCJob, self).configure_options()
self.add_passthrough_option(
'--platform', default='local', choices=['local', 'remote'],
help="indicate running remotely")
def mapper(self, _, line):
if self.options.platform == 'remote':
pass
--platform remote
并且远程运行时必须通过