mrjob确定是运行inline、local、emr还是hadoop

uqzxnwby  于 2021-05-29  发布在  Hadoop
关注(0)|答案(2)|浏览(451)

我是在几年前使用commoncrawl数据集和使用mrjob的emr的一些旧代码的基础上构建的。代码使用以下内部mrjob子类Map器函数来确定是在本地运行还是在emr上运行:

self.options.runner == 'emr'

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

3npbholx

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 远程运行时

w41d8nur

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的这个分支中。

相关问题