Scala 并行地将Spark数据流转换并保存到多个单独的位置?

Scala 并行地将Spark数据流转换并保存到多个单独的位置?,scala,apache-spark,spark-streaming,Scala,Apache Spark,Spark Streaming,我有一个数据流的用例,其中包含具有多个嵌套级别的数据,我需要将数据中的不同元素持久化到单独的HDFS位置。我通过使用Spark SQL解决了这个问题,如下所示: val context = new StreamingContext(sparkConf, Seconds(duration)) val stream = context.receiverStream(receiver) stream.foreachRDD {rdd => val spark = SparkSe

我有一个数据流的用例,其中包含具有多个嵌套级别的数据,我需要将数据中的不同元素持久化到单独的HDFS位置。我通过使用Spark SQL解决了这个问题,如下所示:

  val context = new StreamingContext(sparkConf, Seconds(duration))
  val stream = context.receiverStream(receiver)
  stream.foreachRDD {rdd =>
    val spark = SparkSession.builder.config(rdd.sparkContext.getConf).getOrCreate
    import spark.implicits._
    rdd.toDF.drop("childRecords").write.parquet("ParentTable")
  }
  stream.foreachRDD {rdd =>
    val spark = SparkSession.builder.config(rdd.sparkContext.getConf).getOrCreate
    import spark.implicits._
    rdd.toDF.select(explode(col("childRecords")).as("children"))
      .select("children.*").write.parquet("ChildTable")
  }
  // repeat as necessary if parent table has more different kinds of child records,
  // or if child table itself also has child records too
代码可以工作,但我唯一的问题是,持久性是按顺序运行的-第一个stream.foreachRDD必须在第二个stream.foreachRDD开始之前完成,等等。理想情况下,我希望看到的是,ChildTable的持久性作业可以在不等待ParentTable完成的情况下启动,因为他们在不同的地方写信,不会发生冲突。实际上,我有大约10个不同的作业都在按顺序等待完成,如果我能够并行运行它们,执行时间可能会有很大的提高