簡體   English   中英

如何在s3中對數據進行分區以與hadoop配置單元一起使用?

[英]How should I partition data in s3 for use with hadoop hive?

我有一個s3存儲桶,其中包含大約300gb的日志文件,沒有特定順序。

我想使用日期時間戳對該數據進行分區以便在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,對reducer不返回任何內容,但這似乎會創建重復項。 (使用上面的示例,我在1月1日最終獲得250萬條目,而不是140萬)

有誰知道如何最好地解決這個問題?

為什么不基於此數據創建外部表,然后使用配置單元創建新表?

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對其進行更正。

如果Hadoop在任務跟蹤器中有空閑插槽,它將運行同一任務的多個副本。 如果您的輸出格式不能正確忽略產生的重復輸出鍵和值(S3可能是這種情況;我從未使用過),則應關閉推測性執行。 如果您的工作僅是地圖,請將mapred.map.tasks.speculative.execution設置為false。 如果您有減速器,請將mapred.reduce.tasks.speculative.execution設置為false。 查看Hadoop:權威指南 ,了解更多信息。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM