gpt4 book ai didi

apache-spark - 将数据并行写入 parquet 格式

转载 作者:行者123 更新时间:2023-12-04 09:43:38 25 4
gpt4 key购买 nike

我有一个相对较大的内部部署表(约 15 亿行),我正在尝试使用 AWS Glue 以 Parquet 格式将其拉入 AWS S3。我正在使用 spark JDBC 读取表并将其写入 S3。问题是我无法一次性从源表中提取所有数据,因为源数据库会耗尽内存并提示。为了解决这个问题,我使用 predicates 选项并行下推过滤器,这可以很好地以 2 亿左右的块提取数据。但是当我尝试将此数据帧写入 S3 时,几乎需要半个小时才能完成:

df = spark.read.jdbc(url=host_url, 
table="TABLENAME",
predicates=predicates,
properties= {
"user" : username,
"password" : password
}
)

所以我想做的是按顺序从 DB 阶段读取:
Read Part 1 from DB --> Read Part 2 from DB --> Read Part 3 from DB
然后将所有数据并行写入S3
Write Part 1 || Write Part 2 || Write Part 3我对此有两个问题:
  • 我不知道 Spark 何时真正将这些查询发送到数据库。我知道当我定义如上所示的数据帧时不是这样,所以我无法弄清楚如何序列化阶段 1。
  • 我环顾四周,找不到将多个数据帧并行写入 Parquet 分区的选项。我应该只使用 python 将数据帧并行化为拼花写操作语句吗?甚至建议这样做吗?
  • 最佳答案

    Spark 会在应用操作后立即读取数据,因为您只是在读取和写入 s3,因此在触发写入时读取数据。

    Spark 没有针对从 rdbms 读取大量数据进行优化,因为它只建立到数据库的单一连接。
    如果您想坚持阅读的 Spark ,请尝试增加 取大小 属性为 100000 默认为 1000。

    对于数据的并行处理,您可以尝试利用 python 多处理并执行并行读写

    Thread 1
    Read 1 -> Write 1
    Thread 2
    Read 2 -> Write 2

    但首先尝试执行只是顺序
    Read 1 -> Write 1 -> Read 2 -> Write 2

    我建议的另一种方法是使用 DMS 或 SCT 一次将所有数据发送到 s3。

    DMS 可以在 s3 中以 parquet 格式转储数据,并且速度非常快,因为它针对迁移任务本身进行了优化。

    如果您不想使用 DMS,您可以编写一个可以通过 transient EMR 集群触发的 sqoop 导入作业。
    Sqoop 还能够导入 Parquet 格式的数据。

    Glue 最适合转换现有数据和迁移大数据,您应该借助其他服务。

    关于apache-spark - 将数据并行写入 parquet 格式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62223720/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com