数据倾斜的解决方案_第1页
数据倾斜的解决方案_第2页
数据倾斜的解决方案_第3页
数据倾斜的解决方案_第4页
数据倾斜的解决方案_第5页
已阅读5页,还剩10页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

数据倾斜的解决方案2学习任务了解设置参数解决数据倾斜了解sql语句优化解决数据倾斜3知识目标设置参数解决数据倾斜sql语句优化解决数据倾斜01能力目标掌握设置参数解决数据倾斜理解sql语句优化解决数据倾斜02学习目标4目录01Groupby倾斜解决方案02Join倾斜解决方案5Groupby倾斜解决方案开启map端部分聚合功能,就是将key相同的归到一起,减少数据量,这样就可以相对地减少进入reduce的数据量,在一定程度上可以提高性能。设置hive.map.aggr=true6Groupby倾斜解决方案如果发生了数据倾斜就可以通过它来进行负载均衡。当选项设定为true,生成的查询计划会有两个MRJob。第一个MRJob中,Map的输出结果集合会随机分布到Reduce中,每个Reduce做部分聚合操作,并输出结果,这样处理的结果是相同的Key有可能被分发到不同的Reduce中,从而达到负载均衡的目的;第二个MRJob再根据预处理的数据结果按照Key分布到Reduce中最后完成最终的聚合操作。设置hive.groupby.skewindata=true7Groupby倾斜解决方案countdistinct操作往往需要改写SQL,改写SQL语句前后差别很大,如下是修改前的SQL语句groupby查询:countdistinct改写修改过后,取出distinct关键字,采用子查询的方式提高查询速度,修改过的SQL语句如下:selecta,count(distinctb)ascfromtblgroupbya;selecta,count(*)ascfrom(selecta,bfromtblgroupbya,b)groupbya;8Join倾斜解决方案join造成的倾斜,常见情况是不能做map。join的两个表,其中一个是行为表,另一个是属性表。比如我们有三个表,一个用户属性表users,一个商品属性表items,还有一个用户对商品的操作行为表日志表logs。假设现在需要将行为表关联用户表。命令如下所示:设置skewjoin参数select*fromlogsajoinusersbona.user_id=b.user_id;其中logs表里面会有一个特殊用户user_id=0,代表未登录用户,假如这种用户占了相当的比例,那么个别reduce会收到比其他reduce多得多的数据。9Join倾斜解决方案因为要接收所有user_id=0的记录进行处理,使得其处理效果会非常差。hive给出的解决方案叫skewjoin,其原理把这种user_id=0的特殊值先不在reduce端计算掉,而是先写入hdfs,然后启动一轮mapjoin专门做这个特殊值的计算,期望能提高计算这部分值的处理速度。当然你要告诉hive这个join是个skewjoin,即:设置skewjoin参数hive.optimize.skewjoin=true;10Join倾斜解决方案针对join倾斜的问题,一般都是通过改写sql解决。对于上面这个问题,我们已经知道user_id=0是一个特殊key,那么可以把特殊值隔离开来单独做join,这样特殊值肯定会转化成mapjoin,非特殊值就是没有倾斜的普通join了,命令如下:特殊值分开处理法select*from(select*fromlogswhereuser_id=0)ajoin(select*fromuserswhereuser_id=0)bona.user_id=b.user_idunionallselect*fromlogsajoinusersbona.user_id<>0anda.user_id=b.user_id;11Join倾斜解决方案上面这种个别key倾斜的情况只是一种倾斜情况。最常见的倾斜是因为数据分布本身就具有长尾性质,比如我们将日志表和商品表关联:随机数分配法select*fromlogsajoinitemsbona.item_id=b.item_id;这个时候分配到热门商品的reducer就会很慢,因为热门商品的行为日志肯定是最多的,而且我们也很难像上面处理特殊user那样去处理item。为了解决这个问题会用到加随机数方法,就是在join的时候增加一个随机数,随机数的取值范围n相当于将item给分散到n个reducer,命令如下所示:12Join倾斜解决方案上面的写法里,对行为表的每条记录生成一个1-10的随机整数,对于item属性表,每个item生成10条记录,随机key分别也是1-10,这样就能保证行为表关联上属性表。这个做法是一个解决join倾斜比较根本性的通用思路,就是如何用随机数将key进行分散。随机数分配法selecta.*,b.*from(select*,cast(rand()*10asint)asr_idfromlogs)ajoin(select*,r_idfromitemslateralviewexplode(range_list(1,10))rlasr_id)bona.item_id=b.item_idanda.r_id=b.r_id查询命令如下:13Join倾斜解决方案最后一种是因为业务设计导致的问题,也就是说即使行为日志里面joinkey的数据分布本身并不明显倾斜,但是业务设计导致其倾斜。比如对于商品item_id的编码,除了本身的id序列,还人为的把item的类型也作为编码放在最后两位,这样如果类型1(电子产品)的编码是00,类型2(家居产品)的编码是01,并且类型1是主要商品类,将会造成以00为结尾的商品整体倾斜。这时,如果reduce的数量恰好是100的整数倍,

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论