impala数据血缘与数据地图系列:
-----------------------------------------实时消费impala血缘数据写入neo4j-----------------------------------------------------
前两篇介绍了如何采集impala和hive的血缘日志以及如何实时将该日志采集到kafka消息队列中,今天来介绍如何实时消费血缘日志并写入neo4j图数据库进行血缘的展现。
血缘记录Exactly Once
首先要保证filebeat采集的日志记录不会丢数据,因此需要在filebeat监控impala日志的yml配置文件中指定acks=-1,该参数保证kafka的Leader 在返回确认或错误响应之前,会等待所有同步副本都收到消息,因此吞吐量会降低,但血缘监控impala里的执行日志,一般来说我们在impala或hive中的脚本执行也不会有那么高频的查询提交。
filebeat.yml [kafka参数部分]
#===========kafka output===============
output.kafka:
hosts: ["uatka01:9092","uatka02:9092","uatka03:9092"]
topic: wyk_filebeat_impala_lineage_new_demo
required_acks: -1
消费的时候也要保证每条数据都准确的被消费到而不是在某一条失败后仍提交offset。因此我们需要在消费kafka的时候配置参数:
enable_auto_commit=false
以及消费每条记录成功之后执行
consumer.commit()
在neo4j中创建唯一约束
这里我使用"库名.表名"作为表的节点唯一标识,"库名.表名.列名"作为列的节点唯一标识。
使用如下命令创建neo4j唯一约束:
CREATE CONSTRAINT ON (n:IMPALA_TABLE) ASSERT n.name IS UNIQUE;
CREATE CONSTRAINT ON (n:IMPALA_TABLE_COLUMN) ASSERT n.name IS UNIQUE;
效果验证
开启kafka server -->开启filebeat--> 运行消费者程序 -->开启impala命令行 -->执行DML -->验证效果 -->执行DML -->验证效果
1. 开启kafka sever:
(在kafka篇章里有具体介绍)
$KAFKA_HOME/bin/kafka-server-start.sh -daemon $KAFKA_HOME/config/server.properties
2. 启动filebeat
(参数请参考前面两篇文章):
nohup $FILEBEAT_HOME/filebeat --c $FILEBEAT_HOME/conf/filebeat_impala_lineage_prod.yml -e > $FILEBEAT_HOME/nohup_out.file 2>&1 &
3. 运行消费者程序
执行消费程序.实时解析kafka的数据并写入neo4j.
4. 进入impala命令行
这里是演示,所以我指定其中一台impala节点,同样在第二步里的filebeat也是在该impala daemon节点执行的
impala-shell -i uathd03
impala-shell -i 指定filebeat监控的impala节点
5.执行DML 创建视图
vw_lineage_test,逻辑来源于表dl_nccp.account以及dl_nccp.individual表,字段有account表的gid和decrypt_name,branch_name以及individual表的company_name。
create view vw_lineage_test as
select acc.gid,acc.decrypt_name,ind.company_name ,acc.branch_name
from dl_nccp.account acc
inner join dl_nccp.individual ind on acc.gid=ind.gid and acc.is_deleted='0' and acc.is_valid='0';
6. 验证效果
使用match命令查看所有到节点'vw_lineage_test'的关系。
MATCH p=()-[r]->(d:IMPALA_TABLE) where d.name='default.vw_lineage_test' RETURN p
7.执行DML 修改视图逻辑
新增一个来源表dl_nccp.contact以及该表的字段telephone。
alter view vw_lineage_test2 as
select acc.gid,acc.decrypt_name,ind.company_name,acc.branch_name,c.telephone
from dl_nccp.account acc
inner join dl_nccp.individual ind on acc.gid=ind.gid and acc.is_deleted='0' and acc.is_valid='0'
inner join dl_nccp.contact c on acc.gid = c.gid
7. 验证效果
可以看到新增的contact表以及telephone字段的关系已经实时更新到neo4j内
MATCH p=()-[r]->(d:IMPALA_TABLE) where d.name='default.vw_lineage_test' RETURN p
8. 最终效果
实现字段粒度的血缘分析以及表粒度血缘和业务来源库表的血缘 以及元数据的实时采集。
数据地图:
元数据管理: