并行运行 MSCK REPAIR TABLE 时出错

问题

你正在尝试并行运行同一个表的 MSCK REPAIR TABLE <table-name> 命令,但收到 java.net.SocketTimeoutException: Read timed out 或内存不足的错误消息。

原因

尝试通过并行运行 MSCK REPAIR 将大量新分区添加到表中时,Hive 元存储将成为限制因素,因为它每秒只能添加几个分区。 新分区数越多,查询失败并出现 java.net.SocketTimeoutException: Read timed out 错误或内存不足的错误消息的可能性就越大。

解决方案

不应尝试并行运行多个 MSCK REPAIR TABLE <table-name> 命令。

默认情况下,Azure Databricks 会对单个 MSCK REPAIR 使用多个线程,这会将 createPartitions() 拆分为多个批。 通过限制创建的分区数,它可以防止 Hive 元存储超时或遇到内存不足错误。 它还会并行收集快速统计信息(文件数和文件总大小),避免了按顺序列出元存储文件的瓶颈。 此行为通过 spark.sql.gatherFastStats 控制,并默认启用。