血缘系统 datahub + Sqllineage

1.说明

         业界比较主流的数据血缘系统,目前还没能达到与调度系统耦合,最大难点在于代码解析。当某张表下游太多时(特别是维度表),展示也失去了意义,所以多用于排查某张应用表的上游从哪里开。使用方一般为对数仓表结构不太熟悉的业务/数据经理想要了解有哪些数据。

2.部署

2.1 yum 

yum install -y zlib-devel bzip2-devel \
openssl-devel ncurses-devel epel-release gcc gcc-c++ xz-devel readline-devel \
gdbm-devel sqlite-devel tk-devel db4-devel libpcap-devel libffi-devel

2.2 python 

# 下载
wget https://www.python.org/ftp/python/3.8.3/Python-3.8.3.tgz
tar -zxvf Python-3.8.3.tgz

# 安装
cd Python-3.8.3
./configure --prefix=/usr/local/python38
make && make install

# 软链接
ln -s /usr/local/python38/bin/python3.8 /usr/bin/python38
ln -s /usr/local/python38/bin/pip3.8 /usr/bin/pip38

# 验证
python38 -V
pip38 -V
pip38 install --upgrade pip

2.3 Docker-Compose 

vim /etc/docker/daemon.json
{
  "insecure-registries" : ["registry-1.docker.io/v2/"],
  "data-root": "/rainbow/docker"
}

systemctl daemon-reload
systemctl status docker.service
systemctl restart docker.service

# 配置yum的repo源头
yum-config-manager --add-repo http://mirrors.aliyun.com/docker-ce/linux/centos/docker-ce.repo

#安装docker
sudo yum install docker-ce docker-ce-cli containerd.io

#下载docker-compose文件
curl -L https://github.com/docker/compose/releases/download/1.21.1/docker-compose-`uname -s`-`uname -m` -o /usr/local/bin/docker-compose

#将文件复制到/usr/local/bin环境变量下面
mv docker-compose /usr/local/bin

#给他一个执行权限
chmod +x /usr/local/bin/docker-compose

#查看是否安装成功
docker-compose -version

2.4 datahub安装

pip38 install --upgrade pip
python38 -m pip uninstall datahub acryl-datahub || true # sanity check - ok if it
pip38 install acryl-datahub==0.10.5 -i https://docker.mirrors.ustc.edu.cn/simple

# 报错1:包冲突
# 改为上面部署命令
pydantic-core 2.18.1 requires typing-extensions!=4.7.0,>=4.6.0
acryl-datahub 0.10.5 requires typing-extensions<4.6.0,>=3.10.0.2;

# 报错2
# 降级 ImportError: urllib3 v2 only supports OpenSSL 1.1.1+, currently the 'ssl' module is compiled with 'OpenSSL 1.0.2k-fips  26 Jan 2017'.
pip38 uninstall urllib3
pip38 install 'urllib3<2.0'

# 查看版本
python38 -m datahub version

# 下载docker镜像
wget https://github.com/datahub-project/datahub/blob/master/docker/quickstart/docker-compose.consumers-without-neo4j.quickstart.yml
docker pull acryldata/datahub-frontend-react:v0.13.1
docker pull acryldata/datahub-gms:v0.13.1
docker pull acryldata/datahub-kafka-setup:v0.13.1
docker pull acryldata/datahub-elasticsearch-setup:v0.13.1
docker pull acryldata/datahub-upgrade:v0.13.1
docker pull acryldata/datahub-mysgl-setup:v0.13.1
docker pull acryldata/datahub-actions:head
docker pull confluentinc/cp-schema-registry:7.4.0
docker pull confluentinc/cp-kafka:7.4.0
docker pull confluentinc/cp-zookeeper:7.4.0
docker pull elasticsearch:7.10.1
docker pull mysql:8.2

# 安装 
python38 -m datahub version
# 参考版本 https://hub.docker.com/r/linkedin/datahub-gms/tags?page=1&page_size=&ordering=&name=0.1
export DATAHUB_VERSION='v0.13.1'

# 启动方式1:默认启动
python38 -m datahub docker quickstart --mysql-port 53306 --zk-port 52181 --kafka-broker-port 59092 --schema-registry-port 58081 --elastic-port 59200
python38 -m datahub docker quickstart --stop

# 启动方式2:配置文件启动(自定义挂载券、端口)
python38 -m datahub docker quickstart -f /opt/datahub/docker-compose-without-neo4j.quickstart-volumn.yml --version=v0.13.1 --no-pull-images -d 

# 重新部署需要清理过期挂载券volumn!!!
docker volume ls
docker volume rm
docker container prune -f
docker volume prune -f
docker network prune -f
docker builder prune -f
docker ps -a

# 其他:清理所有未使用的镜像、容器、网络和存储卷
python38 -m docker system prune

2.5 导入hive元数据工具


# 安装摄入mysql插件
python38 -m datahub check plugins
pip38 install acryl-datahub[mysql]
python38 -m datahub ingest -c /root/datahub/mysql_to_datahub.yml

# 安装摄入hive插件
yum install cyrus-sasl  cyrus-sasl-lib  cyrus-sasl-plain cyrus-sasl-devel cyrus-sasl-gssapi  cyrus-sasl-md5
pip38 install sasl
pip38 install acryl-datahub[hive]

# 编辑导入脚本
vim pro-hive.yaml

source:
    type: hive
    config:
        host_port: '192.168.1.10:10000'
        include_views: false
        incremental_lineage: true
        scheme: 'hive'
        options:
            connect_args:
                auth: KERBEROS
                kerberos_service_name: hive
sink:
    type: "datahub-rest"
    config:
        server: 'http://192.168.1.10:58080'

# 执行命令
python38 -m datahub ingest -c pro-hive.yaml

2.6 Sqllineage

pip38 install sqllineage

3.血缘解析

3.1核心解析脚本

思路:

项目是git代码,通过扫描文件夹下面的sql或shell文件,提供过sqllineage进行解析,最终api写入datahub,项目涉及到一些sql清洗逻辑。

问题:

  1. datahub血缘写入会覆盖之前的血缘,所以每次写入需要把当前表的血缘获取完整再写入,目前通过dict字典存储,最终再写入。
  2. 每个项目的区别不太一样, 非纯sql文件解析会有异常,但最终执行会有sql文件,处理方式是将最终执行sql输出到中间sql文件夹,再最终sqllineage解析该文件。
# -*- coding: utf-8 -*-
# 多线程解析字段血缘到datahub
import json
from datetime import datetime
import os
import re
import subprocess
import sys

from sqllineage.runner import LineageRunner
import datahub.emitter.mce_builder as builder
from signal import SIGTERM

from multiprocessing import Pool, Manager

if sys.platform == 'linux':
    from signal import alarm

from datahub.emitter.mcp import MetadataChangeProposalWrapper
from datahub.emitter.rest_emitter import DatahubRestEmitter
from datahub.emitter.mce_builder import make_dataset_urn
from datahub.ingestion.graph.client import DatahubClientConfig, DataHubGraph
from datahub.metadata.com.link
### DataHub 对 Spark 计算字段级血缘关系的支持分析 DataHub 的核心功能之一是元数据管理和血缘追踪,其设计目标是为了帮助用户理解数据流经系统的全过程。对于 Spark 计算框架所产生的字段级血缘关系,DataHub 可以通过集成外部工具来实现这一需求。 #### 数据血缘生成的技术原理 DataHub 本身并不直接解析 SQL 或其他脚本语言中的语义逻辑,而是依赖于第三方工具(如 SqlLineage[^2])来进行语法解析并提取其中的数据实体及其关联关系。这些工具能够识别 SQL 查询中的表名、列名以及操作类型,并将其转换为结构化的输入,供 DataHub 使用以便进一步处理和存储。 当涉及 Spark 场景下的字段级别血缘构建时,可以采用类似的策略: 1. **SQL 解析器扩展**:如果 Spark 应用程序主要由嵌套的 SQL 脚本组成,则可以通过增强现有的 SQL 解析流程来捕获更细粒度的信息; 2. **代码扫描机制**:针对包含复杂 DataFrame API 调用或者 RDD 操作的情况,可能需要开发专门用于静态分析 Scala/Python 程序源码的新组件;此部分工作量较大但灵活性更高。 上述方法均需确保最终结果能被正确注入到 DataHub 平台之中作为持久化记录保存下来。 #### 实现方案概述 为了使 DataHub 支持生成 Spark 字段级别的血缘图谱,以下是几个可行的方向: - 利用开源项目 `SqlLineage` 来完成大部分基础性的 ETL 类型任务解析,并尝试适配更多样式的查询表达形式; - 开发自定义插件用来应对非标准模式下无法自动推导出来的特殊情形——比如某些高度定制化的企业内部函数调用场景等; - 探索与 Apache Atlas 这样的专用解决方案相结合的可能性,后者专攻跨平台的大规模企业环境内的全面治理挑战[^1]。 综上所述,在当前技术水平条件下,虽然 DataHub 单独来看尚未原生具备完全满足题目所描述要求的能力,但是借助恰当组合多种手段之后确实有可能达成预期效果。 ```python from sqllineage.runner import LineageRunner def extract_sql_lineage(sql_query): runner = LineageRunner(sql_query) source_tables = list(runner.source_tables) target_tables = list(runner.target_tables) columns_mapping = [(col.parent.name, col.name) for col in runner.columns] return { 'source': source_tables, 'target': target_tables, 'columns': columns_mapping } # Example usage of the function defined above. sample_sql = """ INSERT INTO output_table (field_a, field_b) SELECT t1.col_x AS field_a, SUM(t2.value_y) OVER () as field_b FROM input_table_1 t1 JOIN input_table_2 t2 ON t1.id = t2.ref_id; """ lineage_info = extract_sql_lineage(sample_sql) print(lineage_info) ```
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值