postgresql - 加速 spark df.write 到 PostgreSQL 的最佳参数
问题描述
我正在尝试将约 300 万行 x 158 列(约 3GB)的 Pyspark 数据帧写入 TimeScale DB。
写入操作是从具有以下资源的 Jupyter 内核执行的:
- 1 个驱动程序,2 个 vcpu,2GB 内存
- 2 个执行器,2 个 vcpu,4GB 内存
正如人们所预料的那样,它相当慢。
我知道repartition
and 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 提高性能的方法。
解决方案
如果它使用 JDBC,那么不久前reWriteBatchedInserts=true
引入的参数https://jdbc.postgresql.org/documentation/changelog.html#version_9.4.1209可能会显着加快速度。它应该能够被引入连接字符串,或者可能有一种方法可以指定在 Spark 连接器中使用它。
推荐阅读
- java - 如何将实例化对象用于使用数组的方法的参数
- c++ - 为什么 set/get_default_resource 使用指针而不是引用?
- reactjs - 使用useState hooks根据之前的状态依次更新
- database - Clojure:即使数据库不可用,如何启动应用程序?
- android-studio - 如何在不使用电子邮件的情况下将信息从应用程序发送到另一个电子邮件?
- javascript - 编译/压缩成一个js文件
- ruby - Ruby:类中的self.call
- c# - Swashbuckle OperationFilter 添加类型对象的参数
- php - 如何显示订阅了带有条纹的计划的用户
- python - 脚本卡在 try-except 块中