我知道 MSCK REPAIR TABLE
使用外部表的当前分区更新元存储。
要做到这一点,你只需要 ls
在表的根文件夹上(给定表仅由一列分区),并获取其所有分区,显然是<1s操作。
但在实践中,执行该操作可能需要很长时间(如果在aws athena上运行,甚至会超时)。
所以我的问题是,什么是 MSCK REPAIR TABLE
你在幕后做什么?为什么?
msck修复表如何找到分区?
其他相关数据:
我们的数据都在s3上,在emr(hive)或athena(presto)上运行时都很慢,表中有大约450个分区,每个分区都有平均90个文件,一个分区总共3 GB,文件是apache parquet格式的
1条答案
按热度按时间mrfwxfqh1#
它读取目录结构,从中创建分区,然后更新配置单元元存储,这是正确的。事实上,最近对该命令进行了改进,以便从元存储中删除不存在的分区。您给出的示例非常简单,因为它只有一级分区键。考虑具有多个分区键的表(实际上通常有2-3个分区键)。
msck repair
必须对表目录下的所有子目录执行完整的树遍历,解析文件名,确保文件名有效,检查分区是否已存在于元存储中,然后添加元存储中不存在的唯一分区。请注意,文件系统上的每个列表都是对namenode的rpc(对于hdfs),或者是对s3或adl的web服务调用,这会增加大量的时间。此外,为了确定分区是否已经存在于metastore中,它需要完整地列出metastore知道的表的所有分区。这两个步骤都可能会增加在大型表上执行命令所需的时间。最近,hive 2.3.0大大提高了msck修复表的性能(有关详细信息,请参阅hive-15879)。你可能想调音hive.metastore.fshandler.threads
以及hive.metastore.batch.retrieve.max
提高指挥效能。