【问题标题】:Writing more than 50 millions from Pyspark df to PostgresSQL, best efficient approach将超过 5000 万从 Pyspark df 写入 PostgresQL,最有效的方法
【发布时间】:2020-04-03 19:00:54
【问题描述】:

将数百万条记录插入到 Postgres 表中的最有效方法是什么,例如从 Spark 数据帧中插入 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 帮助我加快处理速度?

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

【问题讨论】:

  • 您可以先将数据转储到本地 CSV 文件,然后使用 PostgreSQL 自己的导入工具进行导入 - 这取决于瓶颈在哪里:是从 Pyspark 导出慢还是导入慢到 Postgres,还是别的什么? (也就是说,5000 万行的 14 分钟对我来说似乎并没有那么糟糕 - 表上定义了哪些索引?)。
  • Dai,我有一个 52mil 的 df,现在我正在将其写入 Postgres,这是我通过上述代码创建的一个新表。我还没有在 Postgres 中创建表然后在那里写。如果我可以先创建一个表并在 Postgres 中对其进行索引,然后从 spark df 发送数据,是否有更好的可能性?
  • (反之亦然 - 索引会减慢表上的插入操作,但会加快选择查询)
  • Dai,所以我只是在没有索引的 Postgres 中创建表,然后尝试插入并测量我的性能?
  • stackoverflow.com/questions/758945/… 可能会有所帮助。

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


【解决方案1】:

实际上我不久前做过同样的工作,但使用的是 Apache Sqoop。

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-05-29
    • 2016-12-13
    • 2020-03-04
    • 1970-01-01
    • 2011-06-06
    • 2019-01-30
    • 2012-08-06
    • 1970-01-01
    相关资源
    最近更新 更多