基于图数据库的数据仓库表和字段血缘关系分析

基于图数据库的数据仓库表和字段血缘关系分析
专属于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”}]}

通过代码解析后,代码略
最终生成的图数据库血缘关系如下:
红色代表表,代表表和表的血缘关系,棕色代表字段,代表字段和字段之间的血缘关系。

在这里插入图片描述
基于图数据库的数据仓库表和字段血缘关系分析完毕

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值