废弃下线的业务,直接在调度系统下线了相应的调度任务,而大量历史数据仍然残留,需要清除。
去年集群迁移,导致很多表有HDFS数据但Hive上没有元数据,需要清除。
① 扫描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。
① 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或者其他数据持久化方案。
数据治理个人认为在大数据领域是必做的工作之一,尤其是在进行了集群切换、数据迁移等操作,过时的文件将会非常多。这边提供了一个大致的思路框架,具体实现如果有更好的想法和问题,欢迎评论和私信!