数据架构
数据处理过程
案例
数据采集
数据存储
HDFS
-
read HDFS[1]
-
write HDFS[2]
数据计算
离线计算
MapReduce
-
2个reduce task 的数据流[3]
map size 公式 : max{ ${mapred.min.split.size},min(${dfs.block.size},${mapred.max.split.size})}
-
透视 MapReduce1 Job [4]
透视MapReduce on YARN[5]
实时计算
Storm
内存计算
Spark
Hive
hive 架构[6]<\sup>
hive常见问题总结
- 内存相关配置
set mapred.child.java.opts=-Xmx200m; #设置task启动的java虚拟机能够从操作系统那里挖到最大内存大小,建议为内存一半.
set mapreduce.task.io.sort.mb=573; #默认是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
- 数据倾斜
- group by
Group过程的数据倾斜,set hive.map.aggr=true
(默认开启),在map端完成聚合,来优化倾斜。也就是在mapper内部,做部分的聚合,来输出更少的行,减少需要排序和分发到reducer的数据量。
Hive在尝试做此优化,不过会判断aggregation的效果,如果不能节省足够的内存,就会退回标准map过程。也就是在处理了100000 行(hive.groupby.mapaggr.checkinterval
控制)后,检查内存中的hash map的项,如果超过50%(hive.map.aggr.hash.min.reduction
控制),则认为聚合会被终止。
Hive同样会估计hash map中每一项所需要的内存,当使用的内存超过了mapper可用内存的50%(hive.map.aggr.hash.percentmemory
控制),则会把flush此hash map到reducers。然而这是对行数和每行大小的估计,所以如果实际值过高,可能导致还没有flush就out of memory了。
当出现这种OOM时,可用减少hive.map.aggr.hash.percentmemory
, 但是这个对内存增长与行数无关的数据来说,不一定是有效的。这个时候,可以使用关闭以下方法,
- map端聚合
set hive.map.aggr=false
, - 给mapper分配更多的内存
- 重构query查询。利用子查询等方法,优化查询语句
select count(distinct v) from tbl
改写成
select count(1) from (select v from tbl group by v) t.
Group过程倾斜,还可以开启hive.groupby.skewindata=true
来改善,这个是让key随机分发到reducer,而不是同样的key分发到同一个reducer,然后reduce做聚合,做完之后再做一轮map-reduce。这个是把上面提到的map端聚合放到了reduce端,增加了reducer新的开销,大多数情况效果并不好。
- join
- map join可以解决大表join小表时候的数据倾斜
- skew join是hive中对数据倾斜的一个解决方案,
set hive.optimize.skewjoin = true
;
根据hive.skewjoin.key(默认100000)设置的数量hive可以知道超过这个值的key就是特殊key值。对于特殊的key,reduce过程直接跳过,最后再启用新的map-reduce过程来处理。
业务数据本身的倾斜,可以从业务数据特点本身出发,通过设置reduce数量等方式,来避免倾斜
- MapReduce实现基本SQL操作的原理
- Join的实现原理
- Group By的实现原理
- Distinct的实现原理
- SQL转化为MapReduce的过程
- Phase1 SQL词法,语法解析
- Phase2 SQL基本组成单元QueryBlock
- Phase3 逻辑操作符Operator
- Phase4 逻辑层优化器
- Phase5 OperatorTree生成MapReduce Job的过程
- Phase6 物理层优化器
- Hive SQL编译过程的设计