繁体   English   中英

MRJob确定是运行内联,本地,emr还是Hadoop

[英]MRJob determining if running inline, local, emr or hadoop

使用几年前的一些旧代码进行构建,将commoncrawl数据集与使用MRJob的EMR一起使用。 该代码使用以下内部MRJob子类映射器函数来确定是在本地运行还是在emr上运行:

self.options.runner == 'emr'

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

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

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

感谢@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']检查中的if self.options.runner in ['emr', 'hadoop'] ,可以保留原样,并且只需正常传递-r emr选项即可在EMR上运行。

另外,在EMR上运行导入mrcc模块的脚本时似乎存在问题。 我收到一个ImportError说找不到模块。

要解决此问题,您应该创建一个要运行的代码的新文件,并将from mrcc import CCJob import替换为实际的mrcc.py代码。 这在cc-mrjob存储库的此fork显示

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM