hive中如何控制mapper的数量
參考文檔:https://www.cnblogs.com/1130136248wlxk/articles/5352154.html
1. 決定map的數據的決定因素有:?input的文件總個數,input的文件大小,集群設置的文件塊大小(目前為128M, 可在hive中通過set dfs.block.size;命令查看到,該參數不能自定義修改);
2.是不是map數越多越好,如何減少?
a. 不是越多越好,多了會造成資源的浪費;因為map任務的啟動和初始化的時間,遠遠大于邏輯處理的時間;并且,map的數據是有限制的。
b. 可以通過set設置,讓map在執行前合并小文件,從而達到減少map數:
比如:??set mapred.max.split.size=100000000;?-- 決定每個map處理的最大的文件大小,單位為B
? ? ? ? ? ? ? ? ? ? ? ? set mapred.min.split.size.per.node=100000000;?-- 節點中可以處理的最小的文件大小
? ? ? ? ? ? ? ? ? ? ? ? set mapred.min.split.size.per.rack=100000000;?-- 機架中可以處理的最小的文件大小
? ? ? ? ? ? ? ? ? ? ? ? set hive.input.format=org.apache.hadoop.hive.ql.io.CombineHiveInputFormat;---實現map中的數據合并需要設置下面的參數,集群默認就是這個格式
3. 是不是每個map處理的接近128M的文件塊,就OK了呢? 如果不OK,如何增加map的數量?
a. 并不一定。當文件接近128M,但是里的內容卻非常多的時候并且map處理的邏輯比較復雜。那么用一個map處理,則時間會比較長
b. 把原來的單個文件拆分成多個的文件, 然后使用新的文件來執行sql。
set mapred.reduce.tasks=10;
? ?? ?? ?? ?? ?? ? create table a_1 as?
? ?? ?? ?? ?? ?? ? select * from a?
? ?? ?? ?? ?? ?? ? distribute by rand(123);
4. 控制map整體原則1:大數據量要利用合適的map數;單個map要處理合適的數據量 。 2:map占用資源要合并小文件;map不足要把大文件拆成小文件。
5.reduce簡單總結:
a.?有多少個reduce,就會有多少個輸出文件,如果生成了很多個小文件,那么如果這些小文件作為下一個任務的輸入,則也會出現小文件過多的問題;
b.什么情況下只有一個reduce:1. 沒有group by就進行count(1)。2.使用了order by。3.存在笛卡兒積。因為這些都是全局操作,生成一個文件,就只有1個reduce。
c. set mapred.reduce.tasks/set hive.exec.reducers.bytes.per.reducer=1073741824 -- 每個reduce處理的數據量,默認1GB
?
6. map數量一些深入的知識:
a. default_num = total_size/block_size,默認情況下map的個數
b.可以通過set mapred.map.tasks = goal_num?來設置期望的map個人,但是這個數量僅在大于default_num 的時候才會生效。
c. 可以通過set mapred.min.split.size來設置每個task的文件大小,但是這個數量在大于block_size的時候才會生效。
split_size = max(mapred.min.split.size,block_size); split_num = total_szie/split_size
d.
轉載于:https://www.cnblogs.com/chengdu-jackwu/p/10170895.html
總結
以上是生活随笔為你收集整理的hive中如何控制mapper的数量的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 有这10个特征的项目领导者做的项目,失败
- 下一篇: [转]LoadRunner 各个指标分析