Spark写入postgres慢

时间:2016-09-08 17:22:46

标签: apache-spark dataframe apache-spark-sql

我将数据(大约83M条记录)从数据框写入postgresql并且它的速度很慢。花费2.7小时完成对db的写作。

查看执行程序,只有一个执行程序只运行一个活动任务。有没有什么办法可以使用Spark中的所有执行程序将写入并行化到db?

...
val prop = new Properties()
prop.setProperty("user", DB_USER)
prop.setProperty("password", DB_PASSWORD)
prop.setProperty("driver", "org.postgresql.Driver")



salesReportsDf.write
              .mode(SaveMode.Append)
              .jdbc(s"jdbc:postgresql://$DB_HOST:$DB_PORT/$DATABASE", REPORTS_TABLE, prop)

由于

2 个答案:

答案 0 :(得分:5)

所以我想出了问题所在。基本上,重新分区我的数据帧会使数据库写入吞吐量增加100%

def srcTable(config: Config): Map[String, String] = {

  val SERVER             = config.getString("db_host")
  val PORT               = config.getInt("db_port")
  val DATABASE           = config.getString("database")
  val USER               = config.getString("db_user")
  val PASSWORD           = config.getString("db_password")
  val TABLE              = config.getString("table")
  val PARTITION_COL      = config.getString("partition_column")
  val LOWER_BOUND        = config.getString("lowerBound")
  val UPPER_BOUND        = config.getString("upperBound")
  val NUM_PARTITION      = config.getString("numPartitions")

  Map(
    "url"     -> s"jdbc:postgresql://$SERVER:$PORT/$DATABASE",
    "driver"  -> "org.postgresql.Driver",
    "dbtable" -> TABLE,
    "user"    -> USER,
    "password"-> PASSWORD,
    "partitionColumn" -> PARTITION_COL,
    "lowerBound" -> LOWER_BOUND,
    "upperBound" -> UPPER_BOUND,
    "numPartitions" -> NUM_PARTITION
  )

}

答案 1 :(得分:3)

Spark还有一个名为" batchsize"在使用jdbc编写时。默认值非常低。(1000)

connectionProperties.put("batchsize", "100000")

将其设置为更高的值应该可以加快写入外部数据库的速度。