spark使用数据帧列表并行化写入

时间:2016-10-18 12:35:59

标签: apache-spark

我有一个使用jdbc创建的数据框列表。有没有办法用木地板并行编写它们?

val listOfTableNameAndDf = for {
  table <- tableNames
} yield (table, sqlContext.read.jdbc(jdbcUrl, table,  new Properties))

我可以按顺序编写它们,但有没有办法并行化写入或使其更快。

listOfTableNameAndDf.map { x => {
  x._2.write.mode(org.apache.spark.sql.SaveMode.Overwrite).parquet(getStatingDir(x._1)) 
  }
}

1 个答案:

答案 0 :(得分:2)

您可以在将来异步执行写入操作:

dfs.map { case (name, table) => 
  Future(table.write.mode("overwrite").parquet(getStatingDir("name")))
}

但我怀疑它会带来任何重大改进。如果像你的那样有几个主要瓶颈:

  • 群集资源 - 如果任何作业使可用资源饱和,剩余作业将像以前一样排队。
  • 输入源吞吐量 - 源数据库必须跟上群集。
  • 输出源IO - 输出源必须与群集保持一致。

如果每个作业的源和输出相同,则作业将竞争同一组资源,并且顺序执行驱动程序代码几乎不会成为问题。

如果您正在寻找当前代码的改进,我建议您首先使用带有以下签名的reader方法:

jdbc(url: String, table: String, columnName: String, 
  lowerBound: Long, upperBound: Long, numPartitions: Int, 
  connectionProperties: Properties)

它需要更多的工作量,但通常表现出更好的性能,因为读取(以及因此数据)在工作节点之间分配。