背景
修改后,现在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');
复制
- 将分区同步设置为每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 对托管表所做的那样,您需要相应地配置表属性。
- 创建要在 Hive 中查询的数据的 CSV 文件。
- 启动蜂巢。
- 创建一个外部表来存储 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'); - 在外部表上运行 DROP TABLE。
DROP TABLE names_text;
该表从 Hive Metastore 中删除,数据存储在外部。例如,names_text从 Hive Metastore 中删除,并且存储数据的 CSV 文件也从文件系统中删除。 - 防止外部表中的数据被 DROP TABLE 语句删除。
ALTER TABLE addresses_text SET TBLPROPERTIES ('external.table.purge'='false');