數(shù)據(jù)架構(gòu)
數(shù)據(jù)處理過程
案例
數(shù)據(jù)采集
數(shù)據(jù)存儲(chǔ)
HDFS
-
read HDFS[1]
-
write HDFS[2]
數(shù)據(jù)計(jì)算
離線計(jì)算
MapReduce
-
2個(gè)reduce task 的數(shù)據(jù)流[3]
map size 公式 : max{ ${mapred.min.split.size},min(${dfs.block.size},${mapred.max.split.size})}
-
透視 MapReduce1 Job [4]
透視MapReduce on YARN[5]
實(shí)時(shí)計(jì)算
Storm
內(nèi)存計(jì)算
Spark
Hive
hive 架構(gòu)[6]<\sup>
hive常見問題總結(jié)
- 內(nèi)存相關(guān)配置
set mapred.child.java.opts=-Xmx200m; #設(shè)置task啟動(dòng)的java虛擬機(jī)能夠從操作系統(tǒng)那里挖到最大內(nèi)存大小,建議為內(nèi)存一半.
set mapreduce.task.io.sort.mb=573; #默認(rèn)是100
set mapred.child.java.opts -Xmx200m;
set mapreduce.map.java.opts -Xmx1024m
set mapreduce.reduce.java.opts -Xmx1228m
set mapreduce.task.io.sort.mb=950
--------------
mapreduce.map.memory.mb 1024
mapreduce.reduce.memory.mb 1536
yarn.nodemanager.resource.memory-mb 153600
yarn.app.mapreduce.am.resource.mb 896
- 數(shù)據(jù)傾斜
- group by
Group過程的數(shù)據(jù)傾斜对竣,set hive.map.aggr=true
(默認(rèn)開啟)免绿,在map端完成聚合辅愿,來優(yōu)化傾斜。也就是在mapper內(nèi)部,做部分的聚合恰画,來輸出更少的行辙纬,減少需要排序和分發(fā)到reducer的數(shù)據(jù)量。
Hive在嘗試做此優(yōu)化廊佩,不過會(huì)判斷aggregation的效果囚聚,如果不能節(jié)省足夠的內(nèi)存,就會(huì)退回標(biāo)準(zhǔn)map過程标锄。也就是在處理了100000 行(hive.groupby.mapaggr.checkinterval
控制)后顽铸,檢查內(nèi)存中的hash map的項(xiàng),如果超過50%(hive.map.aggr.hash.min.reduction
控制)料皇,則認(rèn)為聚合會(huì)被終止谓松。
Hive同樣會(huì)估計(jì)hash map中每一項(xiàng)所需要的內(nèi)存,當(dāng)使用的內(nèi)存超過了mapper可用內(nèi)存的50%(hive.map.aggr.hash.percentmemory
控制)践剂,則會(huì)把flush此hash map到reducers鬼譬。然而這是對(duì)行數(shù)和每行大小的估計(jì),所以如果實(shí)際值過高逊脯,可能導(dǎo)致還沒有flush就out of memory了优质。
當(dāng)出現(xiàn)這種OOM時(shí),可用減少hive.map.aggr.hash.percentmemory
军洼, 但是這個(gè)對(duì)內(nèi)存增長與行數(shù)無關(guān)的數(shù)據(jù)來說巩螃,不一定是有效的。這個(gè)時(shí)候匕争,可以使用關(guān)閉以下方法避乏,
- map端聚合
set hive.map.aggr=false
, - 給mapper分配更多的內(nèi)存
- 重構(gòu)query查詢甘桑。利用子查詢等方法拍皮,優(yōu)化查詢語句
select count(distinct v) from tbl
改寫成
select count(1) from (select v from tbl group by v) t.
Group過程傾斜歹叮,還可以開啟hive.groupby.skewindata=true
來改善,這個(gè)是讓key隨機(jī)分發(fā)到reducer春缕,而不是同樣的key分發(fā)到同一個(gè)reducer盗胀,然后reduce做聚合,做完之后再做一輪map-reduce锄贼。這個(gè)是把上面提到的map端聚合放到了reduce端票灰,增加了reducer新的開銷,大多數(shù)情況效果并不好宅荤。
- join
- map join可以解決大表join小表時(shí)候的數(shù)據(jù)傾斜
- skew join是hive中對(duì)數(shù)據(jù)傾斜的一個(gè)解決方案屑迂,
set hive.optimize.skewjoin = true
;
根據(jù)hive.skewjoin.key(默認(rèn)100000)設(shè)置的數(shù)量hive可以知道超過這個(gè)值的key就是特殊key值。對(duì)于特殊的key冯键,reduce過程直接跳過惹盼,最后再啟用新的map-reduce過程來處理。
業(yè)務(wù)數(shù)據(jù)本身的傾斜惫确,可以從業(yè)務(wù)數(shù)據(jù)特點(diǎn)本身出發(fā)手报,通過設(shè)置reduce數(shù)量等方式,來避免傾斜
- MapReduce實(shí)現(xiàn)基本SQL操作的原理
- Join的實(shí)現(xiàn)原理
- Group By的實(shí)現(xiàn)原理
- Distinct的實(shí)現(xiàn)原理
- SQL轉(zhuǎn)化為MapReduce的過程
- Phase1 SQL詞法改化,語法解析
- Phase2 SQL基本組成單元QueryBlock
- Phase3 邏輯操作符Operator
- Phase4 邏輯層優(yōu)化器
- Phase5 OperatorTree生成MapReduce Job的過程
- Phase6 物理層優(yōu)化器
- Hive SQL編譯過程的設(shè)計(jì)