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

技术人员,

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

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

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

【问题讨论】:

    标签: hive hdfs hbase cloudera impala


    【解决方案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)来自动执行此过程。但是,在使用自动化之前手动尝试前两次尝试,以确保一切按预期进行。

    如果有帮助请告诉我!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-11-05
      • 2015-09-02
      • 2017-03-09
      • 2014-12-05
      • 1970-01-01
      • 2020-11-02
      • 1970-01-01
      • 2019-07-29
      相关资源
      最近更新 更多