AWS Glue读取分区Hudi过慢及Athena分区投影报错问题咨询
Hudi读取优化及Athena分区投影问题解决方案
一、Glue读取Hudi耗时过长优化
你当前先全表load再加where过滤的写法无法触发Hudi的分区下推逻辑,会先加载全表所有分区的元数据再过滤,因此速度无改善,优化方式如下:
- 写入Hudi时开启内置元数据索引,加速分区裁剪,写入任务添加以下配置:
'hoodie.metadata.enable': 'true', 'hoodie.metadata.index.partition.enable': 'true'
- 读取时将分区过滤条件下推到Hudi读逻辑中,不要在load后再加where,修改代码为:
spark.read.format("hudi") .option("hoodie.datasource.read.partition.path.filter", "partition1 = 'somevalue'") .load("s3://somes3bucket")
- 检查分区粒度:如果当前单分区数据量小于128MB,说明分区粒度过细,总分区数过多,建议将分区字段调整为更高粒度的范围值,比如将原分区id按每10万一组划分,大幅减少总分区数。
二、Hudi增量读取返回0条修复
当前配置存在两处错误,修改如下:
hoodie.datasource.read.begin.instanttime不能填000,需要填写Hudi表实际存在的最早提交时间戳,可查看Hudi表路径下.hoodie目录中最早的instant文件名(格式为yyyyMMddHHmmssSSS),替换为对应值即可。- 删除
hoodie.datasource.read.incr.path.glob的空值配置,若需要限制增量读取的分区范围,可填写对应通配符比如partition1=*,留空会导致路径匹配失效。 - 确认写入任务未清理过历史提交记录,可调整写入配置
hoodie.keep.max.commits增大历史提交保留数量,避免增量读取的时间线被清理。
三、Athena分区投影超限报错解决
报错原因是你的分区字段取值范围为200000到3500000,总分区数达330万,超过Athena默认单查询最多读取100万分区的限制,解决方案如下:
- (推荐)调整分区粒度:不要直接用
reported_qc_session_id作为分区字段,改为范围分区,比如每10万个id为一个分区,分区值格式为200000-299999、300000-399999,调整后总分区数仅为33个,远低于限制,同时也能大幅提升Hudi的读写性能。 - 若临时需要执行无分区过滤的查询,可在Athena对应工作群组的配置中,将
Query limits下的Max partitions per query参数调整到4000000以上,但该方案会导致全表扫描时性能极差、成本极高,不建议长期使用。 - 可补充分区投影的边界配置,减少无效分区生成,修改TBLPROPERTIES如下:
TBLPROPERTIES ( 'projection.enabled'='true', 'projection.reported_qc_session_id.range'='200000, 3500000', 'projection.reported_qc_session_id.type'='integer', 'projection.reported_qc_session_id.min'='200000', 'projection.reported_qc_session_id.max'='3500000', 'storage.location.template'='s3://bucket/table/partition=${reported_qc_session_id}')
内容的提问来源于stack exchange,提问作者robotic_arm13
相关产品推荐
相关产品推荐

