在火花工作中使用Future

时间:2016-03-13 02:41:10

标签: scala apache-spark

我想同时在一个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什么都没有...所以看起来这两个数据集并没有并行创建。

在火花驱动器中使用未来是个好主意吗?我做得对吗?我应该做些什么不同的事。

1 个答案:

答案 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