基于Kettle和帆软Finereport的血缘解析
一、背景:
用户经常会针对数据存在质量的存疑,反馈数据不准。开发人员排查数据质量问题步骤:首先和业务人员对接了解是哪里数据不准确,要定位是哪张报表,然后查看报表后面数据来源,然后一路排查数仓。往往定位到数据问题耗时比较高,开发断层导致找到相关任务比较难。
二、解决办法:
通过血缘解析,把报表数据来源去向的信息都提取出来,方便:开发人员迅速找到相关任务。
三、解决思路:
Kettle的转换和作业存储底层是通过xml实现。作业是由转换组成,转换由组件组成。可以通过解析xml找到来源表和去向表。帆软Finereport的报表cpt和 frm底层存储也是xml,可以解析xml获取数据集,解析sql获取到表和字段。最终得到报表名,报表路径,数据库表,数据集。
tips:还可以进一步解析作业调度(主流调度工具:crontab,airflow,azkanban,ooize)可以解析出作业调度信息。
四、具体实现:
4.1.Kettle血缘:
首先要找到输入输出组件,一般输入组件包含如图 4-1所示,输出如图 4-2所示(实际转换中还可能使用追加流或者SQL脚本,这里只说常见的) 。一般Kettle转换(输入输出组件不同找到来源和目标方式不同)如图 4-3 所示。我们以文本编辑器打开转换文件Ktr,会以图 4-4 所示 。 如果内容比较乱,可以找一个xml解析工具格式化一下。可以清晰的看到转换是存在<step>节点里,如图 4-5所示。根据里面的<type>找到输入和输出组件。然后输入如果是表输入,通过sql查询的,用sql parser解析获取到表和字段信息。数据连接是存在<connection>节点里(这里如果数据以JNDI的方式存储的需要解析JNDI文件获取到数据配置信息),如图 4-6所示,可以获取到数据库信息。组件连接信息是在<order>节点里面(这里比较复杂是要考虑数据分发和数据复制)。这样一个完整的转换解析就完成。作业同理。一般作业和转换是发布在服务器上,需要遍历服务器目录下所有的以ktr和kjb结尾文件。
图 4-1
图 4-2
图 4-3
图 4-4
图 4-5
图 4-6
4.2 FIneReport血缘:
FineReport报表存储文件是以cpt和frm结尾,以文本编辑器打开,如图 4-7所示。可以找到数据集是存在<TableData>节点下,可以拿到查询的sql,然后用sql parser解析获取到表和字段,在<DatabaseName>里面可以拿到数据连接名,这里可以在帆软内置库中找到数据连接名的具体链接信息,用于打通和Kettle之间的联系。
图4-7
图 4-8
4.3 调度解析:
调度工具比较多,这里讲一下Crontab和Airflow。Crontab一般会可以通过crontab -l 命令获取调度的信息。解析信息可以拿到作业的计划调度时间(更深一层可以考虑获取作业执行日志拿到实际调度时间。然后针对调度进行运营管理)。Airflow由内置数据库,可以获取到作业和调度信息,然后去找到作业文件找到具体的作业(这里不过多介绍Airflow,只讲一下思路)。
五、实现效果:
以上所有数据和获取到进行加工处理。最终展示如表 4-1所示:
表 4-1
来源层 | 来源表 | 来源字段 | 目标层 | 目标表 | 目标字段 | 作业名 | 计划调度 | 实际调度 |
---|---|---|---|---|---|---|---|---|
SAP | KNAL | fleld1 | ODS | ods_sap_knal | fleld2 | job1 | * * * * 8 | * * * * 8 |
ODS | ods_sap_knal | fleld2 | DWD | dwd_custom_detd | fleld3 | job2 | * * * * 10 | * * * * 10 |
DWD | dwd_custom_detd | fleld3 | DWS | dws_custom_detd | fleld4 | job3 | * * * * 11 | * * * * 11 |
DWS | dws_custom_detd | fleld4 | FR | custom.cpt | fleld5 | * * * * 12 | * * * * 12 |
以上列表只是参考,实际有很多复杂情况。
关于上表每行解释:
- 来源层,这个数据一般是系统名和数仓名。这里数仓名一般是通过解析表明获取到。可以参考数仓规范(一般数仓运营会将弄作业监控命名规范)。
- 来源表,这个是上面解析sql或者转换解析获取到(在输出规范一般要要求表名规范)
- 来源字段,同上(实际数仓运营会拿到字段里数据长度和字段类型以及长度进行管理)
- 目标层,同来源层
- 目标表,同来源表
- 目标组队那,同来源字段
- 计划调度时间,这里要考虑作业会存在多个调度频率,一般会存多行,在实际展示会根据crontab解析给出未来十个调度时间(如每天八点更新,这里就会给出后面十天八点的时间)
- 实际调度时间,这里获取方式比较多,一种通过日志解析,还有可以在作业执行的时候将时间写入到数据库,但是这种作业失败就拿不到数据,所以通常会解析日常,还可以监控作业执行情况。(一般有能力的会由作业监控平台)
图形展示(os:自己用的d3.js做出来效果不如这个所以不放实际效果图了)如下,鼠标移动到线条可以看到作业名和调度时间。
五、扩展:
这里讲的是传统数仓,传统数仓一般没有血缘,所以数据发生质量问题排查比较耗时。现在数据中台基本由数据血缘功能,大部分基于Atlas。但是如果存在临时表,就会存在血缘中断。还有是通过解析sql,但是这种缺点是要找到所有任务。这两个都无法获取到所有的数据血缘,所以有的产品会有血缘录入的功能进行补充。
上面只讲了帆软FineReport,帆软还有FineBI,在FineBI里是有血缘的,如果要做整体的管理,可以考虑将FineBI的数据获取到和所有的血缘进行融合。
以上只是个人在工作中针对传统数仓的数据治理的一些实践。其实还有很多ETL工具如DataStage、Informatica、Airflow、Datax等等之类的,可以根据以上逻辑进行血缘解析。
相关文章:

基于Kettle和帆软Finereport的血缘解析
一、背景: 用户经常会针对数据存在质量的存疑,反馈数据不准。开发人员排查数据质量问题步骤:首先和业务人员对接了解是哪里数据不准确,要定位是哪张报表,然后查看报表后面数据来源,然后一路排查数仓。往往定…...
给qemu虚机更换(Windows PE)光盘
1. 背景 qemu虚机里运行windows。如果遇到虚机windows启动故障,甚至连安全模式也故障时,可以尝试更换另一个光驱里的光盘为pe光盘。 2. 步骤 2.1. 找出VDI虚机所在的计算节点 ssh登录之,virsh list获得虚机id,例如 391 1255…...
python 神经网络归纳
CNN卷积神经网络 一个卷积神经网络主要由以下5层组成: 数据输入层/ Input layer卷积计算层/ CONV layerReLU激励层 / ReLU layer池化层 / Pooling layer全连接层 / FC layer 1. 数据输入层 该层要做的处理主要是对原始图像数据进行预处理,其中包括&…...
Python高级语法与正则表达式
Python提供了 with 语句的写法,既简单又安全。 文件操作的时候使用with语句可以自动调用关闭文件操作,即使出现异常也会自动关闭文件操作。 # 1、以写的方式打开文件 with open(1.txt, w) as f:# 2、读取文件内容f.write(hello world) 生成器的创建方…...

【洛谷算法题】P4414-[COCI2006-2007#2] ABC【入门2分支结构】Java题解
👨💻博客主页:花无缺 欢迎 点赞👍 收藏⭐ 留言📝 加关注✅! 本文由 花无缺 原创 收录于专栏 【洛谷算法题】 文章目录 【洛谷算法题】P4414-[COCI2006-2007#2] ABC【入门2分支结构】Java题解🌏题目描述&a…...

Python如何将图片转换成字符
PIL(Python Image Library)库是Python平台上一个功能强大的图像处理标准库,支持图像的存储、显示和处理,几乎可以处理所有图片格式,如图像的压缩、裁剪、叠加、添加文字等等。 安装PIL库:pip install pillow from PIL import Image ascii_cha…...

国家开放大学形成性考核 统一资料 参考试题
试卷代号:1174 水工钢筋混凝土结构(本)参考试题 一、选择题(每小题2分,共20分,在所列备选项中,选1项正确的或最好的作为答案,将选项号填入各题的括号中) 1.钢筋混凝土结…...

4.7 【共享源】流的生产者(二)
七,模式 流的模式决定了Screen如何使前台缓冲区可用。生产者通过调用screen_set_stream_property_iv()并设置SCREEN_PROPERTY_MODE属性来设置模式。有效模式如下: 7.1 SCREEN_STREAM_MODE_DEFAULT 如果生产者应用程序没有在流上明确设置 SCREEN_PROPERTY_MODE 属性,则 Sc…...

流量录制回放工具在自动化测试领域应用探索
引言: 随着中国农业银行技术架构的日益更迭与业务场景的不断创新,测试工作正在面临数据构造繁琐、案例维护成本较高且质量参差不齐等诸多问题与挑战,主要体现在以下四方面: 一是在系统架构升级与代码重构时,大量原始接…...

【高数定积分求解旋转体体积】 —— (上)高等数学|定积分|柱壳法|学习技巧
🌈个人主页: Aileen_0v0 🔥热门专栏: 华为鸿蒙系统学习|计算机网络|数据结构与算法 💫个人格言:"没有罗马,那就自己创造罗马~" 目录 Shell method Setting up the Integral 例题 Example 1: Example 2: Example 3: Example …...

Ubuntu20.04 及深度学习环境anaconda、cuda、cudnn、pytorch、paddle2.3安装记录
学习目标: Ubuntu20.04下装好torch、paddle深度学习环境。 选择的版本环境是 :最新的nvidia驱动、cuda 11.1 、cudnn v8.1.1,下面会说为啥这么选。 学习内容: 1. Ubuntu20.04仓库换源 本节参考Ubuntu 20.04 Linux更换源教程 2…...
场景切割CVPr2022 SceneSegmentation
目录 算法介绍 无监督训练原理 源码地址: lstm模块 bilstm opencv场景分割 加阈值:...
Spring Cloud Feign作为HTTP客户端调用远程HTTP服务
如果你的项目使用了SpringCloud微服务技术,那么你就可以使用Feign来作为http客户端来调用远程的http服务。当然,如果你不想使用Feign作为http客户端,也可以使用比如JDK原生的URLConnection、Apache的Http Client、Netty的异步HTTP Client或者Spring的RestTemplate。 那么,为…...
[node] Node.js的文件系统
[node] Node.js的文件系统 文件系统的使用异步和同步input.txt示例 常用方法打开文件语法示例 获取文件信息语法示例 写入文件语法示例 读取文件语法示例 关闭文件语法示例 截取文件语法示例 删除文件语法示例 创建目录语法示例 读取目录语法示例 删除目录语法示例 文件模块方法…...

【Linux系统基础】(2)在Linux上部署MySQL、RabbitMQ、ElasticSearch、Zookeeper、Kafka、NoSQL等各类软件
实战章节:在Linux上部署各类软件 前言 为什么学习各类软件在Linux上的部署 在前面,我们学习了许多的Linux命令和高级技巧,这些知识点比较零散,同学们跟随着课程的内容进行练习虽然可以基础掌握这些命令和技巧的使用,…...
CJson 使用 - 解析Object结构
简介 准备在开发板中使用json结构传送数据, 选用了cJson, 现在看下cJson的使用吧步骤 下载 git clone https://github.com/DaveGamble/cJSON 或者直接压缩包下载也行, 毕竟国内有时候下载不下来Qt 中使用cJson 在下载的cJson 目录中加入cJson.pri, 内容如下 INCLUDEPATH …...
MySQL8主主搭建
-- mysql8 主主搭建 mysql-8.0.35-linux-glibc2.12-x86_64.tar.xz 主1 : 192.168.2.160 主2 : 192.168.2.161 --解压mysql-8.0.35-linux-glibc2.12-x86_64.tar.xz为mysql8 -- 初始化mysql8 (略) -- 参数192.168.2.160 [root…...

使用Pycharm一键将.ui文件生成.py文件配置教程、一键打开QTDesigner教程
2df3621a-7ffd-4f18-9735-b86464b83a5b 前言 我痛恨所有将白嫖归为理所应当的猪🐖。 教程 打开pycharm之后,依次点击File->Settings->Tools->External Tools,进入如下界面: 1、配置快捷打开Qt Designer 点击号&…...

React 路由跳转
1. push 与 replace 模式 默认情况下,开启的是 push 模式,也就是说,每次点击跳转,都会向栈中压入一个新的地址,在点击返回时,可以返回到上一个打开的地址, 就像上图一样,我们每次返…...
【MySQL】数据处理:从SQL批量删除报错到Python优雅解决
一、背景 MySQL数据库表中有一批重复的脏数据,为不影响正常业务,需要进行批量删除。 二、SQL批量删除 首先想到的是编写SQL语句来批量删除:删除身份证号为51****59且ID不为5的全部数据(保留ID为5的那一条数据) DELETE FROM test_table WHERE id IN ( SELECT i…...
论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(二)
HoST框架核心实现方法详解 - 论文深度解读(第二部分) 《Learning Humanoid Standing-up Control across Diverse Postures》 系列文章: 论文深度解读 + 算法与代码分析(二) 作者机构: 上海AI Lab, 上海交通大学, 香港大学, 浙江大学, 香港中文大学 论文主题: 人形机器人…...
rknn优化教程(二)
文章目录 1. 前述2. 三方库的封装2.1 xrepo中的库2.2 xrepo之外的库2.2.1 opencv2.2.2 rknnrt2.2.3 spdlog 3. rknn_engine库 1. 前述 OK,开始写第二篇的内容了。这篇博客主要能写一下: 如何给一些三方库按照xmake方式进行封装,供调用如何按…...

微软PowerBI考试 PL300-选择 Power BI 模型框架【附练习数据】
微软PowerBI考试 PL300-选择 Power BI 模型框架 20 多年来,Microsoft 持续对企业商业智能 (BI) 进行大量投资。 Azure Analysis Services (AAS) 和 SQL Server Analysis Services (SSAS) 基于无数企业使用的成熟的 BI 数据建模技术。 同样的技术也是 Power BI 数据…...

3.3.1_1 检错编码(奇偶校验码)
从这节课开始,我们会探讨数据链路层的差错控制功能,差错控制功能的主要目标是要发现并且解决一个帧内部的位错误,我们需要使用特殊的编码技术去发现帧内部的位错误,当我们发现位错误之后,通常来说有两种解决方案。第一…...
什么是EULA和DPA
文章目录 EULA(End User License Agreement)DPA(Data Protection Agreement)一、定义与背景二、核心内容三、法律效力与责任四、实际应用与意义 EULA(End User License Agreement) 定义: EULA即…...
leetcodeSQL解题:3564. 季节性销售分析
leetcodeSQL解题:3564. 季节性销售分析 题目: 表:sales ---------------------- | Column Name | Type | ---------------------- | sale_id | int | | product_id | int | | sale_date | date | | quantity | int | | price | decimal | -…...
06 Deep learning神经网络编程基础 激活函数 --吴恩达
深度学习激活函数详解 一、核心作用 引入非线性:使神经网络可学习复杂模式控制输出范围:如Sigmoid将输出限制在(0,1)梯度传递:影响反向传播的稳定性二、常见类型及数学表达 Sigmoid σ ( x ) = 1 1 +...
docker 部署发现spring.profiles.active 问题
报错: org.springframework.boot.context.config.InvalidConfigDataPropertyException: Property spring.profiles.active imported from location class path resource [application-test.yml] is invalid in a profile specific resource [origin: class path re…...
Python 包管理器 uv 介绍
Python 包管理器 uv 全面介绍 uv 是由 Astral(热门工具 Ruff 的开发者)推出的下一代高性能 Python 包管理器和构建工具,用 Rust 编写。它旨在解决传统工具(如 pip、virtualenv、pip-tools)的性能瓶颈,同时…...

让回归模型不再被异常值“带跑偏“,MSE和Cauchy损失函数在噪声数据环境下的实战对比
在机器学习的回归分析中,损失函数的选择对模型性能具有决定性影响。均方误差(MSE)作为经典的损失函数,在处理干净数据时表现优异,但在面对包含异常值的噪声数据时,其对大误差的二次惩罚机制往往导致模型参数…...