我有一个 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 作业在合并操作期间彼此锁定/等待。
Iceberg 默认使用可序列化隔离类型,您可以将其更改为快照隔离,它可以并发更新到不同的数据文件。这不会锁定事务。 始终确保您不更新相同的数据文件,否则更新操作将失败。