postgresql - 将超过 5000 万从 Pyspark df 写入 PostgresQL,最有效的方法

标签 postgresql apache-spark pyspark apache-spark-sql bigdata

将数百万条记录从 Spark 数据帧插入到 Postgres 表的最有效方法是 5000 万条记录。
我已经做到了从 Spark 到
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 帮助我加快进程?

1000 万条记录平均 14 分钟还不错 ,但正在寻找那些以前会这样做的人来帮助回答这个问题。

最佳答案

实际上,我不久前做了一些相同的工作,但使用的是 Apache Sqoop。

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

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

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

  • 记住分区的数量很重要。检查分区数,然后根据您想要的并行连接数进行调整。您可能希望每个分区有一个连接,因此我建议检查 coalesce ,正如前面提到的 here .
  • 检查您的 postgreSQL 实例支持的最大连接数,并且您想要 increase the number .
  • 用于将数据插入 PostgreSQL is recommended using COPY command . Here也是关于如何加速 postgreSQL 插入的更详细的答案。

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

    关于postgresql - 将超过 5000 万从 Pyspark df 写入 PostgresQL,最有效的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59269813/

    相关文章:

    arrays - PostgreSQL 使用位置数组访问数组中的多个元素

    java - 带有 PostgreSQL 9.4 数据源的 WildFly 10 部署应用程序时出错

    java - 使用 Statistic.stat 时如何避免收集

    amazon-web-services - AWS 胶水 : How to add a column with the source filename in the output?

    scala - Spark persist()(然后是 Action )真的持久吗?

    postgresql - 我们如何将我们的 docker 应用程序连接到本地运行的 postgres?

    oracle - 为什么Oracle的Spark查询(负载)与SQOOP相比这么慢?

    hadoop - 星火集群启动问题

    python - 如何使用 python 从 azure databricks 笔记本连接到本地 Windows 服务器?

    database - Postgres.app 设置 : getting `which psql` to return desired path