1

約 300 GB のログ ファイルを順不同で含む s3 バケットがあります。

特定の日に関連するログ行が同じ s3 'フォルダ' にまとめられるように、日時スタンプを使用して hadoop-hive で使用するためにこのデータを分割したいと考えています。たとえば、1 月 1 日のログ エントリは、次の名前に一致するファイルに含まれます。

s3://bucket1/partitions/created_date=2010-01-01/file1
s3://bucket1/partitions/created_date=2010-01-01/file2
s3://bucket1/partitions/created_date=2010-01-01/file3

データを変換するための最良の方法は何ですか? 一度に各ファイルを読み取り、適切な s3 の場所にデータを出力する単一のスクリプトを実行するのが最善でしょうか?

Hadoop を使用してこれを行う良い方法があると確信しています。誰か教えてもらえますか?

私が試したこと:

各日付のすべてのログエントリを収集し、それらを直接 S3 に書き込み、リデューサーには何も返さないマッパーを渡して、hadoop-streaming を使用しようとしましたが、重複が作成されたようです。(上記の例を使用すると、1 月 1 日のエントリ数は 140 万ではなく 250 万になりました)

これにどのようにアプローチするのが最善か、誰にもアイデアがありますか?

4

2 に答える 2

0

このデータに対して外部テーブルを作成してから、ハイブを使用して新しいテーブルを作成してみませんか?

create table partitioned (some_field string, timestamp string, created_date date) partition(created_date);
insert overwrite partitioned partition(created_date) as select some_field, timestamp, date(timestamp) from orig_external_table;

実際、私は構文を調べていないので、 https://cwiki.apache.org/confluence/display/Hive/LanguageManual+DML#LanguageManualDML-InsertingdataintoHiveTablesfromqueriesを参照して修正する必要があるかもしれません。

于 2016-05-19T03:22:59.257 に答える
0

Hadoop のタスク トラッカーに空きスロットがある場合、Hadoop は同じタスクの複数のコピーを実行します。出力形式が、結果として生じる重複した出力キーと値を適切に無視しない場合 (これは S3 の場合である可能性があります。私は使用したことがありません)、投機的実行をオフにする必要があります。ジョブがマップのみの場合は、mapred.map.tasks.speculative.executionfalse に設定します。レデューサーがある場合は、mapred.reduce.tasks.speculative.executionfalse に設定します。詳細については、 Hadoop: The Definitive Guideをご覧ください。

于 2010-12-18T02:44:24.437 に答える