spark-sql orderby遇到的shuffle问题

备注:

By 远方时光原创,可转载,open

合作微信公众号:大数据左右手 

背景:

在处理500个GB历史数据orderBy('key')时候遇到的shuffle问题

org.apache.spark.shuffle.MetadataFetchFailedException: Missing an output location for shuffle 0 partition 0

一般在执行数据量较大的spark任务时经常会出现MetadataFetchFailedException

报错分析:

这里是报的shuffle中获取不到元数据的异常,没有空间用于shuffle了

shuffle又分为shuffle read(理解为mapReduce中的map) 和shuffle write (理解为mapReduce中的Reduce)两个部分。shuffle write的分区数由上一阶段的RDD分区数控制,shuffle read(Map阶段)的时候数据的分区数则是由spark提供的一些参数控制,如果这个参数值设置的很小,同时shuffle read的量很大,那么将会导致一个task需要处理的数据非常大。结果导致JVM crash,从而导致取shuffle数据失败,同时executor也丢失了。

简单来说就是下图,蓝色框框map Task资源不足,或者能够工作的map task不够多(并行度不够),处理那么多数据

知识回顾

什么叫MapReduce:

一个比较形象的语言解释MapReduce:  
我们要数图书馆中的所有书数量。小罗数1号书架,小蒋数2号书架。这就是“ Map”。我们人越多,数书就更快。
现在我们到一起,把所有人的统计数加在一起。这就是“ Reduce

注:大数据处理数据能力增强无非就是:1.增加数书的人数(并行度增加) 2.加强数书人自身能力,比如小罗会一目十行,记忆力变高(core,内存增加

什么叫shuffle:

Shuffle 的本意是扑克的“洗牌,打乱次序”,在分布式计算场景中,它被引申为集群范围内跨节点、跨进程的数据分发。

上图中在做形状分类时,集群会需要大量资源进行磁盘和网络的I/O。在DAG的计算链条中,Shuffle环节的执行性能往往是最差的。

我们来解决问题:

解决shuffle一般思路:

1.增加executor的内存spark.executor.memory
2.考虑用broadcast或者map join 进行规避shuffle的产生
3.在shuffle前进行过滤,减少shuffle的数据量
4.提高并行度
5.考虑是否有数据倾斜现象的产生

- 先说第5点,是否数据倾斜,我groubykey然后count然后sort(倒序),只有两个ID是大概3倍于其他ID,没有出现几十倍以上倾斜,所以我认为数据还算均匀

ps: 几十倍~几百倍那种倾斜的话,正常id的数据正常处理,异常id单独拎出来处理,加盐(id_随机数),再排序,再减盐(id_去除随机数),二阶段再排序,正常id数据和异常处理后的数据合并

- 第2点,广播变量

大表join小表,小表(<10M)默认是自动广播的

如果有什么变量需要被每一个executor共享使用再考虑使用广播变量,我这个排序场景不适用

- 第3点 减少shuffle的数据量,这个我也有考虑,原本key三列合并为一列(key: id_data_type),没有用到的列我也drop掉

- 最后说第1点增加executor的内存spark.executor.memory和第4点提高并行度是我们最需要考虑的,因为数据没有过于数据倾斜,最先想到的就是map(shuffle read)或者reduce(shuffle write)资源不足,大数据重要原则:自己能力不行,切记找兄弟,加节点 加节点内存,资源足够情况下可以解决绝大多数shuffle问题

图片中(memory拼错了...)

.config("spark.executor.instances", "10")
.config("spark.executor.cores", "10")
.config("spark.executor.memory", "16")

升级完计算资源运行飞快

总结:

不是数据倾斜问题的话,优先考虑增加计算资源解决shuffle

  • 32
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
Spark-Thrift和Spark-SQLSpark框架中的两个组件,它们有以下区别: 1. Spark-SQLSpark的一个模块,用于处理结构化数据,支持SQL查询和DataFrame API。它提供了一种高效且易于使用的方法来处理和分析结构化数据。用户可以使用SQL语句或DataFrame API来查询和操作数据。Spark-SQL允许用户直接在Spark应用程序中使用SQL查询,而无需编写复杂的MapReduce代码。 2. Spark-Thrift是Spark的一个独立服务,它提供了一个标准的Thrift接口,用于执行SQL查询。它可以作为一个独立的进程运行,并通过网络接收来自客户端的SQL查询请求,并将查询转发到Spark集群中的Spark-SQL模块进行处理。Spark-Thrift使得可以使用不同的编程语言,如Java、Python、R等,通过Thrift接口与Spark集群交互。 因此,Spark-SQLSpark框架中用于处理结构化数据的模块,而Spark-Thrift是提供Thrift接口让用户可以使用不同编程语言与Spark-SQL模块交互的独立服务。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [CDH15.0支持spark-sqlspark-thrift-server](https://blog.csdn.net/u012458821/article/details/87635599)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* [122.Thrift和spark-sql客户端部署](https://blog.csdn.net/m0_47454596/article/details/126856172)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值