长尾问题是分布式计算里最常见的问题之一。主要原因是因为数据分布不均,导致各个节点的工作量不同,整个任务就需要等最慢的节点完成才能完成。

Map长尾

主要原因是某些Map Instance读取的数据量相对于其他的Instance多很多。

优化方法:

  1. 使用统计好的中间层汇总表,减少大数据量读取;
  2. 行裁剪:检查代码读取的数据量是不是比自己的需求多,尽可能限制分区或者使用where条件过滤掉不需要的数据;
  3. 列裁剪:限制select的字段数据,尽量不用select *,列的利用率低。比如原表有100个字段,如果只用了其中1个字段,那么利用率只有1%。对于列数特别多的输入表,Map阶段处理只需要其中的某几列,可以通过在添加输入表时,明确指定输入的列,减少输入量;
  4. 使用union all:在所取的数据量很大的时候,可以尝试使用union all将所取的数据分开查询并集合在一起。比如要取3个月的数据,则可以分别写三段sql,每段取一个月的数据,再union all起来。

Reduce长尾

主要原因是分发键分布不均匀,存在热点数据(比如按照城市汇总用户量时,某一个城市的用户量占比超过60%,就可能出现Reduce长尾)。

优化方法:

  1. 使用统计好的中间层汇总表,这一点同Map长尾处理方式一样。
  2. 行裁剪/列裁剪:这一点也和Map长尾处理方式一样。
  3. 不同的列进行count distinct操作,造成map端数据膨胀,优化sql语句, 两次group by分多次处理

比如:

SELECT  CITY,COUNT(DISTINCT USER_ID) AS USER_COUNT
FROM    TABLE
GROUP BY CITY
;

如果长尾发生,可以考虑减少聚合时的数据量,比如可以先对CITY和USER_ID进行group by作为一个子查询,再在外层对CITY进行分组计算,具体优化语句为:

SELECT  CITY,COUNT(USER_ID) AS USER_COUNT
FROM    (SELECT  CITY,USER_IDFROM    TABLEGROUP BY CITY,USER_ID)
GROUP BY CITY
;

Join长尾

JOIN阶段会将JOIN Key相同的数据分发到同一个Join Instance上执行处理。如果某个Key上的数据量比较多,会导致该Instance执行时间比其他Instance执行时间长。该JOIN Task的大部分Instance已执行完成,但少数几个Instance一直处于执行中,这种现象称之为Join长尾。

主要原因是表关联的键(key)分布不均匀,存在热点(本质就是关联的时候key值出现1对多的情况,这个多的部分就是热点)。

优化方法:

  1. 进行关联之前对数据进行去重,或者先对每个表进行分组汇总,尽量使用主键(唯一键)进行关联。
  2. 两表关联存在热点key:

a、大小表关联,使用Mapjoin,将小表加载到内存,直接分发到Map Instance所在机器上,在读取的阶段就做hash-join。值得注意的是Mapjoin的小表大小有限制,而且小表必须要是从表(即不能是left join的左表,也不能是right join的右表)。

比如:假设表a左关联表b,b是小表:

SELECT  a.id,b.name
FROM    a
LEFT OUTER JOIN b
ON      a.id = b.id
;

转化为:

SELECT /*+mapjoin(b)*/a.id,b.name
FROM    a
LEFT OUTER JOIN b
ON      a.id = b.id
;

如果大小表关联,而小表是主表,此时无法使用mapjoin,参考如下处理方式:
先将小表和大表利用MAP JOIN进行inner join,得到小表和大表的交集中间表,且这个中间表一定是不大于大表的(key倾斜程度与表的膨胀大小成正比)。然后小表再和这个中间表进行LEFT JOIN,这样操作的效果等于小表LEFT JOIN大表。

b、关联的两个表都比较大。
首先考虑去重。其次考虑将热点数据分开处理:先将主表热点Key取出,再用热点Key切分成热点数据和非热点数据两部分分别处理,最后合并。

  1. JOIN Key存在很多空值导致长尾:此时可以将空值处理成随机值。因为空值无法关联上,只是分发到了一处,因此给予随机值既不会影响关联也能避免聚集。

假设a表的id存在很多空值,那么我们在关联的时候可以将关联条件转化。见下:

on a.id = b.id
--转化为
on coalesce(a.id,rand()*9999) = b.id

sql数据处理的长尾问题及优化相关推荐

  1. SQL Server 2016 查询存储性能优化小结

    SQL Server 2016已经发布了有半年多,相信还有很多小伙伴还没有开始使用,今天我们来谈谈SQL Server 2016 查询存储性能优化,希望大家能够喜欢 作为一个DBA,排除SQL Ser ...

  2. 如何对大量长尾关键词进行优化?

    在网站优化中,为了能够降低核心关键词的竞争力,通常都会采取长尾关键词优化来帮助网站提升排名和权重,对于用户体验也有一定的提升.因此网站做好长尾关键词的优化也非常重要,但网站关键词的筛选.布局等也都是有 ...

  3. 腾讯基于 Flink SQL 的功能扩展与深度优化实践

    简介:本文由腾讯高级工程师杜立分享,主要介绍腾讯实时计算平台针对 Flink SQL 所做的优化. 整理:戴季国(Flink 社区志愿者) 校对:苗文婷(Flink 社区志愿者) 摘要:本文由腾讯高级 ...

  4. SQL server 系统优化--通过执行计划优化索引(1) (转)

    SQL server 系统优化--通过执行计划优化索引(1) 前几天,远离上海,到了温州,在客户的这边处理系统慢,该系统每天正常down机7次左右,在线人员一多,系统运行缓慢,严重影响业务操作,到了无 ...

  5. 堆积密度怎么做_长尾关键词怎么优化?这样布局关键词排名效率高

    上一篇我们谈到了长尾关键词的挖掘,今天我们来谈谈长尾关键词如何优化的问题,如果还不知道怎么挖掘长尾关键词的可以通过传送门(什么是长尾关键词,长尾关键词如何挖掘?)进行了解. 长尾关键词的优化可以有效提 ...

  6. oracle 最大值及其_学习笔记:Oracle优化 SQL查询最大值 最小值时的优化方法案例...

    天萃荷净 select max(id),min(id) from table优化,分享开发DBA需求,在SQL语句查询最大值.最小值数据时的优化方式案例 1.查看数据库版本 SQL> selec ...

  7. sql declare用法_SQL语句的优化分析

    一.开门见山,问题所在 sql语句性能达不到你的要求,执行效率让你忍无可忍,一般会时下面几种情况. 网速不给力,不稳定. 服务器内存不够,或者SQL 被分配的内存不够. sql语句设计不合理 没有相应 ...

  8. 长尾关键词排名优化技巧

    长尾关键词该如何优化,通过关键词SEO排名提升网站流量转换是我们网站SEO的目标,而打造关键词优化是我们SEO的基础.很多情况下我们在 SEO时更多的关注是如何优化我们的关键词. 关键词SEO排名分析 ...

  9. php多表查询性能优化,MSSQL_SQL Server多表查询优化方案集锦,SQL Server多表查询的优化方案是 - phpStudy...

    SQL Server多表查询优化方案集锦 SQL Server多表查询的优化方案是本文我们主要要介绍的内容,本文我们给出了优化方案和具体的优化实例,接下来就让我们一起来了解一下这部分内容. 1.执行路 ...

最新文章

  1. 基于vue的公共looploading组件(vue循环加载--组件)
  2. hdu 1005 1021 递归超限 找规律 // 只要看题中n较大都是有规律的
  3. iOS开发-项目的完整重命名方法,图文教程。
  4. another app is currently hold yum lock问题
  5. Android Studio签名打包的两种方式
  6. Spring Boot中文乱码问题怎么解决(按步骤做)
  7. Miniconda3及pip换源(conda清华源关闭)
  8. Vs code自动生成Doxygen格式注释
  9. 搭建基于云端的中间层以支持跨平台的智能视觉服务
  10. 论坛头条内容链接地址有误
  11. 推荐系统-Task05推荐系统流程构建
  12. 编译安装dropbear
  13. perf-应用程序的调优与使用
  14. Linux总结篇 linux命令 虚拟机 - (二)
  15. 计算机管理-共享打印,打印机局域网共享怎么设置?最简单稳定的方法:一键共享...
  16. 免费好用的虚拟服务器,六大免费好用的虚拟主机管理系统
  17. CST STUDIO SUITE 2022 软件下载与安装教程
  18. 谷歌浏览器如何正确安装第三方已被停用的扩展插件
  19. 面对职场“毕业”,PMPMO应该如何从容的应对?如何跳槽能够大幅度升职加薪?【大海午餐】
  20. 20190401每周精品之理财

热门文章

  1. closed Stream.解决办法
  2. 电磁场理论笔记04:静电场的标量位
  3. AE粒子跟随手势特效
  4. Fms+Vcam实现flv网络直播
  5. 机器学习Matplotlib的简单使用
  6. 我分析了 6.5W 字的歌词,看到了这样的周杰伦
  7. NLP系列——(7)卷积神经网络
  8. 【FPGA】调用IP核实现心形波
  9. 我们进入“超空间”时代
  10. springboot+vue+Elementui学生考勤在线请假系统