我正在尝试将约 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 提高性能的方法。