1) 转到 Spark UI 并检查“Locality Level”
2) 如果 Join 一个大数据和一个小数据使用 brodcast Join
3) 如果加入大中型数据,如果中型 RDD 不能完全装入内存,则使用过滤器
val keys = sc.broadcast(mediumRDD.map(_._1).collect.toSet)
val reducedRDD = largeRDD.filter{ case(key, value) => keys.value.contains(key) }
reducedRDD.join(mediumRDD)
4) 检查数据是否序列化
.set("spark.serializer", "org.apache.spark.serializer.KryoSerializer")
.set("spark.kryoserializer.buffer.max", "128m")
.set("spark.kryoserializer.buffer", "64m")
.registerKryoClasses(
Array(classOf[ArrayBuffer[String]], classOf[ListBuffer[String]])
5) 检查 Spark UI 或在代码中添加以下代码以进行调试
df.rdd.getNumPartitions
Spark的应用UI,从下面的截图可以看出,“Total Tasks”代表分区的数量