2010-12-15 3 views
1

私は、特定の順序で約300GBのログファイルを含むs3バケットを持っています。s3のデータを、hadoopハイブで使用するためにどのように分割する必要がありますか?

特定の日に関連するログラインが同じ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の場所にデータを出力する単一のスクリプトを実行するのが一番ですか?

ハープを使ってこれを行う良い方法があると思いますが、誰かがそれが何であるか教えてくれますか?

を私は減速のために何も返さない、S3に直接それらを書いた後、それぞれの日付のすべてのログエントリを集めマッパーに渡すことで、Hadoopのストリーミングを使用してみましたが、ことを私が試した何

重複を作成するように見えた。 (上記の例を使用すると、1.4millionの代わりにJan 1stの250万エントリになりました)

これに最も近づける方法はありますか?

答えて

0

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

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を参照して、それを修正する必要があるかもしれません。

関連する問題