从Pyspark df到PostgresSQL写入超过5000万,这是最有效的方法


16

从Spark数据帧向Postgres Tables插入数百万条记录(例如5000万条)的最有效方法是。过去,我通过使用批量复制和批处理大小选项(从成功的火花到MSSQL)做到了这一点 。

Postgres是否有类似的东西?

添加我尝试过的代码以及运行该过程所花费的时间:

def inserter():
    start = timer()
    sql_res.write.format("jdbc").option("numPartitions","5").option("batchsize","200000")\
    .option("url", "jdbc:postgresql://xyz.com:5435/abc_db") \
    .option("dbtable", "public.full_load").option("user", "root").option("password", "password").save()
    end = timer()
    print(timedelta(seconds=end-start))
inserter()

因此,我对1000万条记录执行了上述方法,并按中指定的进行了5个并行连接,numPartitions并尝试了200k的批量大小

该过程花费的总时间为0:14:05.760926(十四分五秒)。

还有其他有效的方法可以减少时间吗?

我可以使用的有效或最佳批次大小是多少?增加我的批量大小会更快地完成工作吗?还是打开多个连接,即> 5可以帮助我更快地完成此过程?

在一个平均14分钟10万条记录是不坏,但找的人在那里谁也以前做过这有助于回答这个问题。


1
您可以先将数据转储到本地CSV文件中,然后使用PostgreSQL自己的导入工具将其导入-这取决于瓶颈所在:从Pyspark导出的速度慢还是从Postgres导入的速度慢?(也就是说,对于5000万行来说14分钟对于我来说似乎并不糟糕-表上定义了哪些索引?)。

戴,我有一个5200万的df,现在我将其写入Postgres,这是我通过上述代码创建的新表。我尚未在Postgres中创建表格,然后在此处编写。如果我可以先创建一个表并在Postgres中对其建立索引,然后再从spark df发送数据,是否存在更好的可能性?
Chetan_Vasudevan '19

2
(这是另一种方式-索引减慢了对表的插入操作,但加快了选择查询的速度)

戴,所以我只是在Postgres中创建没有索引的表,然后尝试插入并评估我的性能?
Chetan_Vasudevan

Answers:


4

实际上,前一阵子我确实做了同样的工作,但是使用的是Apache Sqoop。

我想说,为了回答这个问题,我们必须尝试优化Spark和PostgresSQL之间的通信,特别是从Spark到PostgreSql的数据。

但是要小心,不要忘记Spark方面。如果分区数与PostgreSQL支持的最大连接数相比过高,则执行mapPartitions没有意义,如果分区太多,并且要为每个分区打开一个连接,则可能会出现以下错误org.postgresql.util.PSQLException: FATAL: sorry, too many clients already

为了调整插入过程,我将按照以下步骤解决问题:

  • 请记住,分区的数量很重要。检查分区数,然后根据所需的并行连接数进行调整。你可能想每个分区一个连接,所以我建议要检查coalesce,如被提及这里
  • 检查您的postgreSQL实例支持的最大连接数,并且您想要增加连接数
  • 建议使用COPY命令将数据插入PostgreSQL 。也是关于如何加快postgreSQL插入的更详尽的答案。

最后,没有灵丹妙药可以完成这项工作。您可以使用我上面提到的所有技巧,但这实际上取决于您的数据和用例。


Dbustosp我一定会尝试上述技巧,在此之前,您肯定应该获得支持。
Chetan_Vasudevan '19

@chetan_vasudevan,如果您提供有关正在使用的数据,每条记录的大小等的更多详细信息。如果数据是公开的,我可以自己尝试尝试一些事情并比较时间。
dbustosp

Dbustosp的数据有80列及其5500万条记录。我已经开始研究您给我的建议。
Chetan_Vasudevan '19

@Chetan_Vasudevan数据集的总大小?输入数据的格式是什么?
dbustosp

@Chetan_Vasudevan有更新吗?
dbustosp
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.