更新许多表的 Hive 元数据位置



我想更改许多 Hive 表位置的存储桶名称。我们是否可以连接到mySQL数据库并对其进行更新?我认为这是可能的。但是我想知道在生产数据库中执行此操作是否安全。

是的,这是可能的,我已经看到它完成了;但是

(a)元存储架构没有记录,每个 Hive 版本都带来了一些小的更改,因此您必须进行自己的探索以查找StorageDescriptor对象的持久化位置/方式 - 然后在开发系统上进行一些单元测试/非回归测试- 另外,不要忘记在修补 Prod 系统之前运行完整的数据库备份(并在开发系统上排练紧急还原, 太!

(b)您必须更新表的StorageDescriptor,还要更新分区的 -- 请记住,对于分区表,表级LOCATION仅用作未来分区的默认根目录;创建分区后,分区将保留其位置,直到显式更改为止。


作为记录,批量更新的首选方法是(理论上)Hive MetaTool,但不幸的是,它不支持您需要的更新类型。
现在它只适用于更改所有 HDFS 路径中的 NameNode 别名,因为这是一个真正的痛点......

残酷的SQL更新的一个有效替代方案是使用Hive MetaStore API开发一个自定义Java程序,扫描所有表和分区,然后读取它们的StorageDescriptor,然后在它们的位置上运行正则表达式更改,然后写回更改(这正是MetaTool所做的,只是在较低级别)。但那将是矫枉过正。


最后,一个可能的折衷方案是在适当的MySQL表上进行SQL Select,以生成(使用regexp_replace())ALTER 表/分区位置命令链,以便稍后在Hive CLI中运行。
加上一系列 ALTER 以恢复到原始位置,以防您必须执行紧急回滚:-/

最新更新