2016-04-23 50 views
0

我是building on some old code from a few years back using the commoncrawl dataset與EMR使用MRJob。該代碼使用下列內MRJob子類映射函數來確定是否在本地或EMR運行:MRJob確定是否在線,本地,emr或hadoop運行

self.options.runner == 'emr' 

這似乎無論是從來沒有工作過或不再工作,self.options.runner不通過該任務通過因此始終設置爲默認值'inline'。問題是,有沒有一種方法可以確定代碼是在當前版本的MRJob(v0.5.0)的本地運行還是在emr上運行。

+0

得到了同樣的錯誤。該問題現在在https://github.com/commoncrawl/cc-mrjob/issues/7進行跟蹤 –

回答

0

我找到了一個解決方案,但如果有人知道它,我仍然在尋找一個內置解決方案。 You can add a custom passthrough option that gets passed to your tasks,它看起來像這樣:

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遠程運行

0

當謝謝@pykler和@塞巴斯蒂安 - 納格爾張貼關於這一點,因爲試圖讓公共抓取的Python在亞馬遜EMR上工作的例子令人頭疼。

針對@pykler張貼的解決方案,我相信有這shown in this 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模塊的EMR上運行腳本時似乎存在問題。我得到一個ImportError說模塊找不到。

爲了解決這個問題,你應該創建一個你想運行的代碼的新文件,用from mrcc import CCJob導入替換爲實際的mrcc.py代碼。這是cc-mrjob回購的shown in this fork

相關問題