一、疑问:Spark内存不够的时候,不是会写入硬盘么
1、某文章:https://segmentfault.com/a/1190000019157848
1,当有多个 Task 同时在 Executor 上执行时, 将会有多个 TaskMemoryManager 共享 MemoryManager 管理的内存。那么 MemoryManager 是怎么分配的呢?答案是每个任务可以分配到的内存范围是 [1 / (2 * n), 1 / n],其中 n 是正在运行的 Task 个数。因此,多个并发运行的 Task 会使得每个 Task 可以获得的内存变小。
2,前面提到,在 MemoryConsumer 中有 Spill 方法,当 MemoryConsumer 申请不到足够的内存时,可以 Spill 当前内存到磁盘,从而避免无节制的使用内存。但是,对于堆内内存的申请和释放实际是由 JVM 来管理的。因此,在统计堆内内存具体使用量时,考虑性能等各方面原因,Spark 目前采用的是抽样统计的方式来计算 MemoryConsumer 已经使用的内存,从而造成堆内内存的实际使用量不是特别准确。从而有可能因为不能及时 Spill 而导致 OOM。
2、知乎大佬回答:https://www.zhihu.com/question/63440321
(1)记得某本书上讲到过:
非序列化的内存对象大小采集是抽样获取的,因此尽管executor在运行时会计算当前内存使用量.但是这个使用量并非是完全准确的值.
这样,在某些特定场景下,就会导致统计值小于实际使用值,然后造成没有往磁盘spill的操作.
(2)
回答就是,处理规模比较大的数据的时候spark的鲁棒性其实还没有那么强,需要用户自己绕过这些坑。
(当然这个也是有用的,这部分的内容一般会被作为是否真正用过spark处理真实场景下大规模数据的面试题。逃~
二、spark内存溢出怎么解决?
1、https://blog.youkuaiyun.com/yhb315279058/article/details/51035631