MaxCompute full outer join改写left anti join实践

简介: ods层数据同步时经常会遇到增全量合并的模型,即T-1天增量表 + T-2全量表 = T-1全量表。可以通过full outer join脚本来完成合并,但是数据量很大时非常消耗资源。本文将为您介绍在做增量数据的增加、更新时如何通过full outer join改写left anti join来实现的最佳实践。

背景

ods层数据同步时经常会遇到增全量合并的模型,即T-1天增量表 + T-2全量表 = T-1全量表。可以通过full outer join脚本来完成合并,但是数据量很大时非常消耗资源。

insert overwrite table tb_test partition(ds='${bizdate}')
select case when a.id is not null then a.id esle b.id end as id   ,if(a.name is not null, a.name, b.name) as name,coalesce(a.age, b.age) as age --这3种写法一样,都是优先取delta表的字段from
(select * from tb_test_delta where ds='${bizdate}'
) a
full outer join
(select * from tb_test where ds='${bizdate-1}'
) b
on a.id =b.id;

这种写法可实现新增和更新操作:

  • 新增是指增量表中新出现的数据,而全量表中没有;
  • 更新是指增量表和全量表中都有的数据,但优先取增量表的数据,覆盖历史表的数据。
    如下图所示,R2_1是增量表当天去重后增量数据,M3是全量表前一天的数据,而J4_2_3则是full outer join的执行图。

image.png

将J4_2_3展开会发现里面将增量和全量进行了merge join,当数据量很大(1288亿条)时会产生很大的shuffle开销。此时优化方案就是将full outer join改成 union all,从而避免join shuffle

优化模型

结论:full outer join改成hash cluster + left join +union all可以有效地降低计算成本,且有两种应用场景。先将模型进行抽象,假设有a和b两个表,a是增量表,b是全量表:

with a as ( select * from values  (1,'111'),(2,'two'),(7,'777') as (id,name) ) --增量,b as ( select * from values  (1,''),(2,'222'),(3,'333'),(4,'444') as (id,name) )  --全量

场景1:只合并新增数据到全量表

left anti join相当于not in,增量not in全量,过滤后只剩下完全新增的id,对全量中已有的id不修改:

--查询完全新增的id
select * from a left anti join b on a.id=b.id ;
--结果如下
+------------+------+
| id         | name |
+------------+------+
| 7          | 777  |
+------------+------+
--完全新增的合并全量表
select * from  a --增量表
left anti join b on a.id=b.id  
union all 
select * from b  --全量表
--结果如下
+------------+------+
| id         | name |
+------------+------+
| 1          |      |
| 2          | 222  |
| 3          | 333  |
| 4          | 444  |
| 7          | 777  |
+------------+------+

场景2:合并新增数据到全量表,且更新历史数据

全量not in增量,过滤后只剩下历史的id,然后union all增量,既新增也修改

--查询历史全量数据
select * from b left anti join a on a.id=b.id;
--结果如下
+------------+------+
| id         | name |
+------------+------+
| 3          | 333  |
| 4          | 444  |
+------------+------+
--合并新增数据到全量表,且更新历史数据
select * from  b --全量表
left anti join a on a.id=b.id
union all 
select * from a ; --增量表
--结果如下
+------------+------+
| id         | name |
+------------+------+
| 1          | 111  |
| 2          | two  |
| 7          | 777  |
| 3          | 333  |
| 4          | 444  |
+------------+------+

优化实践

步骤1:表属性修改

表、作业属性修改,对原来的表、作业进行属性优化,可以提升优化效果。

set odps.sql.reducer.instances=3072;  --可选。默认最大1111个reducer,1111哈希桶。
alter table table_name clustered by(contact_id) sorted by(contact_id) into 3072 buckets;--必选

步骤2:按照上述模型的场景1 或者 场景2进行代码改造。

这里先给出代码改造后的资源消耗对比:

原来的full outer jionleft anti join初始化原来的full outer jionleft anti join第二天以后
时间消耗8h30min38s1h4min48s7h32min30s32min30s
cpu消耗29666.02 Core * Min65705.30 Core * Min31126.86 Core * Min30589.29 Core * Min
mem消耗109640.80 GB * Min133922.25 GB * Min114764.80 GB * Min65509.28 GB * Min

可以发现hash cluster分桶操作在初始化有额外的开销,主要是按主键进行散列和排序,但是这是值得的,可一劳永逸,后续的读取速度非常快。以前每天跑需要8小时,现在除了分桶初始化需要1小时,以后每天实际只需要30分钟。

初始化执行图

图1:
image.png

  • M2是读全量表。
  • M4是读取增量表,在场景2的模型中增量表被读取了两次,其中:

    • R5_4是对主键去重(row_number)后用于后面的union all,里面包含了所有的增量数据;
    • R1_4是对主键去重(row_number)后用于left anti join,里面只包含了主键。
  • J3_1_2是left anti join,将它展开后看到这里还是有mergJoin,但是这只是初始化的操作,后面每天就不会有了。展开后如图2。
  • R6_3_5是将增量和全量进行union all,展开后如图3。
  • R7_6则是将索引信息写入元数据,如图3的MetaCollector1会在R7_6中sink。
    因此:图1中除了R5_4和R1_4是去重必须的,有shuffle。还有J3_1_2和R6_3_5这两个地方有shuffle。

图2:
image.png

图3:
image.png

第二天以后的执行图

图1:
image.png

同上,图1中的R3_2和R1_2是对增量去重必要对操作,有shuffle,这里忽略。

初始化执行图的J3_1_2和R6_3_5已经被合并到了M4_1_3,将其展开后如图2。即left anti join 和 union all这两步操作在一个阶段完成了,且这个阶段是Map 任务(M4_1_3),而不是Join任务或Reduce任务。而且全量表不在单独占用一个Map任务,也被合并到了M4_1_3,因此整个过程下来没有shuffle操作,速度提升非常明显。也就是说只需要一个M4_1_3就能完成所有到操作,直接sink到表。

R5_4则是将索引信息写入元数据,如图2的MetaCollector1会在R5_4中sink。

图2:
image.png

 

 

原文链接
本文为阿里云原创内容,未经允许不得转载。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/514969.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据中台 VS 传统大数据平台,这 8 点区别要了解

作者 | 彭锋 宋文欣 孙浩峰来源 | 大数据DT头图 | 下载于视觉中国传统大数据平台和数据仓库是数据中台的数据来源,建设数据中台是为了更好地服务于业务部门。下图展示了信息化系统、数据仓库、传统大数据平台、数据中台之间的关系,其中的箭头表示数据的主…

腾讯云~Kafka 监控 Kafka Eagle 图形化版本

文章目录1. 安装包下载2. 开启kafka JMX3. 安装JDK,配置JAVA_HOME4. 上传安装包、解压5. 配置Kafka-eagle环境变量6. 配置Kafka_eagle7. 配置ke.sh8. 启动Kafka_eagle9. 防火墙10. 访问Kafka eagle1. 安装包下载 官网地址:EFAK 本文使用3.0.1版本 2. …

维大杀器来了,未来云上服务器或将实现无人值守

云原生时代下,企业的IT运维面临架构复杂化、业务需求多样化和运维数据海量化等挑战,如何能够实现精准告警、异常智能诊断、根因定位、异常预测和异常自动修复,已成为企业数字化转型的急迫需求。 9月26日,阿里巴巴高级技术专家滕圣…

一家化纤工厂的数字化转型之路

在数字经济的浪潮中,零售业被公认为是数字化程度最高的行业,而与此形成鲜明对比的中国传统制造业,大部分还处于观望状态。当前,国内外形势正在发生深刻复杂的变化,越来越多的制造企业希望通过业务数字化与智能化&#…

java安全编码指南之:异常处理

异常简介 先上个图,看一下常见的几个异常类型。 所有的异常都来自于Throwable。Throwable有两个子类,Error和Exception。 Error通常表示的是严重错误,这些错误是不建议被catch的。 注意这里有一个例外,比如ThreadDeath也是继承自…

变局之际,聊聊物联网的过去、现在和未来

来源 | 鲜枣课堂头图 | 下载于视觉中国大家好,我是小枣君。前两天,我去上海参观了 IOTE物联网展。通过在现场的见闻,以及和专家们的交流探讨,我深刻感受到,物联网行业已经来到了一个重要的十字路口,将会发生…

130 秒揭秘 EDAS 3.0 如何平滑应对突发流量高峰,为您的业务保驾护航

云原生时代下,企业的IT运维面临架构复杂化、业务需求多样化和运维数据海量化等挑战,如何能够实现精准告警、异常智能诊断、根因定位、异常预测和异常自动修复,已成为企业数字化转型的急迫需求。 9月26日,阿里巴巴高级技术专家滕圣…

不重新打包,只修改 jar 包中的某个文件、某个类

用到的工具:WinRAR 特别注意:不能使用 7z,等其他打包工具(或者如果测试其他打包工具可以用,可以补充留言) 问题,一个已经打好的 jar 包,我只修改了其中一个类,如何替换。…

Spark On MaxCompute如何访问Phonix数据

简介: 如何使用Spark On MaxCompute连接Phonix,将Hbase的数据写入到MaxCompute的对应表中,目前没有对应的案例,为了满足用户的需求。本文主要讲解使用Spark连接Phonix访问Hbase的数据再写入到MaxCompute方案实践。该方案的验证是使…

码住!Flink Contributor 速成指南

简介: 不管初衷是什么,Flink 都非常欢迎大家一起建设和完善社区。在开始具体的贡献步骤之前,我们先简要介绍一下参与贡献的几种途径,以及 Clarify 关于开源贡献的一些固有印象。 作者:伍翀(云邪&#xff0…

手机访问真机调试显示: Cannot add property markTimeline, object is not extensible 怎么解决

实战 \SpringBootVue3 项目实战,打造企业级在线办公系统 3-2 用户登陆系统的流程说明 手机访问真机调试显示: Cannot add property markTimeline, object is not extensible 解决方案: 手机开热点让电脑连接,windows防火墙关闭…

浅谈MaxCompute资源规划管理及评估

简介: 本文主要介绍如何进行MaxCompute存储资源和计算资源的评估及规划管理。 一、MaxCompute资源规划背景介绍 MaxCompute资源主要有两类:存储资源、计算资源(包含cpu和内存)。存储资源用于存储MaxCompute的库表数据,计算资源用于运行sql、…

如何无缝迁移 SpringCloud/Dubbo 应用到 Serverless 架构

作者 | 行松 阿里巴巴云原生团队 本文整理自《Serverless 技术公开课》,“Serverless”公众号后台回复“入门”,即可获取系列文章 PPT。 背景 通过前面几节课程的学习,相信大家对于 SAE 平台已经有了一定的了解,SAE 基于 IaaS 层…

从程序媛到启明星辰集团云安全总经理,郭春梅博士揭秘云时代安全攻防之道...

从无序中寻找踪迹,从眼前事探索未来。2021 年正值黄金十年新开端,CSDN 以中立技术社区专业、客观的角度,深度探讨中国前沿 IT 技术演进,推出年度重磅企划栏目——「拟合」,通过对话企业技术高管大咖,跟踪报…

汽车仿真效率30%↑、药物研发效率20倍↑,阿里云获HPC CHINA 2020“最佳行业应用奖”

简介: 近日,HPC CHINA 2020 大会以线上线下——双线联动的形式同步召开,近 300 位重量级高性能计算(超算)领域专家学者与业界精英人士、CCF 高专委委员汇聚郑州,共同探索高性能计算的发展。 在本届 HPC CH…

linux 安装mysql5.7.25_生产版本

文章目录一、配置安装1. 部署总览2. 下载软件3. 解压重命名4. 创建组5. 安装数据库6. 配置my.cnf7. 添加开机启动8. 配置数据木库9. 启动mysql10. 登录修改密码11. 允许远程连接一、配置安装 1. 部署总览 服务器端口说明192.168.52.1223306master 2. 下载软件 mkdir /app cd…

山石网科发布重磅容器安全产品“山石云铠”,云安全版图再下一城

编辑 | 宋 慧 出品 | CSDN云计算 5月18日,山石网科正式发布了云安全的重磅新品——山石云铠。至此,山石网科云计算安全版图补全“容器安全”板块,已完成目前主流虚拟化技术及云服务场景网络安全产品的全面覆盖。 虽然是非常重要的产品发布&…

平台式可复用的应用集成能力,助您敏捷、高效的完成企业数字化转型

简介: 企业数字化转型往往是一个长期持续的过程,产品变革和技术迭代也在加速演进,连接性是数字化转型的关键推动因素,甚至将决定成败。为了应对普遍的集成要求,企业需要新一代更敏捷的集成能力框架,基于高效…

阿里云DNS 新增云上线路的智能解析功能

简介: 企业在云上部署单元化架构或内部服务链路时,需要考虑让数据(单元)离用户更近,避免跨单元获取数据,以此来满足自身低延时的诉求。阿里云DNS 新增基于云上链路的调度功能,进一步优化DNS智能…

进击的数据中台,企业数字化转型的新引擎

经历过“追捧”和“质疑”等种种考验后,当前,数据中台已经走到验证其价值的关键路口。 数据中台是企业数字化转型新引擎 在人工智能、大数据等技术发展和企业数字化转型加速的双重驱动下,2019年,数据中台在众多赛道中脱颖而出&a…