今天就跟大家聊聊有关大数据中Spark数据倾斜表现及解决方案是什么,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。
Spark数据倾斜表现
Spark引擎的大部分task执行时间比较一致,但是存在一些task的执行时间特别长,例如,500个task,其中498个执行较快,10分钟执行完成,剩余的两个task需要执行半个小时以上。
例行化执行的代码,某一天发生OOM问题,大概率是有数据倾斜了。
数据倾斜产生的原因是:shuffle的时候,需要将各个节点的相同的key拉取到同一个节点上,如果这个key对应的数据量非常大的时候,就会发生数据倾斜。
数据倾斜只会发生在shuffle过程中,Spark引擎会触发Shuffle的RDD算子有:distinct、repartition、reduceByKey、groupByKey、aggregateByKey、join
需要Shuffle的操作算子上直接设置并行度或者使用spark.default.parallelism设置。如果是Spark SQL,还可通过SET spark.sql.shuffle.partitions=num_tasks设置并行度。
该方法使用场景少,只能缓解数据倾斜,不能彻底解决数据倾斜。
通过Spark的Broadcast机制,将Reduce Join转化为Map Join,避免Shuffle,从而完全消除Shuffle带来的数据倾斜。
参与Join的一侧数据集足够小,并且主要适用于Join的场景,不适合聚合的场景,适用条件有限。
通过Spark的reduceByKey,统计每一个key的数量,超过指定数量的key或者数量top的key,作为异常key。当然也可以使用Sample对RDD进行抽样后,进行key的统计。
该方法的特点是:简单、粗暴,有一定的适用场景。
这个可以理解为大招
对于单个RDD的Shuffle操作,如groupByKey,将key值加上一个随机数的前缀。这样就需要执行二次聚合操作。
对于多个RDD的Shuffle操作,如join,将其中的一个有明显数据倾斜的RDD的key,加上n以内的随机数的前缀,另一个RDD的每一个key,都加上0-n的前缀,相当于RDD膨胀了n倍。
实际场景中可能需要上述方案的组合操作,比如:异常值过滤 + key值转换:加随机数,可以进行性能的优化:根据异常值,对RDD进行拆分:分别拆分成两个RDD,对于没有数据倾斜的,正常操作。对于有数据倾斜的加上随机前缀,再进行Shuffle操作。
看完上述内容,你们对大数据中Spark数据倾斜表现及解决方案是什么有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注亿速云行业资讯频道,感谢大家的支持。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。