大数据开发之Hive案例篇10-大表笛卡尔积优化

这篇具有很好参考价值的文章主要介绍了大数据开发之Hive案例篇10-大表笛卡尔积优化。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一. 问题描述

需求描述:
表概述:

dt                  时间分区
data_source  数据来源类别
start_date      时间
data_count    当前时间的数量

需要实现的需求

求每个data_source 下start_date 当前累积的data_count

SQL代码:

select dt,
          data_souce,
          start_date,
          data_count,
          sum(data_count) over(partition by data_source order by start_date) as data_cum_count
  from table_name

运行日志:
从日志可以看到,数据倾斜了,redcue一直卡在99%不动,过一段时间就被断开了。

2023-05-30 12:05:40,318 Stage-1 map = 100%,  reduce = 75%, Cumulative CPU 2693.11 sec
2023-05-30 12:05:41,349 Stage-1 map = 100%,  reduce = 76%, Cumulative CPU 2716.81 sec
2023-05-30 12:05:43,411 Stage-1 map = 100%,  reduce = 77%, Cumulative CPU 2774.08 sec
2023-05-30 12:05:45,478 Stage-1 map = 100%,  reduce = 78%, Cumulative CPU 2795.55 sec
2023-05-30 12:05:46,509 Stage-1 map = 100%,  reduce = 79%, Cumulative CPU 2851.83 sec
2023-05-30 12:05:47,547 Stage-1 map = 100%,  reduce = 80%, Cumulative CPU 2880.86 sec
2023-05-30 12:05:51,678 Stage-1 map = 100%,  reduce = 81%, Cumulative CPU 2935.67 sec
2023-05-30 12:05:52,710 Stage-1 map = 100%,  reduce = 84%, Cumulative CPU 3031.14 sec
2023-05-30 12:05:54,772 Stage-1 map = 100%,  reduce = 85%, Cumulative CPU 3086.83 sec
2023-05-30 12:05:56,833 Stage-1 map = 100%,  reduce = 86%, Cumulative CPU 3101.59 sec
2023-05-30 12:06:00,956 Stage-1 map = 100%,  reduce = 87%, Cumulative CPU 3213.04 sec
2023-05-30 12:06:07,173 Stage-1 map = 100%,  reduce = 89%, Cumulative CPU 3332.53 sec
2023-05-30 12:06:08,209 Stage-1 map = 100%,  reduce = 90%, Cumulative CPU 3348.58 sec
2023-05-30 12:06:09,241 Stage-1 map = 100%,  reduce = 93%, Cumulative CPU 3399.05 sec
2023-05-30 12:06:10,272 Stage-1 map = 100%,  reduce = 94%, Cumulative CPU 3456.29 sec
2023-05-30 12:06:12,334 Stage-1 map = 100%,  reduce = 95%, Cumulative CPU 3503.32 sec
2023-05-30 12:06:14,406 Stage-1 map = 100%,  reduce = 96%, Cumulative CPU 3550.1 sec
2023-05-30 12:06:15,433 Stage-1 map = 100%,  reduce = 97%, Cumulative CPU 3576.75 sec
2023-05-30 12:06:19,561 Stage-1 map = 100%,  reduce = 98%, Cumulative CPU 3674.46 sec
2023-05-30 12:06:29,878 Stage-1 map = 100%,  reduce = 99%, Cumulative CPU 3860.69 sec
2023-05-30 12:07:30,726 Stage-1 map = 100%,  reduce = 99%, Cumulative CPU 4349.64 sec
2023-05-30 12:08:31,498 Stage-1 map = 100%,  reduce = 99%, Cumulative CPU 4622.97 sec
2023-05-30 12:09:32,161 Stage-1 map = 100%,  reduce = 99%, Cumulative CPU 4857.09 sec
2023-05-30 12:10:32,788 Stage-1 map = 100%,  reduce = 99%, Cumulative CPU 5046.44 sec
2023-05-30 12:11:33,443 Stage-1 map = 100%,  reduce = 99%, Cumulative CPU 5196.55 sec
2023-05-30 12:12:34,216 Stage-1 map = 100%,  reduce = 99%, Cumulative CPU 5325.04 sec
2023-05-30 12:13:34,952 Stage-1 map = 100%,  reduce = 99%, Cumulative CPU 5454.34 sec
2023-05-30 12:14:35,677 Stage-1 map = 100%,  reduce = 99%, Cumulative CPU 5584.3 sec
2023-05-30 12:15:36,383 Stage-1 map = 100%,  reduce = 99%, Cumulative CPU 5722.47 sec
2023-05-30 12:16:37,011 Stage-1 map = 100%,  reduce = 99%, Cumulative CPU 5796.86 sec
2023-05-30 12:17:37,641 Stage-1 map = 100%,  reduce = 99%, Cumulative CPU 5864.27 sec
2023-05-30 12:18:38,284 Stage-1 map = 100%,  reduce = 99%, Cumulative CPU 5929.96 sec
2023-05-30 12:19:38,916 Stage-1 map = 100%,  reduce = 99%, Cumulative CPU 5999.27 sec
2023-05-30 12:20:39,508 Stage-1 map = 100%,  reduce = 99%, Cumulative CPU 6066.16 sec
2023-05-30 12:21:40,153 Stage-1 map = 100%,  reduce = 99%, Cumulative CPU 6133.75 sec
2023-05-30 12:22:40,776 Stage-1 map = 100%,  reduce = 99%, Cumulative CPU 6202.56 sec
2023-05-30 12:23:41,326 Stage-1 map = 100%,  reduce = 99%, Cumulative CPU 6271.21 sec
2023-05-30 12:24:41,947 Stage-1 map = 100%,  reduce = 99%, Cumulative CPU 6338.7 sec
2023-05-30 12:25:42,696 Stage-1 map = 100%,  reduce = 99%, Cumulative CPU 6406.98 sec
2023-05-30 12:26:43,307 Stage-1 map = 100%,  reduce = 99%, Cumulative CPU 6474.84 sec
2023-05-30 12:27:43,873 Stage-1 map = 100%,  reduce = 99%, Cumulative CPU 6543.65 sec
2023-05-30 12:28:44,449 Stage-1 map = 100%,  reduce = 99%, Cumulative CPU 6610.24 sec
2023-05-30 12:29:45,003 Stage-1 map = 100%,  reduce = 99%, Cumulative CPU 6679.73 sec
2023-05-30 12:30:45,623 Stage-1 map = 100%,  reduce = 99%, Cumulative CPU 6746.93 sec
2023-05-30 12:31:46,118 Stage-1 map = 100%,  reduce = 99%, Cumulative CPU 6822.78 sec
2023-05-30 12:32:46,658 Stage-1 map = 100%,  reduce = 99%, Cumulative CPU 6890.72 sec
2023-05-30 12:33:47,212 Stage-1 map = 100%,  reduce = 99%, Cumulative CPU 6959.17 sec

web页面日志:
从web页面可以看到,reduce被kill的原因是Container被ApplicationMaster给kill掉了

Speculation: attempt_1680276634497_67940_r_000001_1 succeeded first! [2023-05-30 10:56:47.400]Container killed by the ApplicationMaster. [2023-05-30 10:56:47.422]Container killed on request. Exit code is 143 [2023-05-30 10:56:47.442]Container exited with a non-zero exit code 143.

过一段时间整个Job都被kill掉了

二.解决方案

2.1 数据倾斜

因为reduce卡在了99%,所以首先想到的是数据倾斜,后面了解了下,data_source字段确实存在数据倾斜

调整参数:
然后没什么用

-- 加大reduce个数
set mapred.reduce.tasks = 100;
set hive.auto.convert.join = true;
-- 超过一万行就认为是倾斜
set hive.skewjoin.key=100000;

set mapreduce.map.memory.mb=16384;
set mapreduce.reduce.memory.mb=2048;
set yarn.nodemanager.vmem-pmem-ratio=4.1;
set mapreduce.reduce.memory.mb=5120;
set mapred.map.child.java.opts=-Xmx13106M;
set mapreduce.map.java.opts=-Xmx13106M;
set mapreduce.reduce.java.opts=-Xmx13106M;
set mapreduce.task.io.sort.mb=512;
set mapreduce.job.reduce.slowstart.completedmaps=0.8;

调整代码:
将数据倾斜严重的数据,单独拿出来执行
然后也没什么作用

select dt,
          data_souce,
          start_date,
          data_count,
          sum(data_count) over(partition by data_source order by start_date) as data_cum_count
  from table_name
where data_source in (数据倾斜);

select dt,
          data_souce,
          start_date,
          data_count,
          sum(data_count) over(partition by data_source order by start_date) as data_cum_count
  from table_name
where data_source not in (数据倾斜);

2.2 SQL改写1:由分析函数改为常规写法

不确定是不是Hive分析函数的问题,然后我将原始的SQL改为了表连接和临时表的方法来解决

代码:

select t1.dt,t1.data_source,t1.start_date,
          sum(data_count)  data_cum_count
  from table_name t1
 left join table_name t2
  on t1.data_souce = t2.data_souce
where t1.start_date >= t2.start_date
group by t1.dt,t1.data_source,t1.start_date;

运行结果:
运行结果中,某一个job也是卡在reduce 99%,但是卡了20分钟左右,就执行成功了
最终SQL在30分钟左右执行完成

同样的逻辑,表连接的方式居然就可以了,而分析函数却不行,估计一个是写内存,一个是写磁盘把。

然而:
然后这个是测试表,只有一个月的数据,补历史数据要补几年的,那么这个SQL肯定只会更慢。

2.3 分析数据分布

最大的一个data_source居然有9w多个,产生的笛卡尔积得有81亿之多,虽然集群有20个节点,资源还不错,执行也要半个小时以上。

不敢想象如果是一年甚至数年的,那这个笛卡尔积只会更大。

所以只能改SQL了

2.4 SQL改写2:重写

我们需要求每一个start_date的累积数量,那么此时我们可以先求每天的,然后求每天累积的,再求当天每一个start_date累积的,加上前一日的累积的,就是最终我们需要的数据。

SQL代码:

with tmp1 as (
select t1.data_source,t1.dt,sum(t1.data_count) as sum_v_dt
    from table_name t1
  group by t1.data_source,t1.dt
 ),
tmp2 as (
select data_source,
       dt,
       sum(sum_v_dt) over( partition by data_source order by dt) as sum_v_cum_dt
  from tmp1
)
select t2.data_source,
       t2.dt,
       t2.start_date,
       nvl(sum(t2.data_count) over(partition by t2.data_source,t2.dt order by t2.start_date),0) + nvl(tmp2.sum_v_cum_dt,0) as sum_v_cum_dt_sdate
  from table_name t2
  join tmp2
 on t2.data_source = tmp2.data_source
and t2.dt = tmp2.dt +1;

运行记录:
最终的运行时间在5分钟左右
就算数据量提升数倍,因为 join的条件由一个 data_source 变为了两个 data_souce 、dt,大大减少了笛卡尔积的数据量,整个代码的计算量也减少了许多。文章来源地址https://www.toymoban.com/news/detail-488293.html

参考:

  1. https://zhuanlan.zhihu.com/p/398374859
  2. https://blog.csdn.net/wisgood/article/details/77063606
  3. https://www.jianshu.com/p/fe0c5c7f62ed
  4. https://www.jianshu.com/p/9fb56b668ea0
  5. https://www.jianshu.com/p/d13f2c0db335

到了这里,关于大数据开发之Hive案例篇10-大表笛卡尔积优化的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Frenet坐标系及其与笛卡尔坐标的转换(2)——原理

    4.1.3 推导 s ˙ dot{s} s ˙ 由公式 (21) text{(21)} (21) 与公式 (28) text{(28)} (28) 可知: l ′ = ( 1 − κ r l ) ⋅ t a n ( Δ θ ) = v e s i n ( Δ θ ) s ˙ (29) l\\\' = (1-kappa_{r} l) cdot tan(Deltatheta) = frac {v_{e}sin(Deltatheta)}{dot{s}}tag{29} l ′ = ( 1 − κ r ​ l ) ⋅ t a n ( Δ θ ) = s ˙ v e ​ s i n ( Δ θ ) ​

    2024年02月03日
    浏览(84)
  • 【Python】实战:生成多层嵌套笛卡尔积组合问卷 csv《感知觉与沟通评估表》

    目录 一、适用场景 二、业务需求  (1)原产品需求  (2)需求分析 

    2024年02月02日
    浏览(40)
  • 机器人在笛卡尔空间和关节空间的多项式轨迹规划以及matlab代码(三次、五次、七次)

    三次多项式轨迹规划就是s(t)相对于时间t的变化满足三次多项式变化,其表达式如下:                      如前文所述:t的取值范围是[0,T],s(t)的取值范围是[0,1], 又因为初始速度和末速度都为0,所以: S(t)的一阶导数表达式为: 从而可以计算出对应的系数: 将

    2024年01月17日
    浏览(41)
  • Mysql表关联简单介绍(inner join、left join、right join、full join不支持、笛卡尔积)

    A 是1、2、3 B是2、3、4 A、B的交集是A∩B = 2、3 A、B的并集是 AUB = 1、2、3、4 A、B的差集是 A-B = 1 B、A的差集是 B-A = 4 造数据 select A. ,B. from xin_stu_t_bak A inner join xin_teach_t_bak B on A.relation_id = B.id order by A.id; select distinct A. ,B. from xin_stu_t_bak A inner join xin_teach_t_bak B on A.relation_id = B.id

    2024年01月17日
    浏览(50)
  • 体验文心一言AI大模型生成天津师范大学、中国科学技术大学、中北大学、伊利诺伊大学厄巴纳-香槟分校和巴黎笛卡尔大学报告

    天津师范大学是天津市属重点大学,位于天津市西青区宾水西道393号,简称“天师大”。天津师范大学入选教育部“卓越教师培养计划”、国家“特色重点学科项目”、”国家建设高水平大学公派研究生项目“、首批“新工科研究与实践项目”、“国家级大学生创新创业训练

    2024年02月16日
    浏览(34)
  • Cesium:CGCS2000坐标系的xyz坐标转换成WGS84坐标系的经纬高度,再转换到笛卡尔坐标系的xyz坐标

    作者:CSDN @ _乐多_ 本文将介绍使用 Vue 、cesium、proj4 框架,实现将CGCS2000坐标系的xyz坐标转换成WGS84坐标系的经纬高度,再将WGS84坐标系的经纬高度转换到笛卡尔坐标系的xyz坐标的代码。并将输入和输出使用 Vue 前端框架展示了出来。代码即插即用。 网页效果如下图所示, 一、

    2024年02月06日
    浏览(43)
  • 大数据开发——Hive实战案例

    由于使用的是orc方式进行存储,所以我们需要建立一个临时表,通过查询插入的方式将数据插入到最终表中。 创建临时视频表 创建临时用户表 加载原数据到临时表 创建视频表 创建用户表 由于初始表和最终表他们两者中的结构都是一样的,所以对其中一种进行解读 对于用户

    2023年04月09日
    浏览(31)
  • 大数据开发之Hive案例篇12:HDFS rebalance 一例

    公司的离线数仓是CDH集群,19个节点,HDFS存储空间大约400TB左右,使用量在200TB左右。 由于历史遗留的问题,数据仓库需要重构,新旧数仓在一段时间内需要并存,此时HDFS空间救不够了。 于是申请增加6个节点,每个节点挂20T的存储,累积给HDFS增加120TB左右空间。 通过Cloude

    2024年02月09日
    浏览(95)
  • Hive调优之小表Join大表

    1、小表join大表 将key相对分散,并且数据量小的表放在join的左边,这样可以有效减少内存溢出错误发生的几率,再进一步可以使用group 让小的维表(1000条以下的记录条数)先进内存,在map端完成reduce。 2、多个表关联 多个表关联时,最好拆分成小段,避免大sql(无法控制中间

    2024年02月04日
    浏览(36)
  • 大数据开发之Hive案例篇14:某个节点HDFS块比较多

    今天早上到公司,突然收到CDH集群某个节点的存储量的告警,如下图所示: 从图中可以看出,每个节点的HDFS空间是相同的,大多节点HDFS使用量在40%左右,而出问题的这个节点居然直逼80%,鉴于之前问题出现过多次,且每次都是利用空余时间使用HDFS的rebalance进行解决的,此处

    2024年02月11日
    浏览(39)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包