基于图数据库的数据仓库表和字段血缘关系分析
专属于liuSir-未经允许转载,追求法律责任
项目介绍:通过实时解析hive产生的日志分析hive中的表和字段的数据血缘,并且入neo4j图数据库,字段的血缘关系只需要修改hive的配置文件即可,表的血缘关系需要修改hive的源代码。
注意:hive源码包需要在linux中进行编译,本人在windows中编译无一成功。
在org.apache.hadoop.hive.ql.hooks.LineageLogger的run方法中加入以下代码
try{
org.apache.hadoop.hive.ql.tools.LineageInfo lep = new org.apache.hadoop.hive.ql.tools.LineageInfo();
lep.getLineageInfo(queryStr);
writer.name("inputs");
writer.beginArray();
for (String tab:lep.getInputTableList()){
writer.value(tab);
}
writer.endArray();
writer.name("outputs");
writer.beginArray();
for (String tab:lep.getOutputTableList()){
writer.value(tab);
}
writer.endArray();
}catch (NullPointerException e){
log("获取表级别血缘关系失败"+org.apache.hadoop.util.StringUtils.stringifyException(e));
}
我这里使用的是hive2.3.5版本,其余hive版本自行测试,在linux中apache-hive-2.3.5-src\apache-hive-2.3.5-src目录下编译
输入mvn clean package -Pdist -DskipTests 即可进行编译,中间可能存在编译错误,多次编译通过即可。
此时将hadoop集群及其hive安装在服务器上,具体安装步骤略
在hive-site.xml中配置以下参数
<property>
<name>hive.exec.post.hooks</name>
<value>org.apache.hadoop.hive.ql.hooks.LineageLogger</value>
</property>
vim ${HIVE_HOME}/conf/hive-log4j2.properties
og4j.logger.org.apache.hadoop.hive.ql.hooks.LineageLogger=INFO
此时在hive此时在hive的的hive.log中即可查询到表和字段之间的血缘关系
举例说明:
create table liuSir.test1(id int,name string);
create table liuSir.test2(id int,location string);
create table liuSir.test3(id int,name string,location string);
insert into table liuSir.test3 select x.id,x.name,y.location from liuSir.test1 x join liuSir.test2 y on x.id=y.id;
此时生成的是json,可以通过解析json来实现
代码实现思路:
通过tail -f 实时监控log日志,并且解析log日志中的表和字段的血缘关系,将其存在图数据库中。
json解析后如下:
检测日志后通过匹配规则并将解析到的日志转成小写
{“version”:“1.0”,“user”:“root”,“timestamp”:1592978784,“duration”:49537,“jobids”:[“job_1592960604436_0003”],“engine”:“mr”,“database”:“liusir”,“hash”:“b609faf693b68ee2adcc9fd6a6401045”,“querytext”:“insert into table liusir.test3 select x.id,x.name,y.location from liusir.test1 x join liusir.test2 y on x.id=y.id”,“inputs”:[“liusir.test1”,“liusir.test2”],“outputs”:[“liusir.test3”],“edges”:[{“sources”:[3],“targets”:[0],“edgetype”:“projection”},{“sources”:[4],“targets”:[1],“edgetype”:“projection”},{“sources”:[5],“targets”:[2],“edgetype”:“projection”},{“sources”:[3],“targets”:[0,1,2],“expression”:“x.id is not null”,“edgetype”:“predicate”},{“sources”:[3,6],“targets”:[0,1,2],“expression”:"(x.id = y.id)",“edgetype”:“predicate”},{“sources”:[6],“targets”:[0,1,2],“expression”:“y.id is not null”,“edgetype”:“predicate”}],“vertices”:[{“id”:0,“vertextype”:“column”,“vertexid”:“liusir.test3.id”},{“id”:1,“vertextype”:“column”,“vertexid”:“liusir.test3.name”},{“id”:2,“vertextype”:“column”,“vertexid”:“liusir.test3.location”},{“id”:3,“vertextype”:“column”,“vertexid”:“liusir.test1.id”},{“id”:4,“vertextype”:“column”,“vertexid”:“liusir.test1.name”},{“id”:5,“vertextype”:“column”,“vertexid”:“liusir.test2.location”},{“id”:6,“vertextype”:“column”,“vertexid”:“liusir.test2.id”}]}
通过代码解析后,代码略
最终生成的图数据库血缘关系如下:
红色代表表,代表表和表的血缘关系,棕色代表字段,代表字段和字段之间的血缘关系。
基于图数据库的数据仓库表和字段血缘关系分析完毕