zoukankan      html  css  js  c++  java
  • 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、大*大

  • 相关阅读:
    高德地图js开发,给城市某个区添加颜色
    threejs 实现易拉罐换肤功能
    React 跨页面保留前一页状态的一种实现方法
    nginx 解决客户端跟服务跨域问题
    React图片预览组件,支持缩放、旋转、上一张下一张功能
    h5 高德地图开发 谷歌浏览器定位失败解决方案
    echarts点击省份显示对应的省份
    sec:authorize 标签 通过不通过权限例子
    择左边多选框的值移动到右边多选框
    更改css element.style
  • 原文地址:https://www.cnblogs.com/lizm166/p/13354997.html
Copyright © 2011-2022 走看看