`
tobyqiu
  • 浏览: 40220 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

转:hive表Join的倾斜问题以及解决方法

阅读更多

写HQL语句的时候常常会遇到表Join的情况,一个简单的Join会被Hive解释成一个MapReduce任务,Map端分别读取两个表的数据,Reduce做真正的Join操作。

如果执行的过程中,如果发现有些Reduce任务比其他的Reduce任务慢很多,往往是发生了倾斜问题。

问题分析

 

select
    a.*,
    b.cat_name
from
    dim_auction a
join
    dim_category b
on a.cat_id=b.cat_id

 Join会被Hive解释成一个MapReduce任务时,Map端输出的记录是以Join的条件为Key的,即这些Map生成的Key都是 cat_id。随后,这些cat_id被Hash到多个Reduce任务中,来完成真正Join。所有拥有相同cat_id的记录一定会被分配到同一个 Reducer中。

 

但是每个cat_id多对应的记录数是不一样的,连衣裙类目的数据一定很多,钟点工类目的数据就很少。

如果某个Reducer比较悲催,分到了连衣裙类目,则其处理的数据量就会很大,最后表现在处理时间拖后腿的情况。

解决方法1 --- MapJoin

一个常用的解决手段是使用MapJoin,这种手段适合于关联的两个表有一个较小的情况。

其原理是,把Join动作提前到Map端,而不是Reduce端。
在Map的时候,对于大表,我们还是每个Map装载这个表的一部分,对于小表,我们把它放到每个Map中。这样每个Map都拥有小表的所有记录,可以在本地进行Join操作了。

具体的,在SQL中加入这样一个Hint就OK了:

 

select /*\+ MAPJOIN(b) \*/
   a.*,
   b.cat_name
from
   dim_auction a
join
   dim_category b
on a.cat_id=b.cat_id

 

 

解决方法2 ---分而治之

MapJoin是一个很好用的工具,但是却存在一个致命的弱点,就是其中一个表一定要比较小,能够完全装入单台机器的内存。

我们看下面一个例子:

 

select
   a.*,
   b.property_name
from
   auction_property a
left outer join
(
   select
      *
   from
      dim_base_properties
   where ds='20130620'
) b
on a.property_id = b.property_id

 auction_property表存储了每一个商品以及该商品的每一个属性。

 

dim_base_properties存储了每个属性的名称、以及一些其他元数据。
我们这次关联是想在auction_property表的基础上,加上每个属性的名称。

和类目一样,属性ID是有倾斜的,即有一些很常用的属性,被很多宝贝都引用了。

悲剧的事情是,auction_property和dim_base_properties这两个表都很大。。。

解决这个问题依赖于如下的观察:导致倾斜的Key的个数往往不多,也就是说,常用的属性就那么几个,剩下的大部分属性都不常用。
下面我们采用分治方法来解决这个问题:

第一步,找到的常用的属性。

 

create table lingyun_property_skew
as
select
    a.property_id,
    a.cnt,
    b.property_name
from
    (
        select
           property_id,
           count(*) as cnt
        from
            lingyun_auction_property a
        group by property_id
        order by cnt desc
        limit 1000
    ) a
join
    (
        select
            *
        from
            tbdw.dim_base_properties
        where ds='20130620'
    ) b
on a.property_id = b.property_id;

 

create table lingyun_auction_property_name
as
select
    *
from
(
    select
        auction_id,
        property_id,
        value_id,
        property_name
    from
        lingyun_auction_property_name_part1

    union all

    select
        auction_id,
        property_id,
        value_id,
        property_name
    from
        lingyun_auction_property_name_part2
) a;

 这里我们把auction_property表按照property_id汇总,并且找到最常用的1000个属性ID,并且查到了这些属性ID的名字。

 

这里1000可以扩展到上万个,只要保障能够被装进内存就可以了。

第二步是先解决常用属性的关联

 

create table lingyun_auction_property_name_temp
as
select /*+ MAPJOIN(b) */
    a.*,
    b.property_name
from
    auction_property a
left outer join
    lingyun_property_skew b
on a.property_id = b.property_id;

create table lingyun_auction_property_name_part1
as
select
    *
from
    lingyun_auction_property_name_temp
where property_name is not null;

 这一步我们可以使用MAPJOIN是因为lingyun_property_skew是一个小表。

 

第三步是解决非常用属性的关联

 

create table lingyun_auction_property_name_part2
as
select
    a.auction_id,
    a.property_id,
    a.value_id,
    b.property_name
from
    (
        select
            *
        from
            lingyun_auction_property_name_temp
        where property_name is null
    ) a
join
    (
        select
            *
        from
            tbdw.dim_base_properties
        where ds='20130620'
    ) b
on a.property_id=b.property_id;

 这一步不存在倾斜问题是因为可能导致倾斜的property_id已经从lingyun_auction_property_name_temp里面筛除掉了,剩下的每个property_id对应的商品数不会很多。

 

最后把两个表Union到一起,得到最终结果。

 

分享到:
评论

相关推荐

    hive数据倾斜原因分析及解决方案.pdf

    Hive 数据倾斜原因分析及解决方案 Hive 数据倾斜是指在 Hive 执行过程中,某些 ...Hive 数据倾斜是影响业务正常运行的重要因素,通过了解数据倾斜的原因和解决方案,可以有效地解决数据倾斜问题,提高业务的执行效率。

    第6章:Hive性能优化及Hive3新特性1

    - **分区表**:为了解决普通表查询时不必要的数据加载问题,Hive引入了分区表。通过将数据按特定字段(通常是时间戳或类别)划分为不同的分区,每个分区对应HDFS上的一个目录。这使得查询时只需处理与条件匹配的...

    hive优化.docx

    Hive优化方法 Hive是一个基于Hadoop的数据仓库工具,用于存储和处理大规模数据。然而,在Hive开发过程中,常见的性能问题之一是数据倾斜问题。...Hive优化方法可以有效解决数据倾斜问题,提高Hive的性能和效率。

    利用Hive进行复杂用户行为大数据分析及优化案例

    利用Hive进行复杂用户行为大数据分析及优化案例(全套视频+课件...14_Hive中的数据倾斜及解决方案-三种join方式 15_Hive中的数据倾斜及解决方案-group by 16_Hive中使用正则加载数据 17_Hive中使用Python脚本进行预处理

    大数据 虚拟机 Linux VM复习题库:题库包括了60题选择题、10题填空题、10题判断题、2题简答题,助你度过期末复习

    可以通过优化作业、控制mapper和reducer数量、解决小文件问题等方法来缓解。 11. **Hive数据装载**: 常用`INSERT OVERWRITE`插入数据,`LOAD DATA`加载数据,根据场景选择合适方式。 12. **Hive SQL JOIN关键词*...

    Hive优化方法整理

    解决数据倾斜问题 1. 对于 join 操作,如果出现数据倾斜,应当设置 set hive.exec.reducers.max=200;set mapred.reduce.tasks= 200;以增大 Reduce 个数。 2. 对于 group by 操作,如果出现数据倾斜,应当设置 set ...

    最强HiveSQL开发指南.pdf

    实战部分将涵盖实际项目中的具体场景,如数据清洗、报表生成、数据分析等,结合案例讲解如何利用HiveSQL解决实际问题,提升工作效率和数据处理能力。 总结起来,《最强HiveSQL开发指南》全面涵盖了Hive的基本操作、...

    Hive Summit 2011-join

    在Hive Summit 2011-join的内容中,可以看到Hive join操作策略的深入讨论,这包括每种join策略的使用场景、优势和潜在问题,帮助数据工程师更好地理解和使用Hive的join操作。此外,提到的join策略也为数据仓库和大...

    HIVE资料.zip

    4. **数据倾斜(Data Skew)**:当数据在各个节点分布不均时,可能会导致某些节点负载过高,Hive提供了一些策略来解决这个问题,比如使用哈希分区。 5. **MapReduce**:Hive的执行引擎默认是基于MapReduce的,它将...

    Hive千亿级数据倾斜解决方案.docx

    解决 Hive 千亿级数据倾斜问题需要从根源上解决数据倾斜的原因,包括空值引发的数据倾斜和不同数据类型引发的数据倾斜。通过对数据倾斜的原因进行分析和解决,可以提高分布式系统的性能和效率。

    Hive 编程指南

    - **数据倾斜**:处理数据分布不均的问题,可能需要重新分区或桶化。 - **MapReduce优化**:调整map/reduce任务的数量,优化缓存策略。 7. **Hive与其他组件集成**: - **Pig和Hive的交互**:Hive可以通过 Pig ...

    Hive编程指南

    10. **数据倾斜**:Hive处理大数据时可能遇到的数据分布不均问题,优化策略包括重分区、动态分区和负载均衡。 11. **安全性**:Hive支持Hadoop的权限模型,如HDFS的ACLs,以及更高级的Apache Sentry和Kerberos认证...

    大数据系列-Hive

    3. **数据倾斜问题**:当某些分区或分桶中的数据量远大于其他时,会导致计算资源分配不均,影响整体性能。解决办法包括调整分区策略,或者使用动态分区。 4. **Hive与外部表**:内部表由Hive管理元数据及数据存储,...

    Hive 优化以及执行原理

    1. **表分区**:分区是Hive优化的基础,通过将大表划分为小的逻辑部分,可以显著提高查询速度。合理的分区策略应基于查询中常用的过滤条件,例如日期、地区等。 2. ** bucketing 和 sorting**:通过bucketing,数据...

    Hive收集的电子文档

    Hive提供了一些策略来解决这个问题,如限制每个键值的桶数。 7. **存储过程(UDF/UDAF/UDTF)**:Hive支持用户自定义函数,包括UDF(单行函数)、UDAF(聚合函数)和UDTF(多行函数),以扩展其功能。 8. **Hive与...

    Cloudera Hive 文档

    8. **Hive 数据倾斜**:数据倾斜是大数据处理中常见的问题,当某些节点处理的数据远多于其他节点时,会导致整体处理效率下降。解决数据倾斜的方法包括优化分区策略、使用动态分区和重写查询。 9. **Hive UDF(用户...

    hive-1.1.0-cdh5.7.0.tar.gz.rar

    9. **数据倾斜优化**:Hive通过数据倾斜优化策略,尽量避免在JOIN等操作中出现数据不平衡的问题,提升整体性能。 10. **Oozie集成**:CDH5.7.0中的Hive可以与Oozie工作流服务配合,创建和调度复杂的Hive作业流程。 ...

    hive 表 dml 操作.zip

    7. **CLUSTER BY 和 DISTRIBUTE BY**:这两个语句可以控制数据在执行INSERT或SELECT INTO时的分布方式,有助于优化JOIN操作和数据倾斜问题。CLUSTER BY根据指定的列进行聚类排序,DISTRIBUTE BY则决定数据在HDFS上的...

    Hive总结.docx

    Hive是基于Hadoop平台的数据仓库解决方案,它主要解决了在大数据场景下,业务人员和数据科学家能够通过熟悉的SQL语言进行数据分析的问题。Hive并不存储数据,而是依赖于HDFS进行数据存储,并利用MapReduce、Tez或...

    Hive优化.docx

    - **手动编写SQL解决倾斜**:有时,自定义SQL能够更精确地解决倾斜问题。 - **避免count(distinct)滥用**:在大数据场景下,使用`count(distinct)`要谨慎,可寻找替代方案。 - **小文件合并**:合并小文件能提高...

Global site tag (gtag.js) - Google Analytics