当前位置:   article > 正文

Hive on Spark调优(大数据技术6)_hive on spark 优化

hive on spark 优化

  文章最前: 我是Octopus,这个名字来源于我的中文名--章鱼;我热爱编程、热爱算法、热爱开源。所有源码在我的个人github ;这博客是记录我学习的点点滴滴,如果您对 Python、Java、AI、算法有兴趣,可以关注我的动态,一起学习,共同进步。

相关文章:

  1. Hive on Spark调优(大数据技术1)
  2. Hive on Spark调优(大数据技术2) 
  3. Hive on Spark调优(大数据技术3)

  4. Hive on Spark调优(大数据技术4) 
  5. Hive on Spark调优(大数据技术5)

  6. Hive on Spark调优(大数据技术6)

  7. Hive on Spark调优(大数据技术7)

  8. Hive on Spark调优(大数据技术8)

  9. Hive on Spark调优(大数据技术9)


6章 Join优化

6.1 Hive Join算法概述

Hive拥有多种join算法,包括common join,map join,sort Merge Bucket Map Join等。下面对每种join算法做简要说明:

1)common join

Map端负责读取参与join的表的数据,并按照关联字段进行分区,将其发送到Reduce端,Reduce端完成最终的关联操作。

2)map join

若参与join的表中,有n-1张表足够小,Map端就会缓存小表全部数据,然后扫描另外一张大表,在Map端完成关联操作。

3)Sort Merge Bucket Map Join

        若参与join的表均为分桶表,且关联字段为分桶字段,且分桶字段是有序的,且大表的分桶数量是小表分桶数量的整数倍。此时,就可以以分桶为单位,为每个Map分配任务了,Map端就无需再缓存小表的全表数据了,而只需缓存其所需的分桶。 

6.2 Map Join优化

示例SQL语句如下:

  1. select
  2. *
  3. from
  4. (
  5. select
  6. *
  7. from dwd_trade_order_detail_inc
  8. where dt='2020-06-16'
  9. )fact
  10. left join
  11. (
  12. select
  13. *
  14. from dim_sku_full
  15. where dt='2020-06-16'
  16. )dim
  17. on fact.sku_id=dim.id;

6.2.1 优化前执行计划

6.2.2 优化思路

上述参与join的两表一大一小,可考虑map join优化。

Map Join相关参数如下:

  1. --启用map join自动转换
  2. set hive.auto.convert.join=true;
  3. --common join转map join小表阈值
  4. set hive.auto.convert.join.noconditionaltask.size

 6.2.3 优化后执行计划

 6.3 Sort Merge Bucket Map Join

6.3.1 优化说明

Sort Merge Bucket Map Join相关参数:

  1. --启动Sort Merge Bucket Map Join优化
  2. set hive.optimize.bucketmapjoin.sortedmerge=true;
  3. --使用自动转换SMB Join
  4. set hive.auto.convert.sortmerge.join=true;

6.3.2 优化案例

1)示例SQL语句

  1. select
  2. *
  3. from(
  4. select
  5. *
  6. from dim_user_zip
  7. where dt='9999-12-31'
  8. )duz
  9. join(
  10. select
  11. *
  12. from dwd_trade_order_detail_inc
  13. where dt='2020-06-16'
  14. )dtodi
  15. on duz.id=dtodi.user_id;

2)优化前

上述SQL语句共有两张表一次join操作,故优化前的执行计划应包含一个Common Join任务,通过一个MapReduce Job实现。

3)优化思路

经分析,参与join的两张表,数据量如下:

表名

大小

dwd_trade_order_detail_inc

162900000000(约160g)

dim_user_zip

12320000000 (约12g)

两张表都相对较大,可以考虑采用SMBSMB Map Join对分桶大小是没有要求的。下面演示如何使用SMB Map Join。

首先需要依据源表创建两个的有序的分桶表,dwd_trade_order_detail_inc建议分36个bucket,dim_user_zip建议分6个bucket,注意分桶个数的倍数关系以及分桶字段和排序字段

  1. --订单明细表
  2. hive (default)>
  3. drop table if exists dwd_trade_order_detail_inc_bucketed;
  4. create table dwd_trade_order_detail_inc_bucketed(
  5. id string,
  6. order_id string,
  7. user_id string,
  8. sku_id string,
  9. province_id string,
  10. activity_id string,
  11. activity_rule_id string,
  12. coupon_id string,
  13. date_id string,
  14. create_time string,
  15. source_id string,
  16. source_type_code string,
  17. source_type_name string,
  18. sku_num bigint,
  19. split_original_amount decimal(16,2),
  20. split_activity_amount decimal(16,2),
  21. split_coupon_amount decimal(16,2),
  22. split_total_amount decimal(16,2)
  23. )
  24. clustered by (user_id) sorted by(user_id) into 36 buckets
  25. row format delimited fields terminated by '\t';
  26. --用户表
  27. hive (default)>
  28. drop table if exists dim_user_zip_bucketed;
  29. create table dim_user_zip_bucketed(
  30. id string,
  31. login_name string,
  32. nick_name string,
  33. name string,
  34. phone_num string,
  35. email string,
  36. user_level string,
  37. birthday string,
  38. gender string,
  39. create_time string,
  40. operate_time string,
  41. start_date string,
  42. end_date string,
  43. dt string
  44. )
  45. clustered by (id) sorted by(id) into 6 buckets
  46. row format delimited fields terminated by '\t';

 然后向两个分桶表导入数据。

  1. --订单明细分桶表
  2. hive (default)>
  3. insert overwrite table dwd_trade_order_detail_inc_bucketed
  4. select
  5. id ,
  6. order_id ,
  7. user_id ,
  8. sku_id ,
  9. province_id ,
  10. activity_id ,
  11. activity_rule_id ,
  12. coupon_id ,
  13. date_id ,
  14. create_time ,
  15. source_id ,
  16. source_type_code ,
  17. source_type_name ,
  18. sku_num ,
  19. split_original_amount ,
  20. split_activity_amount ,
  21. split_coupon_amount,
  22. split_total_amount
  23. from dwd_trade_order_detail_inc
  24. where dt='2020-06-16';
  25. --用户分桶表
  26. hive (default)>
  27. insert overwrite table dim_user_zip_bucketed
  28. select
  29. id,
  30. login_name,
  31. nick_name,
  32. name,
  33. phone_num,
  34. email,
  35. user_level,
  36. birthday,
  37. gender,
  38. create_time,
  39. operate_time,
  40. start_date,
  41. end_date,
  42. dt
  43. from dim_user_zip
  44. where dt='9999-12-31';

然后设置以下参数:

  1. --启动Sort Merge Bucket Map Join优化
  2. set hive.optimize.bucketmapjoin.sortedmerge=true;
  3. --使用自动转换SMB Join
  4. set hive.auto.convert.sortmerge.join=true;

最后在重写SQL语句,如下:

  1. hive (default)>
  2. select
  3. *
  4. from dwd_trade_order_detail_inc_bucketed od
  5. join dim_user_zip_bucketed duser
  6. on od.user_id = duser.id;

优化后的执行计如图所示:

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小惠珠哦/article/detail/872670
推荐阅读
相关标签
  

闽ICP备14008679号