美文网首页
图解数据

图解数据

作者: 旺达丨 | 来源:发表于2017-04-07 11:51 被阅读0次

    数据架构

    数据处理过程

    案例

    数据采集

    数据存储

    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, 但是这个对内存增长与行数无关的数据来说,不一定是有效的。这个时候,可以使用关闭以下方法,
    1. map端聚合set hive.map.aggr=false
    2. 给mapper分配更多的内存
    3. 重构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
    1. map join可以解决大表join小表时候的数据倾斜
    2. skew join是hive中对数据倾斜的一个解决方案,set hive.optimize.skewjoin = true;
      根据hive.skewjoin.key(默认100000)设置的数量hive可以知道超过这个值的key就是特殊key值。对于特殊的key,reduce过程直接跳过,最后再启用新的map-reduce过程来处理。
      业务数据本身的倾斜,可以从业务数据特点本身出发,通过设置reduce数量等方式,来避免倾斜

    Hive SQL编译为MapReduce的过程

    • MapReduce实现基本SQL操作的原理
    • Join的实现原理
    • Group By的实现原理
    • Distinct的实现原理
    • SQL转化为MapReduce的过程
    • Phase1 SQL词法,语法解析
    • Phase2 SQL基本组成单元QueryBlock
    • Phase3 逻辑操作符Operator
    • Phase4 逻辑层优化器
    • Phase5 OperatorTree生成MapReduce Job的过程
    • Phase6 物理层优化器
    • Hive SQL编译过程的设计

    数据应用

    相关文章

      网友评论

          本文标题:图解数据

          本文链接:https://www.haomeiwen.com/subject/vnbqattx.html