数据治理-HDFS废弃文件、Hive废弃表检测与清理

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`(
  `date` string COMMENT 'from deserializer',
  `time` string COMMENT 'from deserializer',
  `ms` string COMMENT 'from deserializer',
  `log_level` string COMMENT 'from deserializer',
  `clazz` string COMMENT 'from deserializer',
  `allowed` string COMMENT 'from deserializer',
  `ugi` string COMMENT 'from deserializer',
  `auth` string COMMENT 'from deserializer',
  `ip` string COMMENT 'from deserializer',
  `cmd` string COMMENT 'from deserializer',
  `src` string COMMENT 'from deserializer',
  `dest` string COMMENT 'from deserializer',
  `perm` string COMMENT 'from deserializer',
  `proto` string COMMENT 'from deserializer')
PARTITIONED BY (
  `stat_day` string)
ROW FORMAT SERDE
  'org.apache.hadoop.hive.contrib.serde2.RegexSerDe'
WITH SERDEPROPERTIES (
  'input.regex'='(\\S+)\\s+(\\S+),(\\S+)\\s+(\\S+)\\s+(\\S+)\\s+allowed=(\\S+)\tugi=(\\S+)\\s+\\(auth:(\\S+)\\)\tip=(\\S+)\tcmd=(.*)\tsrc=(.*)\tdst=(.*)\tperm=(\\S+)\tproto=(\\S+)')
STORED AS INPUTFORMAT
  'org.apache.hadoop.mapred.TextInputFormat'
OUTPUTFORMAT
  'org.apache.hadoop.hive.ql.io.HiveIgnoreKeyTextOutputFormat'
LOCATION
  'hdfs://nameservice1/user/hive/warehouse/ods.db/ods_hdfs_audit_log_d'
TBLPROPERTIES (
  'transient_lastDdlTime'='1588145951')

在查询ods.ods_hdfs_audit_log_d时,需要添加依赖hive-contrib-2.3.6.jar

④ 抽取mysql到Hive方案很多,不一一介绍。

⑤和⑦ 根据业务场景需求,实现关联表和过滤,这边场景很多就不详细列出了。

⑥ 大致思路是在Spark和Presto SQL入口增加一个AnalyzeHook入口,增加并读取配置,加载类,调用实现方法。而Hive中已经有现成的接口HiveSementicAnalyzeHook和参数hive.semantic.analyzer.hook
Hook具体实现也很简单,根据语法解析树解析结果,将SQL command、inputs、output、user传过来,插入mysql或者其他数据持久化方案。

3、总结

数据治理个人认为在大数据领域是必做的工作之一,尤其是在进行了集群切换、数据迁移等操作,过时的文件将会非常多。这边提供了一个大致的思路框架,具体实现如果有更好的想法和问题,欢迎评论和私信!

你可能感兴趣的:(hadoop,hdfs)