阿里云大数据利器Maxcompute-使用mapjoin优化查询

摘要: small is beautiful,small is powerful

点此查看原文:http://click.aliyun.com/m/40815/

大数据计算服务(MaxCompute,原名 ODPS)是一种快速、完全托管的 GB/TB/PB 级数据仓库解决方案。
https://help.aliyun.com/document_detail/27800.html?spm=5176.7840267.6.539.po3IvS

主要有三种操作数据的方式SQL,UDF,MapReduce,了解hadoop的同学就比较熟悉这些东西了。

 那么Maxcompute的SQL和标准SQL最大的区别就是在Maxcompute中SQL会被解析成MapReduce去执行,当然也可以直接去写MapReduce去计算数据,UDF就是当自带的一些sql引用的函数不能满足业务计算的时候,自己通过代码编写一个函数,sql执行的时候引用。

由此可见实际上底层的计算都是依靠MapReduce这个计算引擎去执行。首先了解下什么是MapReduce。一份数据很大的时候在MaxCompute上是分布式存储的,也就是会分开存放到很多服务器,当一个任务执行的时候会从这些数据所在的服务器上启动一个进程读取这些数据,进行计算等操作,还会启动一个进程把这些数据进行汇总分析并输出。那前者进程叫做Map,后者进程叫做Reduce,合起来叫MapReduce任务。
使用sql操作数据的时候,会经常用到join。比如select * from A a join B b on a.id=b.id,这句sql在转换成MapReduce任务执行的时候:

1,map任务读数据,并对两个表的数据打上不同的tag用来区分
2,reduce端接收打标记的数据,将不同标记的表数据相同关联字段的数据放在一起输出
假设有两个表,我们暂且叫做Big表和Small表,其中Big表数据量比较大,分布式存在n台实例服务器上,Small表存在于一台服务器就放下了。
首先MaxCompute会启动一些Map的进程(Map任务)去读取这些数据分别打上标记,Map的个数是由一个参数控制的这里暂时不解释了。注意对于读取Big表的每个Map任务有可能在其他服务器上,那么这时候就需要到数据所在的服务器上把数据拉过来,Small表也会启动一个或者几个map任务读取文件系统中的数据,读取完成后会到Reduce端接收数据进行关联,判断关联字段相等的就放在一起输出,达到关联效果。
我们可以看一个例子,我准备了一个相对大的表train_user_lt,5G大小,数据大概7亿条。
准备了一个比较小的表map_join_test,只有3条数据。

select a.* from train_user_lt a left outer join map_join_test b on a.user_id = b.user_id;

执行了这句sql,如图
图片描述
这个执行的过程图是Maxcompute特有的可以帮助用户来查看任务执行的过程等叫做logview,是一个在ODPS Job提交后查看和Debug任务的工具https://help.aliyun.com/document_detail/27987.html

从图中可以看出分为三部分
1,大的表train_user_lt启动了39个map任务去读取数据707025259条
2,小的表启动一个map任务读取3条数据。
3,reduce阶段接收了3+707025259=707025262条数据,输出了707025259条数据,left outer join按照左边的大表输出。
但是看下消耗的时间是40分钟,这样来说算是很长的时间的。那么怎么优化提高速度呢,有没有一种比较方便,比较直接暴力的方式进行优化呢
那么本文的重点就来了–Mapjoin:
MAPJION会把小表全部读入内存中,把小表拷贝多份分发到大表数据所在实例上的内存里,在map阶段直接拿另外一个表的数据和内存中表数据做匹配,由于在map是进行了join操作,省去了reduce运行的效率会高很多。
使用的条件就是当一个大表和一个或多个小表做join时。SQL会将用户指定的小表全部加载到执行join操作的程序的内存中,从而加快join的执行速度。需要注意,在Maxcompute使用mapjoin时:
left outer join的左表必须是大表;
right outer join的右表必须是大表;
inner join左表或右表均可以作为大表;
full outer join不能使用mapjoin;
mapjoin支持小表为子查询;
使用mapjoin时需要引用小表或是子查询时,需要引用别名;
在mapjoin中,可以使用不等值连接或者使用or连接多个条件;
目前MaxCompute 在mapjoin中最多支持指定8张小表,否则报语法错误;
如果使用mapjoin,则所有小表占用的内存总和不得超过512MB。请注意由于MaxCompute 是压缩存储,因此小表在被加载到内存后,数据大小会急剧膨胀。此处的512MB限制是加载到内存后的空间大小;
多个表join时,最左边的两个表不能同时是mapjoin的表。
那么为什么说left outer join的左表必须是大表呢,
因为左表是大表的时候,会拿小表的全部数据和大表所在的实例服务器中的数据匹配一遍,刚好小表就在内存里。如果是左表是小表,那么需要把大表所有的数据拉过来跟小表匹配一遍,试想一下性能会如何。
来看下写法

select /* + mapjoin(b) */  a.* from train_user_lt a left outer join map_join_test b on a.user_id = b.user_id;
//就是在sql语句前加一个标记说这是mapjoin,把小表别名写在括号里

看下优化后的效果
图片描述
任务变成了两个部分,map端直接读取数据和内存里的小表进行关联,然后输出,少了一步reduce。也就是说关联从reduce转到map端进行join,省去了reduce这一步,所以叫做:mapjoin。
看下执行时间1分钟20多秒。之前是40分钟。当然我这边测试是把两个比较极端的数据进行比较,所以效果比较明显。由此看来大表关联小表的时候可以使用mapjoin进行优化查询。
那么mapjoin除了优化性能,还可以干什么呢。
MaxCompute SQL不支持支持在普通join的on条件中使用不等值表达式、or ,like等逻辑等复杂的join条件,但是在mapjoin中可以进行如上操作。例如

  select /*+ mapjoin(a) */a.total_price,b.total_pricefrom shop a join sale_detail bon a.total_price < b.total_price or a.total_price + b.total_price < 500;

总结:mapjoin看似很小的操作变化,实际上可以带来很大效率提升,另外还可以解决一些不等关联的业务场景。

正如马云经常说的一句话:
small is beautiful,small is powerful !

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

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

相关文章

GitHub下载文件时缓慢的问题

用记事本打开hosts文件&#xff0c;路径为 C:\Windows\System32\drivers\etc将下面3行添加到hosts文件中 140.82.114.3 github.com151.101.185.194 github.global.ssl.fastly.net192.30.253.121 codeload.github.com以管理员身份运行CMD&#xff0c;执行命令ipconfig /flushdn…

阿里云大数据利器之-RDS迁移到Maxcompute实现动态分区

摘要&#xff1a; 当前&#xff0c;很多用户的业务数据存放在传统关系型数据库上&#xff0c;例如阿里云的RDS&#xff0c;做业务读写操作。当数据量非常大的时候&#xff0c;此时传系关系型数据库会显得有些吃力&#xff0c;那么会经常有将mysql数据库的数据迁移到[大数据处理…

SaaS前世今生:老树开新花

戳蓝字“CSDN云计算”关注我们哦&#xff01;作者 | 文东海出品 | CSDN云计算&#xff08;ID&#xff1a;CSDNcould&#xff09;2019年3月26日&#xff0c;Adobe和微软宣布&#xff0c;两家公司准备展开一项合作&#xff0c;来提升双方的“销售和营销软件”的能力&#xff0c;进…

初体验-阿里云短视频 SDK For Android 快速接入

摘要&#xff1a; 近期的一些创意短视频 App 风靡年轻群体&#xff0c;比较典型的例如抖音、MUSE 等&#xff0c;阿里云也适时地推出了简单易用的短视频 SDK&#xff0c;帮助开发者们以较低的成本快速引入功能完备的创意短视频功能。本文主要介绍如何快速接入阿里云短视频 SDK …

解决Chrome插件安装时出现的“程序包无效”问题

https://blog.csdn.net/ysq5202121/article/details/50809494

【 CDN 最佳实践】CDN 命中率优化思路

摘要&#xff1a; CDN 在静态资源的加速场景中是将静态资源缓存在距离客户端较近的CDN 节点上&#xff0c;然后客户端访问该资源即可通过较短的链路直接从缓存中获取资源&#xff0c;而避免再通过较长的链路回源获取静态资源。因此 CDN的缓存命中率的高低直接影响客户体验&…

首帧秒开+智能鉴黄+直播答题,阿里云直播系统背后技术大起底

摘要&#xff1a; 想要快速实现直播能力&#xff0c;并对原有业务不产生任何影响&#xff0c;依托如阿里云一样的直播平台&#xff0c;来搭建移动直播系统&#xff0c;将技术难题交给阿里云&#xff0c;把更多的精力放在核心业务的本身&#xff0c;是最为稳妥和高效的选择。本文…

《云栖社区2017年度内容特辑》新鲜出炉!800+份大会PPT、20+技术专题、100+话题...快抱走!...

回首2017&#xff0c;云栖社区承载了太多的精彩内容&#xff0c;这一年大量的优秀团队入驻社区&#xff0c;600博主成为云栖专家&#xff0c;他们为读者奉献了无数精彩的内容——100W博文&#xff0c;300场直播&#xff0c;用户互动问答数超过6W&#xff1b;与此同时&#xff0…

K8S精华问答 | K8S 是什么?不是什么?

kubernetes&#xff0c;简称K8S&#xff0c;是用8代替8个字符“ubernete”而成的缩写。是一个开源的&#xff0c;用于管理云平台中多个主机上的容器化的应用&#xff0c;Kubernetes的目标是让部署容器化的应用简单并且高效&#xff08;powerful&#xff09;,Kubernetes提供了应…

FaaS如何在云2.0时代发挥优势,又将走向何方?

摘要&#xff1a; 过去十年&#xff0c;云服务深刻地改变了社会获取和使用计算能力的方式&#xff0c;云服务自身也以极快的速度演进。在基础设施云化之后&#xff0c;容器、Serverless等技术迅猛发展&#xff0c;开始推动业务能力的云化&#xff0c;云计算进入2.0时代。 点此查…

解锁新姿势 | 如何用配置中心实现全局动态流控?

摘要&#xff1a; 当资源成为瓶颈时&#xff0c;服务框架需要对消费者做限流&#xff0c;启动流控保护机制。流量控制有多种策略&#xff0c;比较常用的有&#xff1a;针对访问速率的静态流控、针对资源占用的动态流控、针对消费者并发连接数的连接控制和针对并行访问数的并发控…

53K!拿下阿里Python岗,这些技术点全考了!

Python又上热搜了&#xff01;”&#xff0c;最近笔者在逛脉脉时&#xff0c;发现这样的一条信息&#xff1a;看完后&#xff0c;我相信大家和我一样&#xff0c;what&#xff0c;Python这么时候值钱了&#xff1f;本篇文章&#xff0c;我将帮大家搞定两大疑问&#xff1a;1. P…

用WEB技术栈开发NATIVE应用:WEEX SDK原理详解

摘要&#xff1a; WEEX依旧采取传统的web开发技术栈进行开发&#xff0c;同时app在终端的运行体验不输native app。其同时解决了开发效率、发版速度以及用户体验三个核心问题。那么WEEX是如何实现的&#xff1f;目前WEEX已经完全开源&#xff0c;并捐给Apache基金会&#xff0c…

什么是java枚举_什么是java枚举

什么是java枚举&#xff1f;java 枚举的定义与用法一、枚举的定义&#xff1a;枚举是一种特殊的数据类型&#xff0c;之所以特殊是因为它既是一种类(class)类型却又比类型多了些特殊的约束&#xff0c;但是这些约束的存在也造就了枚举类型的简洁&#xff0c;安全性以及便捷性。…

基于阿里云Serverless架构下函数计算的最新应用场景详解(一)

摘要&#xff1a; Serverless概念是近年来特别火的一个技术概念&#xff0c;基于这种架构能构建出很多应用场景&#xff0c;适合各行各业&#xff0c;只要对轻计算、高弹性、无状态等场景有诉求的用户都可以通过本文来普及一些基础概念&#xff0c;看看这些场景是否对用户有一些…

浪潮云完成6亿元B轮融资,正推进上市;VMware收购AI初创公司Bitfusion;小爱同学App在苹果应用商店下架……...

关注并标星星CSDN云计算极客头条&#xff1a;速递、最新、绝对有料。这里有企业新动、这里有业界要闻&#xff0c;打起十二分精神&#xff0c;紧跟fashion你可以的&#xff01;每周三次&#xff0c;打卡即read更快、更全了解泛云圈精彩newsgo go go 华为Mate30 Lite贴膜曝光&am…

基于阿里云Serverless架构下函数计算的最新应用场景详解(二)

摘要&#xff1a; Serverless概念是近年来特别火的一个技术概念&#xff0c;基于这种架构能构建出很多应用场景&#xff0c;适合各行各业&#xff0c;只要对轻计算、高弹性、无状态等场景有诉求的用户都可以通过本文来普及一些基础概念&#xff0c;看看这些场景是否对用户有一些…

增长黑客系列:今天比昨天增长多少?快使用环比函数来分析日志

摘要&#xff1a; 增长黑客系列&#xff1a;今天比昨天增长多少&#xff1f;快使用环比函数来分析日志 在我们平时分析业务时&#xff0c;一个最重要的指标就是&#xff0c;今天比昨天增长多少&#xff0c;本周比上周增长多少&#xff1b;或者同上一个周期相比增长最大的分类是…

云计算将会让数据中心消失?

戳蓝字“CSDN云计算”关注我们哦&#xff01;作者 | 王洪鹏出品 | CSDN云计算&#xff08;ID&#xff1a;CSDNcould&#xff09;近年来企业应用云化明显&#xff0c;越来越多的企业开始将自己的公司业务转移到云平台之上&#xff0c;可能是迁到公有云&#xff0c;也可能是私有云…

巧用 Img / JavaScript 采集页面数据

摘要&#xff1a; 当我们有一个新内容时&#xff08;例如新功能、新活动、新游戏、新文章&#xff09;&#xff0c;作为运营人员总是迫不及待地希望能尽快传达到用户&#xff0c;因为这是获取用户的第一步、也是最重要的一步。 点此查看原文:http://click.aliyun.com/m/40929/…