0

我正在使用几年前使用 MRJob 的带有 EMR 的 commoncrawl 数据集构建一些旧代码。该代码使用以下 MRJob 子类映射器函数来确定是在本地运行还是在 emr 上运行:

self.options.runner == 'emr'

这似乎从未奏效或不再奏效, self.options.runner 没有传递给任务,因此始终设置为默认值'inline'. 问题是,有没有办法使用当前版本的 MRJob (v0.5.0) 确定代码是在本地运行还是在 emr 上运行。

4

2 回答 2

1

感谢 @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 存储库的这个分支中。

于 2016-11-29T12:26:36.183 回答
0

我找到了一个解决方案,但如果有人知道的话,我仍在寻找内置解决方案。您可以添加一个自定义传递选项,该选项将传递给您的任务,如下所示:

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并且远程运行时必须通过

于 2016-04-23T15:31:10.950 回答