MSCK REPAIR TABLE 在幕后做了什么,为什么这么慢?

What does MSCK REPAIR TABLE do behind the scenes and why it's so slow?

我知道 MSCK REPAIR TABLE 使用外部 table 的当前分区更新 Metastore。

为此,您只需在 table 的根文件夹上执行 ls(假定 table 仅按一列分区),并获取其所有内容分区,显然 < 1s 操作。

但实际上,该操作可能需要 很长 的时间才能执行(甚至 timeout if ran on AWS Athena)。

所以我的问题是,MSCK REPAIR TABLE 实际上在幕后做什么,为什么?

MSCK REPAIR TABLE如何找到分区?


其他相关数据:

我们的数据都在 S3 上,当 运行 在 EMR (Hive) 或 Athena (Presto) 上时都很慢,table 中有约 450 个分区,每个分区平均有 90 个文件,一个分区总共 3 GB,文件为 Apache parquet 格式

你是对的,它读取目录结构,从中创建分区,然后更新配置单元元存储。事实上,最近,该命令得到改进,也可以从 Metastore 中删除不存在的分区。您给出的示例非常简单,因为它只有一层分区键。考虑具有多个分区键的 table(2-3 个分区键在实践中很常见)。 msck repair会对table目录下的所有子目录进行全树遍历,解析文件名,确保文件名有效,检查分区是否已经存在在 Metastore 中,然后添加 Metastore 中不存在的唯一分区。请注意,文件系统上的每个列表都是对名称节点的 RPC(在 HDFS 的情况下)或在 S3 或 ADLS 的情况下的 Web 服务调用,这可能会增加大量时间。此外,为了确定分区是否已经存在于 Metastore 中,它需要完整列出 Metastore 知道的 table 的所有分区。这两个步骤都可能会增加大型 tables 上命令所花费的时间。 msck repair table 的性能最近在 Hive 2.3.0 中得到了显着改进(有关更多详细信息,请参见 HIVE-15879)。您可能需要调整 hive.metastore.fshandler.threadshive.metastore.batch.retrieve.max 以提高命令的性能。