Hive 外部表分区发现问题

背景

修改后,现在metastore 重启后5、6分钟就开始卡 。然后我们任务就跑不动了 。
原因分析

查看表所有分区
show partitions xxx_table;

自动管理分区
您可以发现分区更改并自动同步Hive元数据。与手动执行相反,自动执行同步可以节省大量时间,尤其是在分区数据(例如日志)频繁更改时。您还可以配置将分区数据和元数据保留多长时间。
创建分区表后,Hive不会更新有关您添加或删除的文件系统上相应对象或目录的元数据。添加或删除相应的对象/目录后,Hive元存储中的分区元数据变得陈旧。您需要同步元存储和文件系统。
您可以手动或自动刷新Hive Metastore分区信息。
• 手动
您运行MSCK(元存储一致性检查)Hive命令: MSCK REPAIR TABLE table_name SYNC PARTITIONS每次需要将分区与文件系统同步时。
• 自动
您将分区发现设置为定期发生。
discover.partitions表属性是自动创建的,并已为外部分区表启用。当discover.partitions 对一个表被启用,蜂巢如下执行自动刷新:
• 将文件系统中但不在metastore中的相应分区添加到metastore。
• 如果您从文件系统中删除了相应的分区,则从元存储中删除分区架构信息。
您可以配置保留分区元数据和数据多长时间,并在保留期限过后将其删除。
局限性
通常,不建议在托管表上使用分区发现和保留。Hive元存储在表上获取排他锁,从而启用分区发现,这会减慢其他查询的速度。
自动进行分区发现和修复
Hive可以自动并定期发现Hive元存储中分区元数据中以及文件系统上相应目录或对象中的差异。发现差异后,Hive执行同步。自动分区发现对于处理Spark和Hive目录中的日志数据以及其他数据很有用。
该discover.partitions表属性启用或禁用并与分区的文件系统同步。在外部分区表中,创建表时默认情况下启用此属性(true)。对于旧版外部表(使用不支持此功能的Hive版本创建),您需要添加discover.partitions到表属性中以启用分区发现。
默认情况下,分区的发现和同步每5分钟进行一次,但是您可以按照此任务中所示配置频率。
启用压缩(请参见下面的链接)作为解决以下已知问题的解决方法:除非启用压缩,否则发现不会开始。
1.假设您使用不支持分区发现的Hive版本创建了一个外部表,请对该表启用分区发现。
ALTER TABLE exttbl SET TBLPROPERTIES ('discover.partitions' = 'true');
复制

  1. 将分区同步设置为每10分钟发生一次,以秒为单位:设置metastore.partition.management.task.frequency为600。
    ALTER TABLE exttbl SET TBLPROPERTIES ('metastore.partition.management.task.frequency' = 600)
    discover.partitions参数设置为true了,导致我drop分区后,内容没有被删除,分区有自动发现了,造成锁表
    解决

第一种关闭自动分区发现(不推荐)

ALTER TABLE exttbl SET TBLPROPERTIES ('discover.partitions' = 'false');
第二种 修改external.table.purge

external.table.purge这个参数建表的时候设成true,加了这个删分区就文件了。
ALTER TABLE exttbl SET TBLPROPERTIES ('external.table.purge' = 'true');
删除外部表数据
当您在外部表上运行 DROP TABLE 时,默认情况下 Hive 仅删除元数据(模式)。如果您希望 DROP TABLE 命令也删除外部表中的实际数据,就像 DROP TABLE 对托管表所做的那样,您需要相应地配置表属性。

  1. 创建要在 Hive 中查询的数据的 CSV 文件。
  2. 启动蜂巢。
  3. 创建一个外部表来存储 CSV 数据,配置该表以便您可以将其与数据一起删除。
    CREATE EXTERNAL TABLE IF NOT EXISTS names_text(
    a INT, b STRING)
    ROW FORMAT DELIMITED
    FIELDS TERMINATED BY ','
    STORED AS TEXTFILE
    LOCATION '://andrena'
    TBLPROPERTIES ('external.table.purge'='true');
  4. 在外部表上运行 DROP TABLE。
    DROP TABLE names_text;
    该表从 Hive Metastore 中删除,数据存储在外部。例如,names_text从 Hive Metastore 中删除,并且存储数据的 CSV 文件也从文件系统中删除。
  5. 防止外部表中的数据被 DROP TABLE 语句删除。
    ALTER TABLE addresses_text SET TBLPROPERTIES ('external.table.purge'='false');