• Hive之数据倾斜


    Hive之数据倾斜

    第一节:简介

    一、数据倾斜

    数据倾斜:由于数据分布不均匀,造成数据大量的集中到一点,造成数据热点。

    大数据中不怕数据量大,怕数据倾斜。

    hive的数据倾斜 --- mapreduce的数据倾斜。

    二、主要表现形式

    hive运行日志中

    map 100%   reduce 97%

    map 100%   reduce 97%

    map 100%   reduce 97%

    map 100%   reduce 97%

    。。。。。。。

    第二节:hive中不易数据倾斜场景

    一、 不执行mapreduce

    1、简介

    hql语句---不执行mapreduce的

    hive.fetch.task.conversion  决定的哪些语句不用执行mapreduce任务而是执行fetch的任务即数据抓取。

    2、none

    此属性禁用,所有的hql语句都要执行mr任务

    3、minimal

    在版本0.10.0 through 0.13.1时默认使用

    select*, filter on partition columns (where and having clauses),limit only

    select *,where过滤分区字段的时候,limit 直接执行fetch的,不执行mr任务的。

    以上三种情况不用执行mapreduce

    4、more

     Select,filter, limit only (including tablesample, virtual columns)

     select 表中的任意没有加工的原始字段

     where 过滤

     limit

    以上三种情况不用执行mapreduce。

    group by、join、order by、distinct等肯定走mapreduce的。

    二、group by和聚合函数

    max|min|sum  +  group by  

    默认在map端执行combiner在map端先执行一次聚合(combiner),reduce端接受的数据量少,不容易产生数据倾斜的。

    三、mapjoin

    在mapjoin的时候,有多个的maptask,不走reducetask,所以不会造成数据倾斜。

    第三节:hive中容易数据倾斜场景

    一、join

    reducejoin的时候,如果里面的字段有一个是特别的多的话,会产生数据倾斜的问题。

    二、group by

    group by不和聚合函数一起使用的时候

    三、count(distinct)

    慎重使用,极易产生数据倾斜。

    最终只会启动一个reducetask,无论手动设置几个reducetask任务,最终只运行一个。

    优化:

    把 count和distinct的需求分开

    先求distinct

    select distinct userId from weibo;

    再求count

    select count(*) from (select distinct userId from weibo)a;

    最终转换为2个mapreduce任务。

    四、注意

    在hive中如果一个hql语句需要转换为多个job,下一个job需要依赖上一个job的,上一个job的结果不落磁盘,直接发送给下一个job,下一个job的maptask的个数由上一个job的输出的reducetask的个数决定的。

    第四节:经典场景

    一、关联键存在大量null值

    1、简介

    在join(大*大)的情况下

    2、解决方案

    (1)将null值删除

     

    (2)需要null值

     

    二、关联建类型不统一

    1、简介

    在join(大*大)情况下

    用户表中 user_id 字段为 int,log 表中 user_id 为 string类型,当按照两个表的 user_id 进行 join 操作的时候,默认的 hash 操作会按照 int 类型的 id 进行分配,这样就会导致所有的 string 类型的 id 就被分到同一个 reducer 当中。

    因为此时的分区算法是:分区字段.hash%分区个数,所以不能识别string类型的,因此他们会被分配到同一个的reducetask。

    2、解决方案

    cast(原始数据 as 需要转换的类型)

    cast(age as bigint)

    利用类型转换函数。

    三、reducejoin可能产生数据倾斜

    1、小*小、大*小

    不会产生数据倾斜的。

    默认执行的mapjoin

    小表限制:

    set hive.auto.convert.join=true;

    //设置 MapJoin 优化自动开启

    set hive.mapjoin.smalltable.filesize=25000000  25M

    //设置小表的大小

    关联的时候,较小表小于等于25000000byte的时候,默认执行mapjoin。

    2、大*中

     

    3、大*大

  • 相关阅读:
    hdu 6702 ^&^ 位运算
    hdu 6709 Fishing Master 贪心
    hdu 6704 K-th occurrence 二分 ST表 后缀数组 主席树
    hdu 1423 Greatest Common Increasing Subsequence 最长公共上升子序列 LCIS
    hdu 5909 Tree Cutting FWT
    luogu P1588 丢失的牛 宽搜
    luogu P1003 铺地毯
    luogu P1104 生日
    luogu P1094 纪念品分组
    luogu P1093 奖学金
  • 原文地址:https://www.cnblogs.com/lizm166/p/13354997.html
Copyright © 2020-2023  润新知