

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# MSCK 优化
<a name="emr-msck-optimization"></a>

Hive 在其元数据存储中存储每个表的分区列表。但是，当直接向文件系统添加分区或从文件系统中移除分区时，Hive 元数据存储不会意识到这些变化。对于直接添加到文件系统或从文件系统中移除的分区，[MSCK 命令](https://cwiki.apache.org/confluence/display/hive/languagemanual+ddl#LanguageManualDDL-RecoverPartitions(MSCKREPAIRTABLE)) 会更新 Hive 元数据存储中的分区元数据。此命令的语法是：

```
MSCK [REPAIR] TABLE table_name [ADD/DROP/SYNC PARTITIONS];
```

Hive 将按如下方式实现此命令：

1. Hive 从元数据存储中检索表的所有分区。然后根据文件系统中不存在的分区路径列表，创建一个要从元数据存储中移除的分区列表。

1. Hive 收集文件系统中存在的分区路径，将其与元数据存储中的分区列表进行比较，然后生成需要添加到元数据存储的分区列表。

1. Hive 使用 `ADD`、`DROP` 或 `SYNC` 模式更新元数据存储。

**注意**  
如果元数据存储中有大量分区，检查文件系统中是否存在分区的步骤需要很长时间才能完成运行，因为必须对每个分区执行文件系统的 `exists` API 调用。

在 Amazon EMR 6.5.0 中，Hive 引入了一个名为 `hive.emr.optimize.msck.fs.check` 的标记。启用此标记后，它会让 Hive 检查上面第 2 步中所生成的文件系统分区路径列表中是否存在分区，而不是调用文件系统 API。在 Amazon EMR 6.8.0 中，Hive 默认启用了此优化，无需设置标记 `hive.emr.optimize.msck.fs.check`。