Hive列级血缘与元数据收集
背景
大数据离线计算里不开Hive,而数据字典与数据血缘在数据治理中是最基本和必要的。数据字典和数据血缘可以大幅提升数据分析效率,方便分析人员快速了解业务。本文主要基于Hive 3.x实现列级血缘与元数据收集。
列级血缘收集
思路:使用Hive Hook机制零侵入实现列级血缘的收集。参考Hive源码中org.apache.hadoop.hive.ql.hooks.LineageLogger类,对其进行改造,即可实现列级别血缘关系的收集。
Hook实现代码:ColumnLevelLineageHook.java
Hook部署:打jar包,放入$HIVE_HOME/auxlib/下,修改hive-site.xml如下
<property>
<name>hive.exec.post.hooks</name>
<value>org.apache.hadoop.hive.ql.hooks.LineageLogger,top.qjj.shmily.lineage.ColumnLevelLineageHook</value>
</property>
<property>
<name>column.lineage.enabled</name>
<value>true</value>
</property>
注意事项:hive.exec.post.hooks配置项需带有Hive原生Hook类org.apache.hadoop.hive.ql.hooks.LineageLogger,否则无法获取到列级别的血缘关系,原因见org/apache/hadoop/hive/ql/optimizer/Optimizer.java:78
只有指定了org.apache.hadoop.hive.ql.hooks.LineageLogger,才会添加Generator来生成列级血缘,否则默认针对其他Hook不收集列级别血缘。
元数据实时收集
思路:使用Hive Metastore Listener零侵入实现实时收集Hive元数据变更,参考源码中org.apache.hive.hcatalog.listener.DbNotificationListener或org.apache.hive.hcatalog.listener.NotificationListener类实现。
Listener实现代码:MetadataListener.java
Listener部署:打jar包,放入$HIVE_HOME/lib下,修改hive-site.xml如下
<property>
<name>hive.metastore.event.listeners</name>
<value>top.qjj.shmily.metadata.MetadataListener</value>
</property>
<property>
<name>metadata.listener.service.name</name>
<value>hive_local</value>
</property>
<property>
<name>metadata.listener.meta.server.rest</name>
<value>http://host:port/metadata/receive</value>
</property>
注意事项:
- metadata.listener.service.name可以指定你的集群名称,用于区分多集群,影响输出结果中database\table的fqn(唯一标识)
- metadata.listener.meta.server.rest指定元数据上报地址
- 可以开启lastAccessTime属性统计,通过如下Hive原生参数
<property> <name>hive.security.authorization.sqlstd.confwhitelist.append</name> <!-- <value>hive\.exec\.pre\.hooks</value> --> <value>hive\.*</value> </property> <property> <name>hive.exec.pre.hooks</name> <value>org.apache.hadoop.hive.ql.hooks.UpdateInputAccessTimeHook$PreExec</value> </property>
- 可以开启表统计信息,参数为hive.stats.autogather=true,会额外收集到如下信息
不建议在全局参数设置该参数,会影响写入性能,但可以针对部分表单独设置last_modified_by xxxxx last_modified_time 1690965029 numFiles 11 numRows 10 rawDataSize 34 totalSize 2433 transient_lastDdlTime 1690965096
ALTER TABLE table_name SET TBLPROPERTIES ('hive.stats.autogather'='true');