问题导读

1.本文遇到了什么问题?
2.遇到问题后,做了哪些分析?
3.本文解决倾斜使用哪些方法?
4.本次数据倾斜那种方法更有效?
5.解决性能优化问题的原理是什么?

优化后效果
1.业务处理中存在复杂的多表关联和计算逻辑(原始数据达百亿数量级)
2.优化后,spark计算性能提升了约12倍(6h-->30min)
3.最终,业务的性能瓶颈存在于ES写入(计算结果,ES索引document数约为21亿 pri.store.size约 300gb)

1. 背景
业务数据不断增大, Spark运行时间越来越长, 从最初的半小时到6个多小时
某日Spark程序运行6.5个小时后, 报“Too large frame...”的异常
org.apache.spark.shuffle.FetchFailedException: Too large frame: 2624680416

2. 原因分析
2.1. 抛出异常的原因
Spark uses custom frame decoder

(TransportFrameDecoder) which does not support frames larger than 2G.

This lead to fails when shuffling using large partitions.

根本原因: 源数据的某一列(或某几列)分布不均匀,当某个shuffle操作是根据此列数据进行shuffle时,就会造成整个数据集发生倾斜,即某些partition包含了大量数据,超出了2G的限制。

异常,就是发生在业务数据处理的最后一步left join操作

2.2. 粗暴的临时解决方法
增大partition数, 让partition中的数据量<2g
由于是left join触发了shuffle操作, 而spark默认join时的分区数为200(即spark.sql.shuffle.partitions=200), 所以增大这个分区数, 即调整该参数为800, 即spark.sql.shuffle.partitions=800

2.3. 解决效果
Spark不再报错,而且“艰难”的跑完了, 跑了近6个小时!
通过Spark UI页面的监控发现, 由于数据倾斜导致, 整个Spark任务的运行时间是被少数的几个Task“拖累的”

3. 思考优化

3.1. 确认数据倾斜
方法一: 通过sample算子对DataSet/DataFrame/RDD进行采样, 找出top n的key值及数量
方法二: 源数据/中间数据落到存储中(如HIVE), 直接查询观察

3.2. 可选方法

1.HIVE ETL 数据预处理
把数据倾斜提前到 HIVE ETL中, 避免Spark发生数据倾斜
这个其实很有用

2.过滤无效的数据 (where / filter)
NULL值数据
“脏数据”(非法数据)
业务无关的数据

3.分析join操作, 左右表的特征, 判断是否可以进行小表广播 broadcast
(1)这样可避免shuffle操作,特别是当大表特别大
(2)默认情况下, join时候, 如果表的数据量低于spark.sql.autoBroadcastJoinThreshold参数值时(默认值为10 MB), spark会自动进行broadcast, 但也可以通过强制手动指定广播
visitor_df.join(broadcast(campaign_df), Seq("random_bucket", "uuid", "time_range"), "left_outer")
业务数据量是100MB
(3)Driver上有一个campaign_df全量的副本, 每个Executor上也会有一个campaign_df的副本
(4)JOIN操作, Spark默认都会进行 merge_sort (也需要避免倾斜)

4.数据打散, 扩容join
分散倾斜的数据, 给key加上随机数前缀
A.join(B)

1.提高shuffle操作并行度
spark.sql.shuffle.partitions

2.多阶段
aggregate操作: 先局部聚合, 再全局聚合
给key打随机值, 如打上1-10, 先分别针对10个组做聚合
最后再统一聚合
join操作: 切成多个部分, 分开join, 最后union
判断出,造成数据倾斜的一些key值 (可通过观察或者sample取样)
如主号
单独拎出来上述key值的记录做join, 剩余记录再做join
独立做优化, 如broadcast
结果数据union即可

3.3. 实际采用的方法
HIVE 预处理
过滤无效的数据
broadcast
打散 --> 随机数
shuffle 并行度

Example:

......visitor_leads_fans_df.repartition($"random_index").join(broadcast(campaign_df), Seq("random_bucket", "uuid", "time_range"), "left_outer").drop("random_bucket", "random_index")......
复制代码

原文链接

https://cloud.tencent.com/developer/article/1621351

----------------------------END----------------------------

如果你也是大数据、人工智能爱好者,加微信领书100本大数据、人工智能、区块链等精选书籍,还可以加讨论群交流。

 本公众号精彩文章推荐:

【1】数据中台到底如何落地实现含架构图及代码

【2】基于Flink商品实时推荐系统项目大数据及算法

【3】ES学习精品系列文章汇总及下载

【4】About云VIP黄金会员

【5】Shell大全:可以应用于工作及面试

【6】About云 VIP总结【2019年】

【7】大数据实用组件Hudi

【8】数据治理:白话打通对Atlas的理解

工作经验分享:Spark调优【优化后性能提升1200%】相关推荐

  1. 【Spark深入学习 -14】Spark应用经验与程序调优

    ----本节内容------- 1.遗留问题解答 2.Spark调优初体验 2.1 利用WebUI分析程序瓶颈 2.2 设置合适的资源 2.3 调整任务的并发度 2.4 修改存储格式 3.Spark调 ...

  2. rdd数据存内存 数据量_大数据开发-Spark调优常用手段

    Spark调优 spark调优常见手段,在生产中常常会遇到各种各样的问题,有事前原因,有事中原因,也有不规范原因,spark调优总结下来可以从下面几个点来调优. 1. 分配更多的资源 分配更多的资源: ...

  3. UI设计汪汪Yuki丨云沃客工作经验分享

    原文链接 UI设计汪汪Yuki丨云沃客工作经验分享 笑一笑930509 2017-05-15 18:53:19 浏览27 评论0 发表于: 云工作平台 IT众包 云沃客 远程工作 摘要: 一枚来自 & ...

  4. 跟我一起学【Spark】之——Spark调优与调试

    第8章 Spark调优与调试 1.总结Spark的配置机制 2.理解Spark应用性能表现的基础知识.设置相关配置项.编写高性能应用设计模式 3.探讨Spark的用户界面.执行的组成部分.日志机制 8 ...

  5. MySQL 调优/优化的 101 个建议!

    转载自 MySQL 调优/优化的 101 个建议! MySQL是一个强大的开源数据库.随着MySQL上的应用越来越多,MySQL逐渐遇到了瓶颈.这里提供 101 条优化 MySQL 的建议.有些技巧适 ...

  6. 软件测试工作经验分享

    最近,部门刚毕业入职的小MM跟大家提议,让大家把自己的软件测试工作经验分享一下,我整理了一下,可能不全. 测试工作经验分享 天晴于2016年7月13日 一.测试阶段划分 1. 单个模块功能测试时间相对 ...

  7. Spark学习之Spark调优与调试(7)

    Spark学习之Spark调优与调试(7) 1. 对Spark进行调优与调试通常需要修改Spark应用运行时配置的选项. 当创建一个SparkContext时就会创建一个SparkConf实例. 2. ...

  8. 浙大研究生Hadoop工作经验分享

    为什么80%的码农都做不了架构师?>>>    浙大研究生Hadoop工作经验分享http://pan.baidu.com/s/1sjt5YKP 更多精彩内容请关注:  转载于:ht ...

  9. 【Spark调优】大表join大表,少数key导致数据倾斜解决方案

    [Spark调优]大表join大表,少数key导致数据倾斜解决方案 参考文章: (1)[Spark调优]大表join大表,少数key导致数据倾斜解决方案 (2)https://www.cnblogs. ...

最新文章

  1. 曾因「抢车位」出圈儿,神奇的Mask R-CNN了解一下?
  2. 数组中子数组运算常见写法
  3. java中queue排序_Java中常见的排序算法有哪些?---选择排序
  4. 产品经理如何高效的做用户调研?
  5. java putall实现,Java EnumMap putAll()
  6. ajax put请求_前端基础面试:手写一个ajax,说说XMLHttpRequest 都有哪些属性?
  7. rabbitmq 延迟队列_Delayed Message 插件实现 RabbitMQ 延迟队列
  8. web开发方法_确保进入Web开发的最快方法
  9. python 库 类_在Python中导入库类
  10. limbo pc for android,「Limbo PC emulator」可以让安卓手机安装 Windows 10 了
  11. 手机sim卡插到电脑上网_怎么用手机卡在电脑上上网
  12. java假死_分析java进程假死状况
  13. 常见的服务器虚拟化产品都有哪些,桌面虚拟化产品主要有哪几种主流技术分类呢?...
  14. 有监督学习、无监督学习、半监督学习、强化学习
  15. java 绘制六边形_六边形架构 Java 实现
  16. 芮城县县名由来 芮伯庙 古魏城 芮伯万 永乐县
  17. 微信小程序java装修家装系统
  18. 从 jsonpath 和 xpath 到 SPL
  19. 护理管理学选择题汇总(人卫第三版)
  20. 美国南加州大学研究生计算机专业申请条件,美国南加州大学计算机研究生申请条件有哪些呢...

热门文章

  1. robot_marm catkin_make报错
  2. yxc_第一章 基础算法(三)_区间合并
  3. coreldraw x8里线段显示尺寸_CorelDRAW X8如何精确添加辅助线
  4. 今天我们聊一聊程序员怎么进国企,附上我的2021年国企面经一份,希望对大家有帮助!
  5. win7系统自带的虚拟xp模式
  6. 视觉SLAM(二):相机与图像
  7. 像素级分层语义图像分割
  8. 双目视觉三维重建框架
  9. VC组合框的使用示例
  10. 今日分享-ios蓝牙