我想同时在一个RDD上执行2次操作。我写了这样的代码
val conf = new SparkConf().setAppName("Foo")
val sc = new SparkContext(conf)
val sqlSc = new SQLContext(sc)
sc.hadoopConfiguration.set("mapreduce.input.fileinputformat.input.dir.recursive","true")
val inputPath = path
val rdd = sc.textFile(inputPath).cache()
val f1 = Future {
val schama1 = StructType(List(StructField("a", StringType, true), StructField("b", StringType, true), StructField("c", LongType, true)))
val rdd1 = rdd.map(func1).filter(_.isDefined).flatMap(x => x)
val df1 = sqlSc.createDataFrame(rdd, schema)
formSubmissionDataFrame.save("/foo/", "com.databricks.spark.avro")
0
}
val f2 = Future {
val schema2 = StructType(List(StructField("d", StringType, true), StructField("e", StringType, true)))
val rdd2 = rdd.map(func2).filter(_.isDefined).flatMap(x => x)
val df2 = sqlSc.createDataFrame(rdd2, schema2)
pageViewDataFrame.save("/bar/", "com.databricks.spark.avro")
0
}
val result = for {
r1 <- f1
r2 <- f2
} yield(r1 + r2)
result onSuccess{
case r => println("done")
}
Await.result(result, Duration.Inf)
当我运行此代码时,我看不到所需的效果。目录栏有很多临时文件等...但是foo什么都没有...所以看起来这两个数据集并没有并行创建。
在火花驱动器中使用未来是个好主意吗?我做得对吗?我应该做些什么不同的事。
答案 0 :(得分:0)
为了并行执行两个或多个Spark JOBS(操作),Spark Context需要在FAIR调度程序模式下运行。
在用于所有转换的驱动程序中,仅生成用于执行的依赖图,但是实际执行仅在调用操作时发生。通常,驱动程序会在Spark派对管理的节点上执行时等待。在您的情况下,Spark Master不会开始执行第二个作业,直到第一个作业结束,因为默认情况下Spark Scheduling是FIFO。
您可以按如下方式设置conf以启用并行执行
val conf = new SparkConf().setMaster(...).setAppName(...)
conf.set("spark.scheduler.mode", "FAIR")
val sc = new SparkContext(conf)
有关详细信息,请访问Spark Scheduling within an application