Apache Iceberg - 合并时间长

问题描述 投票:0回答:1

我有一个 AWS Glue 作业,它正在尝试将数据合并到由

product_id
分区的 Apache Iceberg 表中。

我想要实现的是能够使用 AWS Glue 作业针对不同的

product_id
运行并发合并操作。

例如。要存储的列示例

product_id, name, ... , user_id

合并查询:

existing_data.product_id = '{here_product_id}' AND new_data.product_id = existing_data.product_id AND existing_data.user_id = new_data.user_id

保存代码

merge_sql = f"""
MERGE INTO glue_catalog.default.{APACHE_ICEBERG_PREFIX}{target_path} existing_data
USING td new_data
ON existing_data.product_id = '{here_product_id}' AND new_data.product_id = existing_data.product_id AND existing_data.user_id = new_data.user_id
WHEN MATCHED THEN UPDATE SET *
WHEN NOT MATCHED THEN INSERT *
"""

spark.sql(merge_sql)

结果我发现,即使使用分区,合并数据也需要很长时间。对于每个不同

product_id
的并发执行时间正在增加。 例如

作业运行中 导出的数据行 执行时间[s]
1 5k 395
4 5k 450、420、423、452
8 5k 630、628、672、677、695、613、631、641
1 1万 432
4 1万 628、508、597、619
8 1万 840、861、809、846、882、876、887、861

我也尝试过

Delta table
格式,但有同样的问题。当同一个表上有并行执行但不同时,合并时间会增加很多
product_id

是否可以加快一项作业执行的合并时间(对于 5k 行合并来说 395[s] 似乎相当长)?是否可以使用不同的

product_id
来加快并行执行的合并时间?目前看来,awsglue 作业在合并操作期间彼此锁定/等待。

apache-spark pyspark aws-glue delta-lake apache-iceberg
1个回答
0
投票

Iceberg 默认使用可序列化隔离类型,您可以将其更改为快照隔离,它可以并发更新到不同的数据文件。这不会锁定事务。 始终确保您不更新相同的数据文件,否则更新操作将失败。

© www.soinside.com 2019 - 2024. All rights reserved.