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;

  • 相关阅读:
    leetcode 86. Partition List
    leetcode 303. Range Sum Query
    leetcode 1310. XOR Queries of a Subarray
    leetcode 1309. Decrypt String from Alphabet to Integer Mapping
    leetcode 215. Kth Largest Element in an Array
    将numpy.ndarray写入excel
    leetcode 1021 Remove Outermost Parentheses
    leetcode 1306. Jump Game III
    leetcode 1305. All Elements in Two Binary Search Trees
    ICCV2019 oral:Wavelet Domain Style Transfer for an Effective Perception-distortion Tradeoff in Single Image Super-Resolution
  • 原文地址:https://www.cnblogs.com/swordspoet/p/14479923.html
Copyright © 2011-2022 走看看