我是在几年前使用commoncrawl数据集和使用mrjob的emr的一些旧代码的基础上构建的。代码使用以下内部mrjob子类Map器函数来确定是在本地运行还是在emr上运行:
self.options.runner == 'emr'
这似乎从未起作用或不再起作用,self.options.runner不会传递给任务,因此始终设置为默认值 'inline' . 问题是,有没有办法确定代码是在本地运行还是在当前版本的mrjob(v0.5.0)的emr上运行。
'inline'
3npbholx1#
我已经找到了一个解决方案,但我仍然在寻找一个内置的解决方案,如果有人知道它。您可以添加一个自定义的passthrough选项来传递给您的任务,如下所示:
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 远程运行时
--platform remote
w41d8nur2#
感谢@pykler和@sebastian nagel发布这篇文章,因为尝试在amazon emr上使用常见的crawl python示例是一件令人头痛的事情。作为对@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'] 检查,可以保持原样,只需通过 -r emr 选项正常。另外,在emr上运行导入 mrcc 模块。我有一个 ImportError 说找不到模块。为了解决这个问题,您应该创建一个新的代码文件,其中包含要与 from mrcc import CCJob 导入替换为实际 mrcc.py 代码。这显示在cc mrjob repo的这个分支中。
if self.options.runner in ['emr', 'hadoop']
-r emr
mrcc
ImportError
from mrcc import CCJob
mrcc.py
2条答案
按热度按时间3npbholx1#
我已经找到了一个解决方案,但我仍然在寻找一个内置的解决方案,如果有人知道它。您可以添加一个自定义的passthrough选项来传递给您的任务,如下所示:
你必须通过
--platform remote
远程运行时w41d8nur2#
感谢@pykler和@sebastian nagel发布这篇文章,因为尝试在amazon emr上使用常见的crawl python示例是一件令人头痛的事情。
作为对@pykler发布的解决方案的回应,我相信有一种更为惯用的方式可以在这个pdf中看到:
然后是代码的其余部分,即
if self.options.runner in ['emr', 'hadoop']
检查,可以保持原样,只需通过-r emr
选项正常。另外,在emr上运行导入
mrcc
模块。我有一个ImportError
说找不到模块。为了解决这个问题,您应该创建一个新的代码文件,其中包含要与
from mrcc import CCJob
导入替换为实际mrcc.py
代码。这显示在cc mrjob repo的这个分支中。