如何加快spark df.write jdbc到postgres数据库?

问题描述 投票:1回答:2

我是新手,正在尝试使用df.write将数据框的内容(可以有200k至2M行)追加到postgres数据库中。

df.write.format('jdbc').options(
      url=psql_url_spark,
      driver=spark_env['PSQL_DRIVER'],
      dbtable="{schema}.{table}".format(schema=schema, table=table),
      user=spark_env['PSQL_USER'],
      password=spark_env['PSQL_PASS'],
      batchsize=2000000,
      queryTimeout=690
      ).mode(mode).save()

我尝试增加批处理大小,但这没有帮助,因为完成此任务仍然需要大约4个小时。我还在下面包括了一些来自aws emr的快照,这些快照显示了有关该作业运行方式的更多详细信息。将数据帧保存到postgres表的任务仅分配给一个执行器(我觉得很奇怪),要加快此速度,需要在执行器之间划分此任务?

[此外,我已经阅读了spark's performance tuning docs,但是增加了batchsize,并且queryTimeout似乎并没有提高性能。 (我曾尝试在df.cache()之前在脚本中调用df.write,但脚本的运行时间仍为4小时)

另外,我的aws emr硬件设置和spark-submit是:

主节点(1):m4.xlarge

核心节点(2):m5.xlarge

spark-submit --deploy-mode client --executor-cores 4 --num-executors 4 ...

enter image description here

enter image description here

我是刚起步的人,正在尝试使用df.write:df.write.format('jdbc')将数据框的内容(可以有200k至2M行)追加到Postgres数据库中。选项(...

postgresql apache-spark pyspark apache-spark-sql pyspark-sql
2个回答
0
投票

要解决性能问题,通常需要解决以下两个瓶颈:


0
投票

Spark是一个分布式数据处理引擎,因此当您处理数据或将其保存在文件系统上时,它会使用其所有执行程序来执行任务。Spark JDBC速度很慢,因为当您建立JDBC连接时,执行程序之一会建立到目标数据库的链接,因此会导致速度降低和失败。

© www.soinside.com 2019 - 2024. All rights reserved.