1、背景
废弃下线的业务,直接在调度系统下线了相应的调度任务,而大量历史数据仍然残留,需要清除。
去年集群迁移,导致很多表有HDFS数据但Hive上没有元数据,需要清除。
2、思路
① 扫描HDFS目录,到分区深度(比如/user/hive/warehouse/test.db/hdfs_audit/pt=20200416
,深度为6)
② 采集HDFS audit log(注意过滤扫描HDFS目录时产生的脏日志)
③ 给audit log和HDFS目录建外部表,互相关联去重,获得HDFS近期未访问的文件列表。
④ 将Hive metastore若干元数据表抽取到Hive中,进行关联,获取各个表和分区最近访问的时间戳。
⑤ 将③和④获得的结果表进行关联,获得Hive废弃表及其最近一次访问时间戳。
(此处获得了Hive需要清理的表,注意特殊情况:如果调度平台上的SQL扫描了一张废弃表不存在的分区,在Hive元数据和HDFS audit log都不会有任何记录,但如果将表删了,调度任务则会报错。因此需要将这些任务找出来,在优化SQL后进行Hive废弃表的清理)
⑥ 给Spark、Hive和Presto等查询引擎增加preAnalyze Hook,持久化所有查询记录。
(这边只需用调度平台的SQL查询记录即可)
⑦ 将⑤和⑥的结果表进行关联,获得调度系统上扫描空分区的任务,供算法和数仓优化SQL。
3、具体实现
① HDFS目录扫描
② Flume采集HDFS audit log日志至HDFS
③ 建ods.ods_hdfs_audit_log_d
外部表:
CREATE EXTERNAL TABLE `ods_hdfs_audit_log_d