Hive - 巨大的 10TB 表重新分区(添加新的分区列)

Posted

技术标签:

【中文标题】Hive - 巨大的 10TB 表重新分区(添加新的分区列)【英文标题】:Hive - Huge 10TB table repartitioning (Adding new partition columns) 【发布时间】:2019-04-06 00:29:45 【问题描述】:

技术人员,

背景 - 我们有 10TB 的现有配置单元表,该表已在 A 列上进行范围分区。业务案例发生了变化,现在除了 A 列之外,还需要添加分区列 B。

问题陈述 - 由于 HDFS 上的数据太大,需要重组以继承新的分区列 B,我们面临着将表复制到备份并使用简单的 IMPALA INSERT OVERWRITE 重新摄取到主表中的困难。

我们想探索是否有/有有效的方法来处理将分区列添加到如此巨大的表中

【问题讨论】:

【参考方案1】:

好的!

如果我正确理解您的情况,您在 HDFS 中有一个由 10 TB 数据支持的表,其分区位于 A 列上,并且您还想在 B 列上添加分区。

因此,如果 B 列将成为子分区,则 HDFS 目录看起来像 user/hive/warehouse/database/table/colA/colB 或 /colB/colA 否则(将其视为托管表)。

手动重构 HDFS 目录并不是一个好主意,因为扫描所有文件上的数据并将其相应地组织到相应的文件夹中将成为一场噩梦。

下面是一种方法,

1. 创建一个具有新结构的新表 - 即在 Col A 和 Col B 上具有分区。

CREATE TABLE NEWTABLE ( COLUMNS ... ) PARTITON ON ( COL_A INT, COL_B INT )

2.a. 将旧表中的数据插入到新表(在第 1 步中创建),如下所示,

INSERT INTO NEWTABLE 
SELECT * FROM OLDTABLE

但是,是的,如果处理不当,此步骤将在执行期间消耗大量资源,HDFS 中用于将结果存储为 NEWTABLE 数据的空间,当然还有时间。

2.b. 如果您认为 HDFS 没有足够的空间来保存所有数据或资源紧张,我建议您分批进行此 INSERT,并在每次 INSERT 后删除旧数据操作。

INSERT INTO NEWTABLE 
SELECT * FROM OLDTABLE
WHERE COL_A='abc'

DELETE FROM OLDTABLE
WHERE COL_A='abc'

INSERT INTO NEWTABLE 
SELECT * FROM OLDTABLE
WHERE COL_A='def'

DELETE FROM OLDTABLE
WHERE COL_A='def'

.
.
.
so on.

这样,您可以卸载 HDFS 与已处理的数据并平衡空间。

如果您按照步骤 2.b. 进行操作,那么您可以编写一个脚本,通过为每次运行动态传递分区名称(派生自 SHOW PARTITIONS)来自动执行此过程。但是,在使用自动化之前手动尝试前两次尝试,以确保一切按预期进行。

如果有帮助请告诉我!

【讨论】:

以上是关于Hive - 巨大的 10TB 表重新分区(添加新的分区列)的主要内容,如果未能解决你的问题,请参考以下文章

将新分区添加到已分区的配置单元表

从 Hive 分区外部表中删除特定列

如果未添加新分区,则需要 hive 每日 msck 修复

使用 ALTER 添加新列后,数据错误地加载到 Hive 分区表中

hive表添加字段导致历史分区查询报错

Hive 分区方案及其对性能的影响