首页 > 解决方案 > 加速 spark df.write 到 PostgreSQL 的最佳参数

问题描述

我正在尝试将约 300 万行 x 158 列(约 3GB)的 Pyspark 数据帧写入 TimeScale DB。

写入操作是从具有以下资源的 Jupyter 内核执行的:

正如人们所预料的那样,它相当慢。

我知道repartitionand batchsize,所以我试图使用这些参数来加快写入操作,但我想知道什么是尽可能高性能的最佳参数。

df.rdd.getNumPartitions()是7,我应该尝试增加还是减少分区数?我试着玩了一下,但没有得到任何结论性的结果。增加分区数量似乎确实会减慢写入速度,但这可能只是因为 Sparkrepartition先执行。

我更具体地想知道batchsize. 我猜最佳批量大小取决于 TimeScale/Postgre 配置,但我无法找到有关此的更多信息。

作为记录,这是我尝试过的一个示例:

df.write \
  .mode("overwrite") \
  .format('jdbc') \
  .option('url', 'my_url') \
  .option('user', 'my_user') \
  .option('password', 'my_pwd') \
  .option('dbtable', 'my_table') \
  .option('numPartitions', '5') \
  .option('batchsize', '10000') \
  .save()

这在数据帧的小得多的样本(约 500K 行,500MB)上花费了 26 分钟。

我们知道我们的 Jupyter 内核缺乏资源,并且也在努力解决这个问题,但是有没有办法使用 Spark 和 TimeScale 参数优化写入速度?

[编辑] 我也阅读了这个关于使用 COPY 的非常有用的答案,但我们现在正在专门寻找使用 Spark 提高性能的方法。

标签: postgresqlapache-sparkpysparktimescaledbspark-jdbc

解决方案


如果它使用 JDBC,那么不久前reWriteBatchedInserts=true引入的参数https://jdbc.postgresql.org/documentation/changelog.html#version_9.4.1209可能会显着加快速度。它应该能够被引入连接字符串,或者可能有一种方法可以指定在 Spark 连接器中使用它。


推荐阅读