2010-12-15 39 views
1

我有一個s3存儲桶,其中包含大約300GB的日誌文件,沒有特別的順序。我應該如何分區s3中的數據以用於hadoop配置單元?

我想要使用日期時間戳將這些數據分區以便在hadoop-hive中使用,以便與特定日期相關的日誌行聚集在同一個s3「文件夾」中。例如,對於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來做到這一點,有人可以告訴我這是什麼嗎?

我已經試過:

我試圖通過傳遞所收集每個日期所有的日誌條目的映射器使用Hadoop的流然後寫那些直接到S3,在減速返回什麼,但似乎創造了重複。 (使用上面的例子,我結束了1月1日的250萬條目,而不是140萬)

有沒有人有任何想法如何最好的方法呢?

回答

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

相關問題