Trino Hive Connector无法自动同步分区元数据的问题求助
每日运行的Spark任务将Parquet文件按year/month/day分区存储到AWS S3,同步到Alluxio后,数据已存在于S3和Alluxio,但Trino必须手动执行system.sync_partition_metadata()才能查询到最新分区数据。已尝试关闭Trino的分区缓存(hive.metastore-cache.cache-partitions=false)并缩短元数据刷新间隔(hive.metastore-refresh-interval=5s),但无效。
环境信息
- Trino版本:395
- 存储层:Alluxio + AWS S3
- 元数据存储:AWS Glue
建表语句
create table glue.table_tc.table_name ( col1 varchar, col2 varchar, col3 varchar, col4 varchar, col5 bigint, year int, month int, day int ) with ( format='parquet', partitioned_by=array['year', 'month', 'day'], external_location='alluxio://path/to/table');
1. 让Spark写入时自动同步Glue元数据
问题核心之一是Spark写入S3后未自动将新分区注册到Glue元数据,导致Trino(依赖Glue元数据)无法感知新分区。在Spark任务中添加以下配置:
# 启用Glue作为Spark的元数据目录 spark.sql.hive.metastore.glue.catalog.enabled=true # 动态覆盖分区模式,确保写入新分区时自动注册到Glue spark.sql.sources.partitionOverwriteMode=dynamic # 强制Spark写入后刷新分区元数据 spark.sql.hive.convertMetastoreParquet=true
Spark完成分区写入后,会直接将新分区信息同步到Glue,Trino无需手动刷新即可获取最新元数据。
2. 配置Trino Glue连接器的元数据自动刷新
你之前修改的hive.*系列参数仅针对传统Hive Metastore,使用AWS Glue作为元数据存储时,需要配置Trino Glue连接器的专属参数。在Trino的Glue连接器配置文件(etc/catalog/glue.properties)中添加/修改:
# 开启元数据自动刷新,设置刷新间隔(例如5秒) glue.metadata-refresh-interval=5s # 关闭分区缓存,确保每次查询都从Glue拉取最新分区信息 glue.cache-partitions=false # 启用外部表的动态分区识别 hive.explicit-partitions-enabled=true
glue.metadata-refresh-interval控制Trino从Glue拉取全表元数据的频率,hive.explicit-partitions-enabled确保Trino能识别外部表的动态分区。
3. 确保Alluxio与S3的元数据同步
Alluxio需要自动同步S3的文件变化,否则即使Glue有新分区,Trino访问Alluxio路径时可能看不到实际文件。在Alluxio配置文件(conf/alluxio-site.properties)中设置:
# 自动同步底层存储(S3)的元数据,间隔设为5秒 alluxio.user.file.metadata.sync.interval=5s # 启用主动元数据同步 alluxio.user.file.metadata.sync.enabled=true
Alluxio会定期拉取S3的最新文件元数据,保证Trino访问Alluxio路径时能获取到最新的分区文件。
4. 验证配置生效
完成上述配置后,重启Trino集群和Alluxio服务,运行Spark任务写入新分区,等待配置的刷新间隔后,直接在Trino中查询表,验证是否能自动获取最新分区数据。
内容的提问来源于stack exchange,提问作者Jonathan

