J'ai un programme Spark Scala qui utilise une API REST pour obtenir des données lot par lot, et une fois que toutes les données sont récupérées, je les traite.
Programme actuel :
-
Pour chaque lot, créer un RDD et le fusionner avec le RDD précédent. créé à l'aide de l'appel API précédent
rdd.union(currentRdd)
. -
Opérer sur le RDD final
Un programme simple pour reproduire le problème :
def main(args: Array[String]) = {
val conf = new SparkConf().setAppName("Union test").setMaster("local[1]")
val sc = new SparkContext(conf)
val limit = 1000;
var rdd = sc.emptyRDD[Int]
for (x <- 1 to limit) {
val currentRdd = sc.parallelize(x to x + 3)
rdd = rdd.union(currentRdd)
}
println(rdd.sum())
}
Problème : - Lorsque le nombre de lots est élevé, le programme lance un StackOverflowError
: Exception in thread "main" java.lang.StackOverflowError at org.apache.spark.rdd.UnionRDD$$anonfun$1.apply
Je suppose que lorsque le nombre de lots augmente, le graphe de dépendance RDD devient vraiment complexe et provoque l'erreur.
Quelle est la meilleure façon de résoudre ce problème ?