在Spark 2.3中,我正在运行以下代码:
rdd
.persist(DISK_ONLY) // this is 3GB according to storage tab
.groupBy(_.key)
.mapValues(iter => iter.map(x => CaseClass(x._1, x._2)))
.mapValues(iter => func(iter))
我观察到的是,处理100M案例类的任务总是在处理1h +之后失败。在用户界面的“按执行者汇总的指标”标签中,我看到“随机溢出”列的巨大值,大约10 GB,是完整RDD大小的3倍。。 当我执行慢速执行程序的线程转储时,它似乎卡在了对磁盘操作的写入/读取中。
有人可以告诉我怎么回事吗?我了解100M的案例类实例可能太大而无法容纳单个执行者的RAM,但我不理解以下内容:
1)Spark不应该将所有实例“流式传输”到我的func
函数中吗?为什么要尝试在接收执行程序节点时存储所有内容?
2)内存爆炸从何而来?我不明白为什么序列化1亿个案例类实例应该占用10GB左右的空间,每项大约100个字节(假设泄漏到磁盘上的数据是CaseClass实例,我不确定从该点开始数据洒了)