私はEMRのニーズにmrjobを使用しています。
マッパーコードのロジックに応じて、マッパーから「個別のディレクトリ」にデータ(行)を書き込むにはどうすればよいですか。
targzipと
ジョブが突然終了/終了した後、(ディレクトリ名に応じて)個別のS3バケットにアップロードしますか?
''オプションでは、最終的なジョブ出力をそのディレクトリにアップロードすることしかできないと思い--output-dir
ますが、マッパーから他のディレクトリにも時々書き込みたいと思います。
私はEMRのニーズにmrjobを使用しています。
マッパーコードのロジックに応じて、マッパーから「個別のディレクトリ」にデータ(行)を書き込むにはどうすればよいですか。
targzipと
ジョブが突然終了/終了した後、(ディレクトリ名に応じて)個別のS3バケットにアップロードしますか?
''オプションでは、最終的なジョブ出力をそのディレクトリにアップロードすることしかできないと思い--output-dir
ますが、マッパーから他のディレクトリにも時々書き込みたいと思います。
Hadoop のMultipleOutput
機能が役立つと思います。カスタムでoutputFormat
は、パスとファイル名を指定できます。
カスタムJarを作成するアプローチに従い、OutputFormat
さまざまなフォルダー/ファイルで出力を多重化するためにカスタマイズすることができます。サブクラスを作成し、MultipleTextOutputFormat
その中のいくつかのメソッドをオーバーライドする必要があります(generateFileNameForKeyValue(Text key, Text value, String leaf)
主generateActualKey(Text key, Text value)
に)。
詳細については、こちらを参照してください:http: //www.infoq.com/articles/HadoopOutputFormat
いいえ、伝統的な意味ではできません。
理由: MrJob は、Hadoop クラスターで実行する場合、Hadoop ストリーミングを内部的に使用して map/reduce ジョブを実行します。これは、Amazon Elastic M/R と Hadoop クラスターの場合と同じであると想定しています。
--output-dir
実際には、レデューサーの出力が収集される場所を指定する Hadoop ストリーミングへの入力です。このメカニズムを使用して、データを異なるフォルダーに分離することはできません。
[編集:コメントに応じて]
私の理解では、boto は Amazon サービスに接続し、ec2 や s3 などにアクセスするためのライブラリにすぎません。
非伝統的な意味では、別のディレクトリに書き込むことができると思います。
私はこのアイデアをテストしておらず、このアプローチはお勧めしません。これは、ファイルを開いてレデューサー内で直接書き込むようなものです。理論的には、それを行うことができます。レデューサーの出力を std.out に書き込むだけではありません。S3 オブジェクトを直接開いて書き込むことができます。複数のレデューサーを生成するため、異なるファイルを開くことを確認する必要があります。
これは、Hadoop クラスターで MrJob を使用しているときに学んだことです: http://pyfunc.blogspot.com/2012/05/hadoop-map-reduce-with-mrjob.html