HIVE 数据仓库容量清理的一般操作
本博客结合笔者公司,总结了一下一般的数据仓库容量清理手段,见识浅陋,如有大佬路过,欢迎指点
随着数据仓库数据量的不断上升,一些表的文件越来越大,HADOOP 集群需要不断的加机器,随着不断的拓展,我们会发现:优化和清理同样重要,优化和清理的尽头才是加机器
此时我们需要对HIVE的容量着手,开始考虑如何清理容量,一般有有一下几点:
清理无用数据
无用的数据很主观,需要对整个仓库的表进行梳理,主要针对以下这些表:
① 临时表
测试或者临时使用的表,这些表的数据一般是无用的
② 中间表
我们在计算过程中,可能会使用一些中间表,如果是分区表,我们就要考虑下,如果这个中间表的数据可以溯源重新计算出来,那么这样的数据可以清理。中间表应该制定规范,尽量少使用中间表,使用完及时清理。
③ ODS 层的表
ODS 层一般是贴源层,抽取业务数据库的数据。如果每天抽取的数据都是全量同时表为分区表,那么历史分区是可以清除的。
…
归档访问频率低的冷历史数据
在 HDFS
的设计中,文件系统中的文件数量直接影响 namenode
中的内存消耗。虽然对于小型集群来说通常不是问题,但当有大量文件时,单个机器上的内存使用可能会达到可访问内存的极限。在这种情况下,尽可能少的文件是有利的。
Hadoop 归档后的文件格式为 Har(一种存储格式) 文件,是一个单独的文件,可以直接访问,但是 HAR 文件并非是压缩的. 因此也不会节约存储空间
Hadoop Archives 是减少文件数量的一种手段,对于访问频率低的冷历史数据我们可以考虑归档方案。
① 归档历史分区
② 归档不常用的数据
③ 归档某个分区下小文件过多的问题
-- 归档后会生成 har 文件
set hive.archive.enabled=true;
alter table cust_info archive partition(ds='20220302');
-- 归档后查看数据
select * from cust_info where ds = '20220302';
-- 可以恢复归档文件
alter table cust_info unarchive partition(ds='20220302');
未压缩的文本表进行压缩处理
压缩是指将原来的 TEXT
格式的未压缩表,替换成 ORC: SNAPPY
压缩的表,从而降低数据存储的占用。主要的流程为:
① 假设我们现在有一张表,压缩格式为 TEXT
,我们现在要调整该表的压缩格式
CREATE TABLE IF NOT EXISTS stu_info
(
stu_id string COMMENT '学生ID'
,stu_name string COMMENT '学生姓名'
,stu_age string COMMENT '学生年龄'
,stu_addr string COMMENT '学生地址'
)
COMMENT '学生信息表'
PARTITIONED BY (ds string)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '\t'
STORED AS textfile;
② 新建一张和目标表字段相同的表,压缩格式为 ORC: SNAPPY
CREATE TABLE IF NOT EXISTS stu_info_orc
(
stu_id string COMMENT '学生ID'
,stu_name string COMMENT '学生姓名'
,stu_age string COMMENT '学生年龄'
,stu_addr string COMMENT '学生地址'
)
COMMENT '学生信息表'
PARTITIONED BY (ds string)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY '\t'
stored as orc tblproperties ("orc.compress"="SNAPPY");
③ 将 stu_info
的数据导入到压缩表 stu_info_orc
中
INSERT OVERWRITE TABLE stu_info_orc
SELECT * FROM stu_info
④ 检查无误后,移除非压缩表,重命名压缩表以保持和原表同名
为了安全起见,压缩后需要检查表的数据格式和数据量,防止异常