当前位置: 首页 > news >正文

数据倾斜

数据倾斜是指,map /reduce程序执行时,reduce节点大部分执行完毕,但是有一个或者几个reduce节点运行很慢,导致整个程序的处理时间很长,这是因为某一个key的条数比其他key多很多(有时是百倍或者千倍之多),这条key所在的reduce节点所处理的数据量比其他节点就大很多,从而导致某几个节点迟迟运行不完。
症状和原因:

·    操作:join,group by,count distinct
·    原因:key分布不均匀,人为的建表疏忽,业务数据特点。
·    症状:任务进度长时间维持在99%(或100%),查看任务监控页面,发现只有少量(1个或几个)reduce子任务未完成;查看未完成的子任务,可以看到本地读写数据量积累非常大,通常超过10GB可以认定为发生数据倾斜。
·    倾斜度:平均记录数超过50w且最大记录数是超过平均记录数的4倍;最长时长比平均时长超过4分钟,且最大时长超过平均时长的2倍。
例子:
        select * from a join b;
        1. a表1000多万,b表不到2亿,用mapjoin显然不行;
        2. 设置参数 set hive.groupby.skewindata=true,不起作用;
        3. 由于关连键为手机号,自认为业务数据上不存在数据倾斜;
        后来通过查看每个表里面关联键的分布,才发现两个表里面都存在空串'',而且严重倾斜,大表里面的空串数量有400多万。
        将两个表的空串过滤后再进行关联,job时间由原来的40多分钟减少到2分钟。
        总结:
         1. 数据倾斜的原因就那么几种,逐一排查;
         2. 细心,动手,不能光凭感觉来判定;
         3. 判定某一个表的key是否存在数据倾斜,就是group by key,取top N来看;
数据倾斜常用解决方法:
        1. 万能膏药:hive.groupby.skewindata=true
        2. 大小表关联:将key相对分散,并且数据量小的表放在join的左边,这样有效减少内存溢出错误发生几率;再进一步,可用map join让小的维度表(1000条以下的记录条数)先进内存。在map端完成reduce.
        3. 大表和大表关联:把空值的key变成一个字符串加上随机数,把倾斜的数据分到不同的reduce上,由于null值关联不上,处理后并不影响最终结果。
        4. count distinct大量相同特殊值:(空值单独处理)count distinct时,将值为空的情况单独处理,如果是计算count distinct,可以不用处理,直接过滤,在最后结果中加1。如果还有其他计算,需要进行group by,可以先将值为空的记录单独处理,再和其他计算结果进行union。

相关文章:

  • Tomcat9启动乱码
  • @GetMapping和@RequestMapping的区别
  • 正则表达式-匹配A和B之间字符串
  • HTTPSConnectionPool(host='files.pythonhosted.org', port=443): Read timed out.
  • urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:833)
  • Mac下Chromedriver存放位置
  • 解决 Cannot open pip-script.py
  • Python安装docx库
  • Windows下Chromedriver存放位置
  • Python中str跟int的转换
  • Python同步遍历多个列表
  • Python3.6+selenium+xlwt爬取邮箱内容下载到Excel
  • python3 Manager 安装不成功
  • JQuery中 Uncaught ReferenceError: $ is not defined
  • Python中unittest.main(verbosity=2)
  • [译] 怎样写一个基础的编译器
  • 【Amaple教程】5. 插件
  • docker容器内的网络抓包
  • Fabric架构演变之路
  • iOS动画编程-View动画[ 1 ] 基础View动画
  • Javascripit类型转换比较那点事儿,双等号(==)
  • Magento 1.x 中文订单打印乱码
  • nginx(二):进阶配置介绍--rewrite用法,压缩,https虚拟主机等
  • Python socket服务器端、客户端传送信息
  • vue从创建到完整的饿了么(11)组件的使用(svg图标及watch的简单使用)
  • 记一次删除Git记录中的大文件的过程
  • 如何合理的规划jvm性能调优
  • 如何进阶一名有竞争力的程序员?
  • 如何使用Mybatis第三方插件--PageHelper实现分页操作
  • 数组的操作
  • 因为阿里,他们成了“杭漂”
  • 在weex里面使用chart图表
  • 资深实践篇 | 基于Kubernetes 1.61的Kubernetes Scheduler 调度详解 ...
  • ​linux启动进程的方式
  • ​用户画像从0到100的构建思路
  • ###51单片机学习(1)-----单片机烧录软件的使用,以及如何建立一个工程项目
  • #【QT 5 调试软件后,发布相关:软件生成exe文件 + 文件打包】
  • #Linux(Source Insight安装及工程建立)
  • #Ubuntu(修改root信息)
  • #我与Java虚拟机的故事#连载16:打开Java世界大门的钥匙
  • (¥1011)-(一千零一拾一元整)输出
  • (173)FPGA约束:单周期时序分析或默认时序分析
  • (22)C#传智:复习,多态虚方法抽象类接口,静态类,String与StringBuilder,集合泛型List与Dictionary,文件类,结构与类的区别
  • (C#)Windows Shell 外壳编程系列4 - 上下文菜单(iContextMenu)(二)嵌入菜单和执行命令...
  • (二) Windows 下 Sublime Text 3 安装离线插件 Anaconda
  • (附源码)计算机毕业设计SSM基于java的云顶博客系统
  • (论文阅读30/100)Convolutional Pose Machines
  • (一)C语言之入门:使用Visual Studio Community 2022运行hello world
  • (已解决)报错:Could not load the Qt platform plugin “xcb“
  • *++p:p先自+,然后*p,最终为3 ++*p:先*p,即arr[0]=1,然后再++,最终为2 *p++:值为arr[0],即1,该语句执行完毕后,p指向arr[1]
  • .NET 6 在已知拓扑路径的情况下使用 Dijkstra,A*算法搜索最短路径
  • .Net MVC4 上传大文件,并保存表单
  • .net refrector
  • .NET简谈互操作(五:基础知识之Dynamic平台调用)
  • [ 蓝桥杯Web真题 ]-Markdown 文档解析