当前位置: 首页 > news >正文

hive企业级调优策略之分组聚合优化

测试用表准备

hive企业级调优策略测试数据
(阿里网盘下载链接):https://www.alipan.com/s/xsqK6971Mrs

订单表(2000w条数据)

表结构
在这里插入图片描述
建表语句

drop table if exists order_detail;
create table order_detail(id           string comment '订单id',user_id      string comment '用户id',product_id   string comment '商品id',province_id  string comment '省份id',create_time  string comment '下单时间',product_num  int comment '商品件数',total_amount decimal(16, 2) comment '下单金额'
)comment '订单表'partitioned by (dt string)row format delimited fields terminated by '\t'

数据装载
将order_detail.txt文件上传到HDFS,并执行以下导入语句。
注:文件较大,请耐心等待。

load data inpath 'hdfs://flinkv1:8020/input/order_detail.txt' overwrite into table order_detail partition(dt='2020-06-14');

支付表(600w条数据)

表结构
在这里插入图片描述
建表语句

drop table if exists payment_detail;
create table payment_detail(id              string comment '支付id',order_detail_id string comment '订单明细id',user_id         string comment '用户id',payment_time    string comment '支付时间',total_amount    decimal(16, 2) comment '支付金额'
)
partitioned by (dt string)
row format delimited fields terminated by '\t';

数据装载
将payment_detail.txt文件上传HDFS,并执行以下导入语句。
注:文件较大,请耐心等待。

load data inpath 'hdfs://flinkv1:8020/input/payment_detail.txt' overwrite into table payment_detail partition(dt='2020-06-14');

商品信息表(100w条数据)

表结构
在这里插入图片描述
建表语句

drop table if exists product_info;
create table product_info(id           string comment '商品id',product_name string comment '商品名称',price        decimal(16, 2) comment '价格',category_id  string comment '分类id'
)
row format delimited fields terminated by '\t';

数据装载
将product_info.txt文件上传到HDFS,并执行以下导入语句。

load data local inpath '/opt/module/hive/datas/product_info.txt' overwrite into table product_info;

省份信息表(34条数据)

表结构
在这里插入图片描述
建表语句

drop table if exists province_info;
create table province_info(id            string comment '省份id',province_name string comment '省份名称'
)
row format delimited fields terminated by '\t';

数据装载
将province_info.txt文件上传到HDFS,并执行以下导入语句。

load data inpath 'hdfs://flinkv1:8020/input/province_info.txt' overwrite into table province_info;

优化说明

Hive中未经优化的分组聚合,是通过一个MapReduce Job实现的。Map端负责读取数据,并按照分组字段分区,通过Shuffle,将数据发往Reduce端,各组数据在Reduce端完成最终的聚合运算。
Hive对分组聚合的优化主要围绕着减少Shuffle数据量进行,具体做法是map-side聚合。所谓map-side聚合,就是在map端维护一个hash table,利用其完成部分的聚合,然后将部分聚合的结果,按照分组字段分区,发送至reduce端,完成最终的聚合。map-side聚合能有效减少shuffle的数据量,提高分组聚合运算的效率。

map-side 聚合相关的参数如下:

启用map-side聚合

set hive.map.aggr=true;

用于检测源表数据是否适合进行map-side聚合,根据设置的比例系数进行检测,如果设置为1将不在进行检测,所有数据都进行map-side聚合。检测的方法是:先对若干条数据进行map-side聚合,若聚合后的条数和聚合前的条数比值小于该值,则认为该表适合进行map-side聚合;否则,认为该表数据不适合进行map-side聚合,例如根据主键ID进行分组,那么map端即时聚合也没有作用,反而多此一举浪费资源,后续数据便不再进行map-side聚合。

set hive.map.aggr.hash.min.reduction=0.5;

–用于检测源表是否适合map-side聚合的条数。

set hive.groupby.mapaggr.checkinterval=100000;

如果统计数据远大于分组值(例如100000条数据,计算每个省份的条数,省份可以确认34个,那么统计条数远大于分组值)我们可以直接把检测比例系数设置为1,检测源表数据设置为0;免去检测直接进行map-side聚合。

set hive.map.aggr.hash.min.reduction=1;
set hive.groupby.mapaggr.checkinterval=1;

map-side聚合所用的hash table,占用map task堆内存的最大比例,若超出该值,则会对hash table进行一次flush。(默认不需要调整,出现问题在进行调整)

set hive.map.aggr.hash.force.flush.memory.threshold=0.9;

优化案例

(1)示例SQL

selectprovince_id,count(*)
from order_detail
group by province_id;

关闭map-side优化:
在这里插入图片描述
在这里插入图片描述

(2)优化前
未经优化的分组聚合,执行计划如下图所示:
在这里插入图片描述

(3)优化思路
可以考虑开启map-side聚合,配置以下参数:
–启用map-side聚合,默认是true

set hive.map.aggr=true;

在这里插入图片描述

用于检测源表数据是否适合进行map-side聚合。检测的方法是:先对若干条数据进行map-side聚合,若聚合后的条数和聚合前的条数比值小于该值,则认为该表适合进行map-side聚合;否则,认为该表数据不适合进行map-side聚合,后续数据便不再进行map-side聚合。

set hive.map.aggr.hash.min.reduction=1;

在这里插入图片描述

–用于检测源表是否适合map-side聚合的条数。

set hive.groupby.mapaggr.checkinterval=0;

在这里插入图片描述

–map-side聚合所用的hash table,占用map task堆内存的最大比例,若超出该值,则会对hash table进行一次flush。

set hive.map.aggr.hash.force.flush.memory.threshold=0.9;

在这里插入图片描述
再次执行,耗时显而易见减少。
在这里插入图片描述

优化后的执行计划如图所示:
在这里插入图片描述

http://www.lryc.cn/news/263800.html

相关文章:

  • 英码科技受邀参加2023计算产业生态大会,分享智慧轨道交通创新解决方案
  • 【openssl】Linux升级openssl-1.0.1到1.1.1
  • 美国联邦机动车安全标准-FMVSS
  • 龙迅LT6211B,HDMI1.4转LVDS,应用于AR/VR市场
  • 解决docker拉取镜像错误 missing signature key 问题
  • 倒计数器:CountDownLatch
  • vue内容渲染
  • Kafka为什么能高效读写数据
  • Flink系列之:Table API Connectors之Debezium
  • 【Python基础】文件读写
  • 电脑风扇控制软件Macs Fan Control mac支持多个型号
  • clangd:Couldn‘t build compiler instance
  • Springboot启动出现Error to process server push response的解决方法
  • P2P网络下分布式文件共享场景的测试
  • 计算机组成原理综合1
  • 探秘 AJAX:让网页变得更智能的异步技术(下)
  • CentOs7.x安装部署SeaTunnelWeb遇到的坑
  • Netlink通信
  • Python打造简单而强大的聊天机器人:详解与实例代码
  • Unity 通过代码将一张大图切成多个小图的方法
  • Spring Cloud Gateway请求路径修改指南:详解ServerWebExchange的完美解决方案及代码示例
  • AI+爬虫 爬虫宝
  • 【matlab】绘制横状双组渐变柱状图
  • 如何下载知网论文、专利的PDF格式
  • SMARTFORMS打印问题
  • uniapp组件和周期的知识点以及怎么使用
  • 【Java JVM】实例对象的创建
  • sectigo多域名通配符证书
  • vue 流光边框矩形圆形容器
  • 明理信息科技打造专属个人或企业知识付费平台,核心功能设计