第十章 Hive調優 【合理設置Map數】


1. 合理設置Map數
1. MapTask任務數決定因素:
1. 文件個數
2. 文件大小
3. 集群設置的文件塊大小
4. 指定的 切片大小
5. 處理文件的inputfor的實現類

2. 切片個數 = MapTask個數
1. 確定 InputFormat的實現類
hive中主要使用 :
HiveInputFormat :
1. 無論文件大小,對每個文件進行切分
2. 切片個數=文件大小/切片大小
3. 當文件大小 小於切片大小時,此文件做單獨作為一個切片
實際切片 <= 設置切片大小
CombineHiveInputFormat :
1. 按照切片大小,對文件切分
2. 切片個數=文件大小/切片大小
3. 當文件大小 小於切片大小時,會將多個小文件合並從一個切片
實際切片 >= 設置切片大小

3. 思考 : 是不是map數越多越好?
不是
1. 當小文件過多時(遠遠小於塊128M大小),每個文件都會啟動一個mapTask,每個mapTask都會消耗一個CPU
2. 每個mapTask啟動時間 遠大於 數據處理時間,浪費資源

4. 思考 : 是不是保證每個map處理接近128M的文件塊,就可以了?
不是
1. 當單個文件(128M)只有一個或者2個字段時,卻有幾千萬行,mapTask的處理邏輯又比較復雜
此時一個map去處理,會比較耗時,需要將一個map拆分成多個map,並行處理
注意 :
解決2、3問題,可以通過 減少map或者增加map數

5. 設置 切片大小 (通過改變切片大小,改變map個數)
1. 通過控制 maxsize、minsize 設置切片大小
切片大小 = computeSliteSize(Math.max(minSize,Math.min(maxSize,blocksize)))
minSize : 1(默認)
maxsize=256000000(默認 244M)
blocksize=128M
注意 : 默認情況 切片大小 = block大小
-- 設置block大小(128M)
set dfs.block.size=134217728;

2. 設置 maxsize、minsize 大小
            -- 設置 maxsize(默認256000000=244M)
            set mapreduce.input.fileinputformat.split.maxsize=256000000; -- 設置 minsize(默認1)
            set mapreduce.input.fileinputformat.split.minsize=1; -- 同時(設置一個即可)
            set mapred.max.split.size=256000000; set mapred.min.split.size=1;
6.測試 (通過調整 切片大小來改變MapTask個數)
-- 測試1 : 文件個數1、文件大小34.8、inputformat類CombineHiveInputFormat、切片大小128M
-- 預期 : 生成一個切片=一個MapTask
-- 測試1 : 文件個數1、文件大小34.8、inputformat類CombineHiveInputFormat、切片大小128M -- 預期 : 生成一個切片=一個MapTask
34.8 M  104.4 M  /user/hive/warehouse/home.db/gulivideo_user_ori/user.txt set mapreduce.input.fileinputformat.split.maxsize=256000000; select substr(uploader,0,1) ,count(1) from gulivideo_user_ori group by substr(uploader,0,1); Hadoop job information for Stage-1: number of mappers: 1; number of reducers: 1 Time taken: 10.86 seconds, Fetched: 62 row(s)
-- 設置切片大小為 10M=10485760 Bytes
-- 測試2 : 文件個數1、文件大小34.8、inputformat類CombineHiveInputFormat、切片大小10M
-- 預期 : 切片個數=34.8/10=3個
-- 設置切片大小為 10M=10485760 Bytes -- 測試2 : 文件個數1、文件大小34.8、inputformat類CombineHiveInputFormat、切片大小10M -- 預期 : 切片個數=34.8/10=3個
set mapreduce.input.fileinputformat.split.maxsize=10485760; select substr(uploader,0,1) ,count(1) from gulivideo_user_ori group by substr(uploader,0,1); Hadoop job information for Stage-1: number of mappers: 3; number of reducers: 1 Time taken: 11.762 seconds, Fetched: 62 row(s)
7. 思考 : 什么時候需要調整 切片大小?(改變MapTask個數)
1. 生成切片個數少且map邏輯復雜時,需要將MapTask任務拆分





免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM