[英]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.