经常会遇到 类似 org.apache.spark.shuffle.FetchFailedException: java.io.FileNotFoundException 。主要是shuffle 导致内存不足引起的。shuffle 分为 shuffle read 和write 。
1. shuffle read 是读其它partition 发来的数据,从缓存中读。
2. shuffle write 是写数据到缓存准备发给其他partition。
当数据分片partition过多而且每个partition的大小很小的时候,当这个时候触发shuffle就会有大量的网络io和shuffle read 的操作。这时候要通过coalesce 或repartition在之前的某一步提前把数据进行合并,来防止产生过多partition。
当数据分片不多而每个partition很大的时候,这时候要是shuffle也会造成大量的shuffle read 和write操作,而导致内存不足,这时候也需要通过coalesce 或repartition在之前的某一步提前把数据打散放小。
为什么会出现这样情况呢,应该是数据的partition的数量决定了task的数量。所以经常在调优的时候,经常要注意每一步shuffle后数据partition的大小和partition的数量。这个要从executor的内存,shuffle read 、write的大小来看。