我是新手,正在尝试使用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 ...
我是刚起步的人,正在尝试使用df.write:df.write.format('jdbc')将数据框的内容(可以有200k至2M行)追加到Postgres数据库中。选项(...
要解决性能问题,通常需要解决以下两个瓶颈:
Spark是一个分布式数据处理引擎,因此当您处理数据或将其保存在文件系统上时,它会使用其所有执行程序来执行任务。Spark JDBC速度很慢,因为当您建立JDBC连接时,执行程序之一会建立到目标数据库的链接,因此会导致速度降低和失败。