MaxCompute JOIN优化小结

摘要: Join是MaxCompute中最基本的语法,但由于数据量和倾斜问题,非常容易出现性能问题。一般情况下,join产生的问题有两大类: 数据倾斜问题:join会将key相同的数据分发到同一个instance上处理,如果某个key上的数据量特别多则会导致该instance处理时间比其他instance…

原文地址:http://click.aliyun.com/m/43804/

Join是MaxCompute中最基本的语法,但由于数据量和倾斜问题,非常容易出现性能问题。一般情况下,join产生的问题有两大类:

1.数据倾斜问题:join会将key相同的数据分发到同一个instance上处理,如果某个key上的数据量特别多则会导致该instance处理时间比其他instance处理时间长,这就是我们常说的数据倾斜,这也是join计算性能问题的罪魁祸首;

2.数据量问题:关联的两表基本没有热点问题,但两个表数据量都非常大同样会影响性能,比如记录数达几十亿条,如商品表、库存表等;

虽然MaxCompute中提供了一些通用的优化算法,但从业务角度解决性能问题往往更精确,更有效。对于MaxCompute sql优化,在云栖社区上已经有比较多的经验积累,本文主要对join产生的性能问题以及解法做些总结。

不同数据类型key关联

例子

浏览IPV日志以商品id关联商品表,假设日志表的商品id字段是string类型,商品表中的商品id是bigint类型,那么在关联中,关联key会全部转换成double类型进行比较,设想由于埋点问题日志表中的商品id存在很多非数值的脏数据,那么转换成double后值都变为NULL或者截取前面的数值,关联时就会产生数据倾斜问题,更严重的会造成数据错误。

解法

关联时手工进行数据格式转换,在这种情况下一般将bigint类型key转换成string类型。

select a.* 
from ipv_log_table a 
left outer join item_table b 
on a.item_id = cast(b.item_id as string)

思考下,假如反过来将string类型转换成bigint、假如IPV日志表中的商品id大部分为无效值(比如0)、又假如IPV日志表中没有无效值但是有热点key会有什么问题呢?下面的例子会解答这些问题。

小表join大表

Join中存在小表,一般这个小表在100M以内,可以用mapjoin,避免分发引起的长尾。拿上面的例子来说,假如商品表数据量只有几万条记录(这里只是打个比方,现实业务中商品表一般都是非常庞大的),但是IPV日志表中的商品id 80%值为0的无效值,且记录数有几十亿,如果采用上述SQL写法,数据倾斜是显而易见的,但利用mapjoin可以有效解决这个问题:

select /*+ MAPJOIN(b) */a.* 
from ipv_log_table a 
left outer join item_table b 
on a.item_id = cast(b.item_id as string)

mapjoin原理

把小表广播传递到所有的Join Task Instance上面,然后直接和大表做Hash Join,简单的说就是将join操作提前到map端,而非reduce端。

mapjoin使用注意点

小表在left outer join 时只能是右表, right outer join 时只能是左表, inner join 时无限制,full outer join不支持mapjoin;
mapjoin最多只支持8张小表,否则会报语法错误;
mapjoin所有小表内存限制不能超过2GB,默认为512M;
mapjoin支持小表为子查询;
mapjoin支持不等值连接或者使用or连接多个条件;

大表join大表存在无效值

在小表join大表时我们已经了解到通过mapjoin将小表全部加载到map端可以解决倾斜问题,但假如‘小表‘不够小,mapjoin失效的时候该怎么办呢?同样以本文第一个场景为例,IPV日志表中80%商品id都为无效值0(目前MaxCompute底层已经针对NULL值进行优化,已经不存在倾斜问题了),这时关联十几亿量级商品表那就是个灾难。

解法1-分而治之:
我们可以事先知道无效值是不可能关联出结果的,而且完全不需要参与关联,所以可以将无效值与有效值数据分开处理:

select a.visitor_id,b.seller_id
from (select from ipv_log_tablewhere item_id > 0
) a 
left outer join item_table b 
on a.item_id = b.item_idunion allselect a.visitor_id,cast(null as bigint) seller_id
from ipv_log_table
where item_id = 0

解法2-随机值打散:
我们也可以以随机值代替NULL值作为join的key,这样就从原来一个reduce来处理倾斜数据变成多reduce并行处理,因为无效值不参与关联,即使分发到不同reduce,也不会影响最终计算结果:

select a.visitor_id,b.seller_id 
from ipv_log_table a 
left outer join item_table b 
on if(a.item_id > 0, cast(a.item_id as string), concat('rand',cast(rand() as string))) = cast(b.item_id as string)

解法3-转化为mapjoin:
虽然商品表有十几亿条记录,不能直接通过mapjoin来处理,但在实际业务中,我们知道一天内用户访问的商品数是有限的,在业务中尤为明显,基于此我们可以通过一些处理转换成mapjoin:

select /*+ MAPJOIN(b) */a.visitor_id,b.seller_id 
from ipv_log_table a 
left outer join (select /*+ MAPJOIN(log) */itm.seller_id ,itm.item_idfrom (select item_id from ipv_log_table where item_id > 0group by item_id) log join item_table itmon log.item_id = itm.item_id
) b 
on a.item_id = b.item_id

解法对比

解法1和解法2是通用解决方案,对于解法1,日志表被读取两次,而解法2中只需读取一次,另外任务数解法2也是少于解法1的,所以总的来看解法2是优于解法1的。解法3是基于一定的假设,随着业务发展或者某些特殊情况下假设可能失效(比如一些爬虫日志,可造成访问商品数接近全量),这会导致mapjoin失效,所以在使用过程中要根据具体情况来评估。

一个古老的例子

最后要讲一个古老的优化case,虽然历史比较久远,目前已没有相关问题,但优化思路值得借鉴。情况是这样的,历史上并存过两套商品维表,一份主键是字符串id,新的商品表也就是目前在使用的主键是数字id,字符串id和数字id做了映射,存在商品表中的两个字段中,所以在使用中需要分别过滤数字id、字符串id然后分别和商品表关联,最后union起来得到最终结果。

思考下如果换成下面的优化思路是不是更优呢?

select ... 
from ipv_log_table a 
join (select auction_id as auction_id from auctionsunion allselect auction_string_id as auction_id from auctions where auction_string_id is not null
) b
on a.auction_id = b.auction_id

答案是肯定的,可以看到优化后商品表读取从2次降为1次,IPV日志表同样,另外MR作业数也从2个变为1个。

总结
对于MaxCompute sql优化最有效的方式是从业务的角度切入,并能够将MaxCompute sql转化为mapreduce程序来解读。本文针对join中各种场景优化都做了一些梳理,现实情况很可能是上述多场景的组合,这时候就需要灵活运用相应的优化方法,举一反三。

识别以下二维码,干货
图片描述

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

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

相关文章

李锐:金龙客车DMS上云实践以及对网络、混合云、弹性、运维、安全的思考

摘要: 金龙客车CIO李锐的深度分享。DMS是大金龙管理轻客经销、售后服务、售后备件销售、三包索赔的信息子系统。精细管控国内88家轻客经销商活动,集中轻客订单、在制、收发车、库存、核销、回款等全程通业务,具有金龙整合-创新-增效的特色&am…

不小心执行 rm -f,该如何恢复?

戳蓝字“CSDN云计算”关注我们哦!源 / 程序员的那些事前言每当我们在生产环境服务器上执行rm命令时,总是提心吊胆的,因为一不小心执行了误删,然后就要准备跑路了,毕竟人不是机器,更何况机器也有 bug&#x…

flowable 启动流程到完成所有任务之间的数据库变化

先给出流程图,很简单的流程,就是3个UserTask ProcessDefinition pdrepositoryService.createProcessDefinitionQuery().deploymentId(deployment.getId()).singleResult(); ProcessInstance piruntimeService.startProcessInstanceById(pd.getId());或…

如何使用dll ip转换_如何使用多功能转换插座更安全

作为专业的转换插头厂家,在制造多功能转换插座的时候都会做好了全面的安全考虑,包括但不仅限于以下安全设计:1. 高阻燃外壳材料:万浦电器的多功能转换插座的外壳大多以进口PC材料为主,阻燃温度高达750℃。在高温中不容…

2020计算机考研难度排名,2020年考研难度排名:100所高校上榜,中国人民大学排名第7...

据数据显示,2021年全国硕士研究生报考人数为341万左右,相对于2020年的290万,人数增加了近51万左右,而相对于100万左右考研计划录取人数,这也就意味着每3.5个人只有一个人能够被录取为硕士研究生,当然就考上…

玩转短视频?守护视频安全?AI智能提速?一分钱体验? 阿里云视频点播大招盘点...

摘要: 前言 随着近几年在线视频市场规模不断扩大,内容不断创新,用户粘性增加,在线视频市场的商业价值不断增长,各垂直行业纷纷引入视频能力,一时之间,视频已经成为了众多移动APP和在线平台沉淀用…

美女主播变大妈:在bug翻车现场说测试策略

戳蓝字“CSDN云计算”关注我们哦!美女主播变大妈:在bug翻车现场说测试策略文 | 珍妮兔这两天直播圈发生了一起严重的翻车事故。一个一直以“颜值主播”自称的网红女主播“乔碧萝殿下”,因为平台bug,露出了自己的真容,上…

一张图看懂阿里云网络产品[十一]云托付

摘要: 云托付(Cloud Hosting)是以阿里云的标准,提供给企业优质的机房托管资源、云专线网络以及增值服务,并与阿里云公有云产品结合,为企业搭建混合云提供基础资源。 原文地址:http://click.aliy…

springboot dubbo引入包_spring boot 集成 dubbo 企业完整版

一、什么是Spring Boot ?现阶段的 Spring Boot 可谓是太火了,为什么呢?因为使用方便、配置简洁、上手快速,那么它是什么?从官网上我们可以看到,它是 Spring 开源组织下的一个子项目,主要简化了 …

MaxCompute助力ofo实现精细化运营:日订单超3200万、整体运行效率提升76%

摘要:ofo小黄车大数据BI系统负责人龙利民为大家分享了ofo的上云体验,重点分享了MaxCompute的应用实践,最后对阿里云提出了自己的建议需求。 关于ofo小黄车 共享经济不仅与技术相关,它还关乎人类共同命运,关乎可持续发展…

微服务精华问答 | 为什么需要微服务?

戳蓝字“CSDN云计算”关注我们哦!过去几年来,“微服务架构”这个术语出现了,它描述了一种将软件应用程序设计为可独立部署的服务套件的特定方式。尽管这种架构风格没有确切的定义,但围绕业务能力,自动化部署&#xff0…

3个点让你彻底明白,为什么要使用MQ消息中间件?

3个点让你彻底明白,为什么要使用MQ消息中间件? 前言 一个用消息队列的人,不知道为啥用,有点尴尬。没有复习这点,很容易被问蒙,然后就开始胡扯了。 回答:这个问题,咱只答三个最主要的应用场景,不…

五位专家跟你讲讲为啥Python更适合做AI/机器学习

摘要: 为什么Python会在这股深度学习浪潮中成为编程语言的头牌?听听大牛如何解释吧! 原文地址:http://click.aliyun.com/m/43988/1.Python网络编程框架Twisted的创始人Glyph Lefkowitz(glyph):编…

c++如何显示图片_Vue+laravel后端添加商品后图片如何显示?

知识点:利用laravel的php artisan storage:link实现软连接php artisan storage:link命令执行完毕后,就会在项目里多出一个 public/storage,这个 storage 就是一个软链接,它指向 storage/app/public 目录。这样的话我们就可以直接访…

微软发布 Azure 物联网安全中心;阿里巴巴在美申请专利,以实现跨区块链统一管理;Google利用足球训练下一代人工智能……...

关注并标星星CSDN云计算极客头条:速递、最新、绝对有料。这里有企业新动、这里有业界要闻,打起十二分精神,紧跟fashion你可以的!每周三次,打卡即read更快、更全了解泛云圈精彩newsgo go go 合众汽车新能源哪吒N01 2020…

手把手教您解决90%的自然语言处理问题

摘要: 本文将讲解如何从零开始,有效地处理自然语言问题的指南和技巧:首先解释如何构建机器学习解决方案来解决上面提到的问题。然后转向更细致的解决方案。如何将5W和H应用于文本数据!文本数据无处不在从文本数据中提取有意义和值…

Spring Boot整合swagger2(生成有左右菜单式的api文档界面)

一、pom.xml内容&#xff1a; <!--依赖swagger2 zhongzk 2019.7.7 --> <dependency><groupId>io.springfox</groupId><artifactId>springfox-swagger2</artifactId><version>2.9.2</version> </dependency> <depend…

你会感觉容器使用起来很痛苦吗?

摘要&#xff1a; 容器问世4年了&#xff0c;它终于逐渐褪去神秘光环。不过&#xff0c;真正运用自如并不是件容易的事情。 在将容器用于生产环境中的过程中&#xff0c;你是否有很多痛苦&#xff0c;是否踩过很多坑&#xff0c;要吐好多苦水&#xff1f; 其实很大的一个问题在…

如何证明你不是在开发垃圾?

戳蓝字“CSDN云计算”关注我们哦&#xff01;作者 | 珍妮兔 来源| 轻松做软件需要懂垃圾分类的不仅仅只有家庭主妇和煮夫&#xff0c;还有程序员。如果你开发的功能跑不通&#xff0c;你是在开发干垃圾&#xff1b;如果你的代码害得别人的功能跑不通&#xff0c;你是在开发湿垃…

你的专属云资源管家!阿里云正式对外发布云解析PrivateZone!

摘要&#xff1a; 近日&#xff0c;阿里云宣布云解析PrivateZone正式对外公测&#xff0c;该产品是基于阿里云专有网络VPC&#xff08;Virtual Private Cloud&#xff09;环境的私有域名解析和管理服务&#xff0c;使用户在自定义的一个或多个专有网络VPC中快速构建DNS系统&…