zoukankan      html  css  js  c++  java
  • 如何应对Hive的数据倾斜

    Hive的执行过程:

    (1) Hive 将 HQL 转换成一组操作符(Operator),比如 GroupByOperator, JoinOperator 等

    (2)操作符 Operator 是 Hive 的最小处理单元

    (3)每个操作符代表一个 HDFS 操作或者 MapReduce 作业

    (4)Hive 通过 ExecMapper 和 ExecReducer 执行 MapReduce 程序,执行模式有本地模式和分布式两种模式

    Hive中数据倾斜问题:

    1、数据倾斜的原因:
    (1)、key分布不均匀。
    (2)、业务数据本身的原因。
    (3)、建表考虑不周。
    (4)、某些SQL本身就有数据倾斜。

    2、如何避免数据的倾斜:

    (1)给key一个随机的值,打散key。

    (2)Hive中的参数调节:①hive.map.aggr = true。②hive.groupby.skewindata = true。作用:有数据倾斜的时候进行负载均衡,当选项设定位true,生成的查询计划会有两个MR Job。第一个MR Job中,Map的输出结果集合会随机分布到Reduce中,每个Reduce做部分聚合操作,并输出结果,这样处理的结果是相同的Group By Key有可能被分发到不同的Reduce中,从而达到负载均衡的目的;第二个MR Job再根据预处理的数据结果按照Group By Key 分布到 Reduce 中(这个过程可以保证相同的 Group By Key 被分布到同一个Reduce中),最后完成最终的聚合操作。

    (3)SQL语句的调节:1、选用join key分布最均匀的表作为驱动表。2、大小表join的时候,让维度较小的表先进内存。3、大表join的时候,把空值的key变成一个字符串加上一个随机数,把倾斜的数据分到不同的reduce上。4、count distinct大量相同特殊值。

    MySQL数据倾斜的原因与解决方法:

    group by聚合倾斜

    • 分组维度少,维度的值很多,导致reduce时间很长
    • 其他节点会一直等待reduce没有完成的节点,所以会有100% map 99% reduce的情况
    • 解决办法:set hive.map.aggr=true;set hive.groupby.skewindata=true;

    小文件过多

    • 合并小文件:set hive.merge.mapredfiles=true
    • 适当增加map的个数。解决方法:set mapred.map.tasks的个数
    • SQL中包含count(distinct),而数据量非常大并且特殊值太多,也会出现数据倾斜

    使用sum代理group by,select a,sum(1) from(select a,b from t group by a,b) group by a;

  • 相关阅读:
    [翻译]理解offsetWidth,clientWidth,scrollWidth以及Height
    [翻译]Chrome控制台API参考
    前端最新面试题
    前端面试题HTML+CSS
    css代码优化的12个技巧
    重构、标准、布局
    跨域的场景及跨域方式
    ajax
    那些我们该知道的数组操作
    全国最新行政区划省市区三级数据表(2018年9月),可直接用Python处理后导入数据库
  • 原文地址:https://www.cnblogs.com/swordspoet/p/14479923.html
Copyright © 2011-2022 走看看