首页 > 其他分享 >【Spark】Spark数据倾斜解决方案、大表join小表及大表join大表优化思路

【Spark】Spark数据倾斜解决方案、大表join小表及大表join大表优化思路

时间:2024-12-14 14:28:05浏览次数:6  
标签:task join 小表 RDD key Spark 大表

如果觉得这篇文章对您有帮助,别忘了点赞、分享或关注哦!您的一点小小支持,不仅能帮助更多人找到有价值的内容,还能鼓励我持续分享更多精彩的技术文章。感谢您的支持,让我们一起在技术的世界中不断进步!

Spark 数据倾斜处理

Spark 中的数据倾斜问题主要指 shuffle 过程中出现的数据倾斜问题,是由于不同的 key 对应的数据量不同导致的不同 task 所处理的数据量不同的问题。

1. 解决方案一:两阶段聚合
  • 当使用了类似reduceByKey、groupByKey这样的聚合类算子时,可以考虑量两阶段聚合。
  • 实现思路:第一次是局部聚合,通过map算子给每个数据的key添加随机数前缀,对key进行打散,执行reduceByKey等聚合操作,第二次将各个key的随机前缀去掉,再次进行全局聚合操作,就可以得到最终结果了。
  • 对于聚合类的shuffle操作导致的数据倾斜,效果是非常不错的,通常可以解决数据倾斜问题。
  • 适用范围较窄,仅仅适用聚合类的shuffle操作,像join操作还得考虑其他方案。
2. 解决方案二:广播join
  • 广播Join是将小表的数据广播到每个计算节点,而不是将两个大表的数据进行Shuffle。当其中一个表的数据量较小(可以放入内存,默认值为10M,可调整),就可以使用广播连接来避免大规模的Shuffle,从而提高性能,减少数据倾斜的发生。
  • 适用小表与大表连接,且小表的大小适合广播到每个Executer节点。
3. 解决方案三:使用随机数前缀和扩容RDD进行join
  • 如果在进行join操作时,RDD中有大量的key导致数据倾斜,我们可以考虑对其中一个RDD数据进行扩容,另一个RDD进行稀释后再join。
  • 实现思路:选择一个RDD,对每条数据的key添加随机前缀(1n),选择另外一个RDD,对每条数据都打上(1n)随机前缀,也就是扩容n倍,将两个处理后的RDD进行join操作。
  • 如果两个RDD都很大,扩容方法不在适用,扩容方式只能缓解数据倾斜。
  • 如果有少数key导致数据倾斜,可以将这几个key从原来join的两个RDD中分别拆分出来形成一个单独的RDD,像上述思路一样使用随机数前缀和扩容RDD进行join,另外去除倾斜key的两个RDD正常join,将两次结果使用union算子合并起来即可。
4. 解决方案四:提高shuffle read task并行度
  • reduce端的并行度的提高就增加了reduce端task的数量,那么每个task分配到的数据量就会相应的减少,在一定程度上可以缓解数据倾斜问题。
  • 设置参数:spark.sql.shuffle.partitions ,默认值为200,适当提高。
  • 举例:如果原本有4个key,每个key对应20条数据,这4个key分配给一个task,那么这个task就要处理80条数据,如果增加shuffle
    read task为4,每个task就会分配到一个key,也就是每个task处理10条数据,执行时间会有所减少。
  • 该方案无法彻底解决数据倾斜,比如某个key对应的数据量有100w,无论task数量怎么增加,这个对应着100w数据的key肯定会分配到一个task中处理,还是会发生数据倾斜。
  • 适用有较多个key对应的数据量都比较大的情况。

Spark大表join小表(广播变量容不下小表)

  • 小表是否可以通过过滤减小存储空间,以完成广播。

  • 小表是否可以通过构建联合key替换超长的join keys来减小存储空间,以完成广播。

  • 若小表分布均匀,无法广播,则使用 join hints强行要求Spark SQL在运行时选择SHJ关联策略,相比SMJ,SHJ的执行效率会更好一些。原因是小表构建哈希表的开销,要小于两张表排序的开销。

    SELECT /*+ shuffle_hash(ad_click) */
           ad_click.idea_id, 
           SUM(ad_view.view_dsp) AS view_tatal
    FROM ad_view
    INNER JOIN ad_click ON ad_view.idea_id = ad_click.idea_id
    GROUP BY 
        ad_click.idea_id
    order by view_tatal desc
    

Spark大表join大表

  • 分而治之,能否将大表join大表转化为大表join小表,将大表均匀拆分后放进广播变量。
  • 拆分的关键在于拆分列的选取,拆分的基数要足够大才行,比如按照日期拆分多个小表。
  • 可以通过遍历日期,完成大表与每个小表的join,然后结果union到一起,替代大表join大表的操作。
  • 如果无法做到均匀拆分,只能依赖shuffle join去完成大表join大表,我们可以采用调优方法,例如存在数据倾斜时,使用两阶段shuffle消除倾斜,平衡Executor之间的计算负载。

标签:task,join,小表,RDD,key,Spark,大表
From: https://blog.csdn.net/qq_14815605/article/details/144453774

相关文章

  • 【大数据】【Spark】书籍推荐统计分析
    文章目录@[toc]数据集说明文件说明books.csv业务需求(1)统计最受关注的书籍Top10(2)统计书籍篇幅Top10(3)统计不同出版社出版的书籍数量(4)统计不同语言的书籍数量(5)统计最不受关注的高分书籍Top10(评分4.5以上,评分人数1w以上,评论数200以下)(6)统计不同年份出版的书籍数量(7)统计不......
  • spark读取hive和mysql的数据
    读取hive数据本质上:SparkSQL访问了Metastore服务获取了Hive元数据,基于元数据提供的地址进行计算启动以下服务:start-dfs.shstart-yarn.shmapred--daemonstarthistoryserver/opt/installs/spark/sbin/start-history-server.shhive-server-manager.shstartmetastore......
  • spark的共享变量
    因为RDD在spark中是分布式存储1、python中定义的变量仅仅在driver中运行,在excutor中是获取不到值的——广播变量2、若定义了一个变量进行累加,先分别在driver和excutor中进行累加,但是结果是不会主动返回给driver的——累加器BroadcastVariables广播变量driver中存放python......
  • Apache Spark 的基本概念和在大数据分析中的应用。
    ApacheSpark是一个开源大数据处理框架,被广泛应用于大规模数据分析、机器学习和图形处理等领域。它具有以下几个基本概念:RDD(ResilientDistributedDataset):RDD是Spark中最基本的数据抽象概念,代表了一个分布式的不可变的数据集合。RDD可以从外部数据源创建,也可以通过转换操作(......
  • 通过无缝调整来组织工作流程-JointJS+ 4.1
    通过无缝调整来组织工作流程2024年12月11日JointJS+4.1通过直观的拖放和内容感知功能增强了BPMN池、泳道和里程碑。JointJS+是一个图表库,提供自定义形状、数据绑定和高级布局算法等高级功能,让您能够创建复杂、交互且视觉上有吸引力的图表......
  • 记一次spark聚合清洗数据分区裁剪失效的问题
    背景公司有一套大数据的清洗流程,模式是:sparkwithhive。在执行聚合原始表的操作当中,有一个sparksql过滤条件,如下:yyyy='${yyyy}'andmm='${mm}'anddd='${dd}'andhh='${hh}'and(dimen='303'or(dimen='302'andas_burl=1))在跑任务......
  • mysql 大表drop和truncate 技术风险点
    1、用这个drop语句举例:droptableT;在之前的老版本中,但如果表T比较大,占用的各种缓存较多,这个SQL在对表进行删除的时候,需要依次清理掉bufferpool中的page,时间久回比较久;清理的动作会影响到在线的业务;在老版本的内核中的大致逻辑如下:扫描lru链表,如果page属于T表,就从lru链表,hash......
  • R语言data.table导入数据及键设置:data.table设置键值(key)、复合键设置、删除键、设置
    R语言data.table导入数据及键设置:data.table设置键值(key)、复合键设置、删除键、设置键值之后的数据连接(join)更加方便、设置了键值之后可以使用keyby语法代替by语法目录R语言data.table导入数据实战:data.table设置键值(key)、复合键设置、删除键、设置键值之后的数据连接(join......
  • 从MySQL JOIN 算法角度看如何优化SQL
    作者:京东物流京东物流一、前言在做MySQL的SQL优化时,如果只涉及到单表查询,那么大部分慢SQL都只需从索引上入手优化即可,通过添加合适的索引来消除全表扫描或者排序操作,执行效果,大概率能实现质的飞跃。 然而,在实际生产中,除了单表查询,更多的是多个表的联合查询,这样的查询通常是......
  • 【六级作文】万能理由(来源:B站roy大表哥)
    ChemistConveniencexxxisexceedinglyconvenientvery=exceedingly=extremely=exceptionallyHealth&Safetyimprovehealth=enhance/boost/promotephysicalandmentalwell-beingimpair/bedetrimentalto+healthEnvironmentsave/cons......