KiCad 华秋发行版 new
供应链、设计、制造,一体成就未来
华秋PCB
高可靠多层板制造商
华秋SMT
高可靠一站式PCBA智造商
华秋商城
自营现货电子元器件商城
PCB Layout
高多层、高密度产品设计
钢网制造
专注高品质钢网制造
BOM配单
专业的一站式采购解决方案
华秋DFM
一键分析设计隐患
华秋认证
认证检测无可置疑
发资料
发帖
提问
发视频
扫码添加小助手
加入工程师交流群
一、数据倾斜的基本概念
01 什么是数据倾斜?
02 数据倾斜发生时的现象?
(1)绝大多数task执行得都非常快,但个别task执行的极慢。
(2)原本能正常执行的Spark作业,某天突然爆出OOM(内存溢出)异常。观察异常栈,是我们写的业务代码造成的。
03 通用的常规解决方案
(1)增加jvm内存,这适用于第一种情况(唯一值非常少,极少数值有非常多的记录值(唯一值少于几千)),这种情况下,往往只能通过硬件的手段来进行调优,增加jvm内存可以显著的提高运行效率。
(2)增加reduce的个数,这适用于第二种情况(唯一值比较多,这个字段的某些值有远远多于其他值的记录数,但是它的占比也小于百分之一或千分之一),我们知道,这种情况下,最容易造成的结果就是大量相同key被partition到一个分区,从而一个reduce执行了大量的工作,而如果我们增加了reduce的个数,这种情况相对来说会减轻很多,毕竟计算的节点多了,就算工作量还是不均匀的,那也要小很多。
(3)自定义分区,这需要用户自己继承partition类,指定分区策略,这种方式效果比较显著。(4)重新设计key,有一种方案是在map阶段时给key加上一个随机数,有了随机数的key就不会被大量的分配到同一节点(小几率),待到reduce后再把随机数去掉即可。(5)使用combinner合并,combinner是在map阶段,reduce之前的一个中间阶段,在这个阶段可以选择性的把大量的相同key数据先进行一个合并,可以看做是local reduce,然后再交给reduce来处理,这样做的好。 04 通用定位发生数据倾斜的代码
(1)数据倾斜只会发生在shuffle中,下面是常用的可能会触发shuffle操作的算子:distinct、groupByKey、reduceByKey、aggregateByKey、join、cogroup、repartition等。出现数据倾斜时,可能就是代码中使用了这些算子的原因。
(2)通过观察spark UI,定位数据倾斜发生在第几个stage中,如果是用yarn-client模式提交,那么本地是可以直接看到log的,可以在log中找到当前运行到了第几个stage;如果用yarn-cluster模式提交,可以通过Spark Web UI 来查看当前运行到了第几个stage。此外,无论是使用了yarn-client模式还是yarn-cluster模式,我们都可以在Spark Web UI 上深入看一下当前这个stage各个task分配的数据量,从而进一步确定是不是task分配的数据不均匀导致了数据倾斜。 二、 Hive数据倾斜
1、Hive的执行是分阶段的,map处理数据量的差异取决于上一个stage的reduce输出,所以如何将数据均匀的分配到各个reduce中,就是解决数据倾斜的根本所在。
2 、造成数据倾斜的原因
1)、key分布不均匀
2)、业务数据本身的特性
3)、建表时考虑不周
2)SQL语句调节a、如何Join: 关于驱动表的选取,选用join key分布最均匀的表作为驱动表。 做好列裁剪和filter操作,以达到两表做join的时候,数据量相对变小的效果,避免笛卡尔积。 Hive中进行表的关联查询时,尽可能将较大的表放在Join之后。
b、大小表Join,开启mapjoin
mapjoin的原理: MapJoin 会把小表全部读入内存中,在map阶段直接拿另外一个表的数据和内存中表数据做匹配,由于在map是进行了join操作,省去了reduce 阶段,运行的效率就会高很多。参与连接的小表的行数,以不超过2万条为宜,大小不超过25M。设置参数
将热点key打散,但是需要注意,尽量不要在join时,对关联key使用rand()函数。因为在hive中当遇到map失败重算时,就会出现数据重复(数据丢失)的问题,spark引擎使用rand容易导致task失败重新计算的时候偶发不一致的问题。可以使用md5加密唯一维度值的方式替代rand(), 比如: md5(concat(coalesce(sku_id, 0), '_', coalesce(dim_store_num, 0), '_', coalesce(store_id, 0), '_',coalesce(delv_center_id, 0))),其中concat的字段是表的唯一粒度;也可以使用hash。 d、count distinct大量相同特殊值,使用sum...group by代替count(distinct ) 例如
Spark优化数据倾斜的思路,join方式从SMJ方式改成BMJ的方式,但是只适合大小表的情况。优化思路一般是: 改join方式,开启spark自适应框架,优化sql。 1、开启sparksql的数据倾斜时的自适应关联优化
操作步骤:
1、针对KEY进行数量统计2、按照数量从大到小进行排序3、直接取 limit N 即可 方式二:通过sample抽样倾斜KEY适用场景:如果数据量很大,可以通过抽样进行抽取大KEY。能否抽取到大KEY一般和抽取数据比例有关系。操作步骤:
1、对KEY赋值为1,便于下一步进行计数
2、对KEY进行累计
3、对KEY和VALUE交换
4、针对KEY按照字典进行倒排
5、将KEY和VAlUE位置交换,还原到真实的
6、从已排序的RDD中,直接取前N条
数据倾斜一般由Shuffle时数据不均匀导致,一般有三类算子会产生Shuffle:Aggregation (groupBy)、Join、Window。 01 Aggregation
建议打散key进行二次聚合:采用对 非constant值、与key无关 的列进行hash取模,不要使用rand类函数。
目前支持该模式下的倾斜window,(仅支持3.0)
Spark 2.4开启参数
其他参数:
04 数据膨胀(Join)
由于Join语义限制,对于A left join skewed B之类的场景,无法对B进行划分处理,否则会导致数据正确性问题,这也是Spark项目所面临的难题。如果开启以上功能依然不能处理数据倾斜,可以通过开启倾斜key检测功能来定位是哪些key导致了倾斜或膨胀,继而进行过滤等处理。
审核编辑机:刘清
浏览量
浏览量
浏览量
浏览量
原文标题:浅谈离线数据倾斜
扫码添加小助手
加入工程师交流群
下载发烧友APP
电子发烧友观察
长沙市望城经济技术开发区航空路6号手机智能终端产业园2号厂房3层(0731-88081133)