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

また、EMR でmrccモジュールをインポートするスクリプトを実行するときに問題があるようです。モジュールがImportError見つからないと言われました。

これを回避するには、実行したいコードの新しいファイルを作成し、インポートを実際のコードfrom mrcc import CCJobに置き換えてください。mrcc.pyこれは、cc-mrjob リポジトリのこのフォークに示されています。

于 2016-11-29T12:26:36.183 に答える
0

私は1つの解決策を見つけましたが、誰かがそれを知っていれば、まだ組み込みの解決策を探しています. 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また、リモートで実行する場合はパスする必要があります

于 2016-04-23T15:31:10.950 に答える