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

时间:2017-01-03 20:01:53

标签: hive hiveql

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

1 个答案:

答案 0 :(得分:0)

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

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

(b)您必须更新表的StorageDescriptor,还要更新分区 - 请记住,对于分区表,表级{ {1}}仅用作未来分区的默认根目录;一旦创建,分区将保留其位置,直到它被明确更改为止。

<小时/> 对于记录,批量更新的首选方法是(理论上)Hive MetaTool但不幸的是,它不支持您需要的更新类型。
现在它只适用于更改NameNode别名在所有HDFS路径中,因为那是真正的pain point ...

残酷的SQL更新的有效替代将是使用Hive MetaStore API开发自定义Java程序来扫描所有表格&amp;分区然后读取他们的StorageDescriptor然后在他们的位置上运行RegEx更改然后回写更改(这正是MetaTool所做的,只是在较低级别)。但这太过分了。


最后,可能的妥协将是相应MySQL表上的SQL Select,以生成(LOCATION){{3}链稍后在Hive CLI中运行的命令。
如果你不得不进行紧急回滚,请加上一系列ALTER以恢复到原始位置regexp_replace()