spark 内存溢出导致executor挂掉的原因

通常我看看到的表象是类似于 shuffle fetch fail ..caused by 某个host lost connection 这就是内存溢出挂掉了。为什么会出现这种情况呢。

1. 首先对于缓存非序列话数据的集合都实现了SizeTracker接口类,该接口有估计集合大小的方法,而SizeTracker接口类实际使用的是采样估计,在两次较为准确的采样估计之间,集合的大小是通过平均数计算的方法得到的大小,就容易导致如果在前几次更新的数据较小导致平均数较小,而现在数据较大,计算得到的大小远小于实际大小

2.对于集合的实际大小计算这里选择SizeEstimator进行计算,而SizeEstimator进行计算的方法是通过不断寻找集合引用的其他对象,计算每一个对象的大小,这样就会造成某些已经没有引用关联的类不能参与计算,而且这些类此时也还没有被垃圾回收器进行回收,就会导致计算得到的大小实际小于此时集合已经使用的大小

3.而spark的内存模型是逻辑上的内存模型,并不是物理上的,当调用集合的estimateSize计算其大小小于实际使用大小的情况下,spark内存模型就会过低的估计当前集合所占用的内存,虽然在内存模型看来当前内存并没有超过限制,但是实际上使用的内存可能已经超过了最大内存限制,所以会被yarn干掉

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Spark内存溢出通常发生在大数据处理中,当你尝试使用Apache Spark进行计算时,如果任务所需的内存超出了Spark集群中可用内存的总量,就会发生内存溢出Spark的工作原理是基于内存计算模型,它将数据划分为小块( partitions)并在内存中进行操作,如果某个任务的分区或中间结果超过了内存限制,就可能导致内存溢出内存溢出可能由以下几个原因引起: 1. **数据量过大**:如果你的数据集比Spark内存大得多,没有足够的内存来缓存整个数据集,会导致溢出。 2. **过度分区**:过多的分区可能会导致每个分区过大,占用过多内存。 3. **不合适的配置**:Spark内存分配策略,如`spark.driver.memory`、`spark.executor.memory`等如果没有正确设置,可能导致内存不足。 4. **频繁的磁盘I/O**:如果任务倾向于频繁地从磁盘读取数据而不是利用内存,这也会增加内存压力。 5. **复杂的算法和数据结构**:某些算法可能在内存中产生大量的临时数据,如果没有有效的优化,也可能触发溢出。 解决内存溢出的方法包括: - **优化数据加载**:减少一次性加载的数据量,使用`takeSample`或`limit`来处理部分数据。 - **调整Spark配置**:增大内存限制,或者调整内存分配策略,比如使用`spark.storage.memoryFraction`来控制内存和磁盘的比例。 - **合并数据集**:合并小文件或使用更高效的存储格式(如Parquet或ORC)。 - **使用溢出策略**:例如`spark.storage.diskBlockCacheSize`,将部分数据放在磁盘上。 - **使用压缩**:对数据进行压缩可以减少内存占用。 - **代码优化**:查找并改进算法,减少不必要的中间结果和临时数据。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值