zoukankan      html  css  js  c++  java
  • 【Hive】Hive笔记:Hive调优总结——数据倾斜,join表连接优化

        数据倾斜即为数据在节点上分布不均,是常见的优化过程中常见的需要解决的问题。常见的Hive调优的方法:列剪裁Map Join操作 Group By操作合并小文件

    一、表现

          1.任务进度长度为99%,在任务监控页面中发现只有几个 reduce 子任务未完成;

          2.单一 reduce 记录与平均记录数差异过大(大于3倍),最长时长>>平均时长;

          3.job数多的,效率低,多次关联后,产生几个jobs,起码半小时以上才跑完;

     

    二、原因

          1.key分布不均;

          2.业务数据本身问题;

          3.建表有问题;

          4.sql语句本身数据倾斜;

    数据倾斜问题:

    关键词

    情形

    后果

    join

    1.小表与大表.其中一表较小,但key集中;

    2.大表与大表,但分桶到判断字段0或空值过多;

    分发到一个或几个reduce上数据远大于平均值;空值由一个reduce处理,很慢

    group by

    group by 维度过小,某值数量过多

    处理某值的reduce很耗时,解决:用sum() group代替count (distinct)

    count distinct

    某特殊值过多

    处理此特殊值reduce耗时

    三、解决思路

             1.好的模型设计事半功倍;

             2.解决数据倾斜问题;

             3.减少job数;

              4.设置合理的map,reduce 的task 数,有效提升性能;

             5.自己动手写sql 可以解决数据倾斜;

             6.对sum, count不存在数据倾斜问题,自己写;

             7.对小文件合并;

             8.优化时把握整体,单个作业最优不一定整体最优。

    (注:sql相关→(1)倾斜的数据用 map join,不倾斜的数据用 join

                              (2) union join:把2个具有相同列的数据类型的结果放到一起显示,并且不去重;

                              (3)几个列参与join就有几个job,不是看独立的语句(eg.select)有几个!)

     

    四、解决方案

     4.1 参数调节

    hive.map.aggr = true (map 端部分聚合,当于 combiner)

    hive.groupby.skewindata = true (有数据倾斜时负载均衡

     

    4.2 sql语句调节

    (1) 如何join:关于驱动表的选取,应选分布均匀的作为驱动表;做好列剪裁 filter 操作,达到两表 join 时,数量变小的效果。

    (2) 大小表join:使用map join,让小表先进内存,在 map 端完成reduce 。

    (3) 大表 join 大表:把空值 null key变成字符串加上随机数,倾斜数据分到不同 reduce 上。

    (4) groupby 维度过小:采用sum() group by 代替count (distinct) 完成计算。

    五、典型案例

    5.1. 空值产生的数据倾斜userid为空的表去 join另一表

         方法一:为空的userid 不参与关联:select * from a join b on a.userid is not null and a.id = b.id

         方法二:赋空值分新的 key字符串加上随机数。(比方法一好,io少了,作业job也少了:方法一读取log 为2次,job为2;方法二读取的job 为1)

     

    5.2 不同数据类型关联的数据倾斜userid2个表中,一个为 string,一个为 int

    解决方法:把数值类型转化为 string。

    eg. select *from a left join b on (a.id = cast(b.id as string))

     

    5.3 小表 join 大表时,小表很大一般 map join会有 bug

    两个待连接表中,小表可以进内存(小表小于内存装得下),而大表很大。可以将小表复制多份,让每个Map Task 内存中存在一份(比如放到 hash table 中),然后只扫描大表。

    对大表中每条记录 key-value,在 hash table中查找是否有相同的 key 记录,如果有,连接后输出即可。(不用 reducer,直接在 map端就可以完成 join

  • 相关阅读:
    【转】ERROR: Cannot uninstall 'llvmlite'. It is a distutils installed project. 此类报错的解决办法
    【转】python setup.py install 报错:error:[WinError 3]系统找不到指定的路径: 'C:\\Program Files (x86)\\Microsoft Visual Studio 14.0\\VC\\PlatformSDK\\lib
    【转】距离相关系数以及python包的安装
    【转】算法总结这是一份全面并且详细的排序算法学习指南
    origin 一键导出文件夹中所有图形
    【转】距离相关系数的python实现
    [转]一文让你通俗理解奇异值分解
    origin 检查是否有重复图片
    【Vegas原创】centos网卡自启动
    【Vegas原创】使用dockercompose运行mysql8
  • 原文地址:https://www.cnblogs.com/DianaCody/p/5425656.html
Copyright © 2011-2022 走看看