我想更改许多配置单元表所在位置的bucket名称。我们是否可以连接到mysql数据库并更新它?我认为这是可能的,但我想知道在生产数据库中这样做是否安全。
rm5edbpk1#
是的,这是可能的,而且我已经看到了;但是(a) metastore模式没有文档记录,而且每个配置单元版本都会带来一些小的更改,因此您必须进行自己的探索,以找到 StorageDescriptor 对象是持久化的——然后在dev系统上进行一些单元测试/非回归测试——另外,在修补prod系统之前,不要忘记运行一个完整的db备份(还要在dev系统上预演一个紧急恢复!)(b) 你必须更新 StorageDescriptor 对于表,也包括分区--请记住,对于分区表,表级别 LOCATION 只是用作将来分区的默认根目录;一旦创建,分区将保留其位置,直到它被显式更改。作为记录,批量更新的首选方法(理论上)是hive元工具,但不幸的是,它不支持您需要的那种更新。现在它只适用于在所有hdfs路径中更改namenode别名,因为这是一个真正的痛点。。。对于残酷的sql更新,一个有效的替代方法是开发一个自定义java程序,使用HiveMetaStoreAPI扫描所有表和分区,然后读取它们的storagedescriptor,然后在它们的位置上运行regex更改,然后写回更改(这正是metatool所做的,只是在较低的级别上)。但那太过分了。最后,一个可能的折衷方案是对适当的mysql表进行sql选择,以生成(使用 regexp_replace() )稍后在hivecli中运行的alter table/partition location命令链。再加上一个alter链以恢复到原始位置,以防您必须执行紧急回滚 :-/
StorageDescriptor
LOCATION
regexp_replace()
:-/
1条答案
按热度按时间rm5edbpk1#
是的,这是可能的,而且我已经看到了;但是
(a) metastore模式没有文档记录,而且每个配置单元版本都会带来一些小的更改,因此您必须进行自己的探索,以找到
StorageDescriptor
对象是持久化的——然后在dev系统上进行一些单元测试/非回归测试——另外,在修补prod系统之前,不要忘记运行一个完整的db备份(还要在dev系统上预演一个紧急恢复!)(b) 你必须更新
StorageDescriptor
对于表,也包括分区--请记住,对于分区表,表级别LOCATION
只是用作将来分区的默认根目录;一旦创建,分区将保留其位置,直到它被显式更改。作为记录,批量更新的首选方法(理论上)是hive元工具,但不幸的是,它不支持您需要的那种更新。
现在它只适用于在所有hdfs路径中更改namenode别名,因为这是一个真正的痛点。。。
对于残酷的sql更新,一个有效的替代方法是开发一个自定义java程序,使用HiveMetaStoreAPI扫描所有表和分区,然后读取它们的storagedescriptor,然后在它们的位置上运行regex更改,然后写回更改(这正是metatool所做的,只是在较低的级别上)。但那太过分了。
最后,一个可能的折衷方案是对适当的mysql表进行sql选择,以生成(使用
regexp_replace()
)稍后在hivecli中运行的alter table/partition location命令链。再加上一个alter链以恢复到原始位置,以防您必须执行紧急回滚
:-/