有幾個方法,你可以去分割蜂巢輸出。第一個也是最簡單的方法是設置減速器的數量。由於每個寫操作都減少了對其自己的輸出文件的寫操作,因此您指定的還原器的數量將與寫入的輸出文件的數量相對應。請注意,某些Hive查詢不會導致您指定的reducer數量(例如,SELECT COUNT(*) FROM some_table
總是導致一個reducer)。要指定減速的數量查詢之前運行此:
set mapred.reduce.tasks=10
你可以拆分成多個輸出文件的另一種方法是將有蜂巢插入您的查詢的結果到分區表。這會導致每個分區至少有一個文件。爲了有意義,你必須有一些合理的分欄。例如,您不希望在唯一的ID列上進行分區,或者每個記錄都有一個文件。這種方法至少可以保證每個分區的輸出文件,並且至多可以保證numPartitions * numReducers
。這裏有一個例子(不要太擔心hive.exec.dynamic.partition.mode
,它需要設置爲這個查詢工作)。
hive.exec.dynamic.partition.mode=nonstrict
CREATE TABLE table_to_export_to_redshift (
id INT,
value INT
)
PARTITIONED BY (country STRING)
INSERT OVERWRITE TABLE table_to_export_to_redshift
PARTITION (country)
SELECT id, value, country
FROM some_table
爲了獲得更好的粒度控制,您可以編寫自己的reduce腳本傳遞給配置單元,並將腳本寫入多個文件。一旦你編寫自己的reducer,你可以做任何你想做的事情。
最後,您可以放棄嘗試操縱Hive來輸出所需數量的文件,並在Hive完成後將它們分開。默認情況下,Hive將其表格解壓縮並以純文本格式存儲在倉庫目錄中(例如,/apps/hive/warehouse/table_to_export_to_redshift
)。您可以使用Hadoop shell命令,MapReduce作業Pig,或將它們拉入Linux並按照您的喜好將它們分開。
我對Redshift沒有任何經驗,所以我的一些建議可能不適合Redshift在任何情況下使用。
一些注意事項:將文件拆分成更多,更小的文件通常對Hadoop不利。 Redshift的速度可能會提高,但如果文件被Hadoop生態系統的其他部分(MapReduce,Hive,Pig等)佔用,如果文件太小(儘管1GB會好),您可能會看到性能下降, 。還要確保額外的處理/開發人員時間值得您節省並行Redshift數據加載時間。
太棒了,謝謝 – 2013-05-09 00:15:07
你的例子沒有做任何分區。 「CREATE TABLE」和「INSERT OVERWRITE」命令都需要指定要使用的分區。 – libjack 2013-05-09 17:15:56
@libjack感謝您的支持。固定在上面。 – 2013-05-09 17:45:09