Datahub 安装失败记录

背景介绍

参考链接: https://blog.csdn.net/ddxygq/article/details/123437072

DataHub是由LinkedIn的数据团队开源的一款提供元数据搜索与发现的工具。

提到LinkedIn,不得不想到大名鼎鼎的Kafka,Kafka就是LinkedIn开源的。LinkedIn开源的Kafka直接影响了整个实时计算领域的发展,而LinkedIn的数据团队也一直在探索数据治理的问题,不断努力扩展其基础架构,以满足不断增长的大数据生态系统的需求。随着数据的数量和丰富性的增长,数据科学家和工程师要发现可用的数据资产,了解其出处并根据见解采取适当的行动变得越来越具有挑战性。为了帮助增长的同时继续扩大生产力和数据创新,创建了通用的元数据搜索和发现工具DataHub。

Datahub作为新一代的元数据管理平台,大有取代老牌元数据管理工具Atlas之势。首先,阿里云也有一款名为DataHub的产品,是一个流式处理平台,本文所述DataHub与其无关。

市面上常见的元数据管理系统有如下几个:

笔者之前白嫖了亚马逊的EC2服务器,在链接文章的教程下尝试安装datahub, 系统默认环境python2.7、python3.7;

安装datahub过程

1、笔者尝试安装了 python3.8,本来开始没有安装3.8,但是在安装完datahub的时候,尝试验证版本号时抱如下第一个错误

python3 -m datahub version
DataHub CLI version: 0.10.0.1
Python version: 3.7.16 (default, Dec 15 2022, 23:24:54) 
[GCC 7.3.1 20180712 (Red Hat 7.3.1-15)]
Exception ignored in: <generator object configure_logging at 0x7f8fcca5a050>
Traceback (most recent call last):
  File "/home/ec2-user/.local/lib/python3.7/site-packages/datahub/utilities/logging_manager.py", line 187, in configure_logging
  File "/usr/lib64/python3.7/contextlib.py", line 486, in __exit__
AttributeError: 'NoneType' object has no attribute 'exc_info'

2、上边的错误出现后没有找到合适的解决方案,就直接升级python版本到3.8了,以后就有了一系列的坑,如下第二个错误,发生在对python3.8编译的过程中。

    wget https://www.python.org/ftp/python/3.8.3/Python-3.8.3.tgz

    tar zxvf Python-3.8.3.tgz

    ./configure --prefix=/usr/lib/python3.8
    checking build system type... x86_64-pc-linux-gnu
    checking host system type... x86_64-pc-linux-gnu
    checking for python3.8... no
    checking for python3... python3
    checking for --enable-universalsdk... no
    checking for --with-universal-archs... no
    checking MACHDEP... "linux"
    checking for gcc... no
    checking for cc... no
    checking for cl.exe... no
    configure: error: in `/home/ec2-user/Python-3.8.3':
    configure: error: no acceptable C compiler found in $PATH
    See `config.log' for more details

通过安装 gcc 解决了上边的问题; 因为ec2有权限限制,非root用户执行命令时尽可能带上sudo

    sudo yum -y install gcc-c++

    sudo make && sudo make install

3、然后make install的时候遇到问题三,如下提示,通过安装zlib-devel解决

zipimport.ZipImportError: can't decompress data; zlib not available

    sudo yum install zlib-devel

编译完并通过ln -s 命令修改了python3的软链之后,执行pip3的操作开始报如下的错误,通过安装openssl 和 openssl-devel解决,但是还得从新编译python3.8,从.config开始从新执行之前的命令

python3 -m pip install --upgrade pip wheel setuptools

WARNING: pip is configured with locations that require TLS/SSL, however the ssl module in Python is not available.
WARNING: Retrying (Retry(total=4, connect=None, read=None, redirect=None, status=None)) after connection broken by 'SSLError("Can't connect to HTTPS URL because the SSL module is not available.")': /simple/pip/
WARNING: Retrying (Retry(total=3, connect=None, read=None, redirect=None, status=None)) after connection broken by 'SSLError("Can't connect to HTTPS URL because the SSL module is not available.")': /simple/pip/
    sudo yum -y install openssl openssl-devel

    python3 -m pip install --upgrade acryl-datahub

4、之后再次执行datahub的安装,入到如下问题, 通过安装 libffi-devel 解决

 File "/usr/lib/python3.8/lib/python3.8/ctypes/__init__.py", line 7, in 
      from _ctypes import Union, Structure, Array
  ModuleNotFoundError: No module named '_ctypes'
  [end of output]

note: This error originates from a subprocess, and is likely not a problem with pip.
ERROR: Failed building wheel for avro

  File "/usr/lib/python3.8/lib/python3.8/ctypes/__init__.py", line 7, in 
      from _ctypes import Union, Structure, Array
  ModuleNotFoundError: No module named '_ctypes'
  [end of output]

note: This error originates from a subprocess, and is likely not a problem with pip.
ERROR: Failed building wheel for click-default-group

    sudo yum install libffi-devel

5、继续执行datahub的安装,遇到如下问题, 通过安装bzip2-devel 同时从新编译解决(如果不从新编译还会报错)

    File "/usr/lib/python3.8/lib/python3.8/bz2.py", line 19, in 
    from _bz2 import BZ2Compressor, BZ2Decompressor

ModuleNotFoundError: No module named '_bz2'
    sudo yum install bzip2-devel 

    sudo make && sudo make install

直到此时解决以上的问题,才算是把datahub安装好了。

启动datahub

6、如果docker服务没有启动会可能有如下问题;启动服务失败,报标题中的错误,试试启动服务命令前加上 sudo。

The name org.freedesktop.PolicyKit1 was not provided by any .service files See system logs and 'systemctl status docker.service' for details.

7、docker出现的问题如下

ERROR: Got permission denied while trying to connect to the Docker daemon socket at unix:///var/run/docker.sock: Get "http://%2Fvar%2Frun%2Fdocker.sock/v1.24/info": dial unix /var/run/docker.sock: connect: permission denied

通过修改docker 组来处理

Try adding your user to the docker group:

    Run usermod -aG docker "${USER}", then
    either log out and log back in, or run newgrp docker.
    After this you have to restart your docker daemon: sudo service docker restart.

到现在所有的坑基本上踩完了,直接执行如下启动datahub的命令并得到如下提示,GAME OVER!

python3 -m datahub docker quickstart

Total Docker memory configured 0.96GB is below the minimum threshold 3.8GB. You can increase the memory allocated to Docker in the Docker settings.

是的,这是一次全程失败的实验过程,但是笔者认为除了最后设备硬件不够用之外,主要的安装踩坑过程基本上就差不多了。

ELT Airbyte Airflow dbt 玩转数据

ELT 是 ETL的一种替代方案

ELT 是 ETL的一种替代方案。企业通常有大量数据分散在 CRM、营销、客户支持和产品分析等工具中。虽然访问数据不是问题,但从不同位置和格式的存储数据中获得有意义的分析才是问题。实现这一目标的过程是:“提取、转换、加载”(ETL),这需要在数据到达中央数据仓库之前对数据进行转换。目前还有一种替代方案:“提取、加载、转换”(ELT),允许公司在原始数据进入仓库时按需转换。

Airbyte 是一个用于构建 ELT 管道的开源数据集成平台,整合用户数据仓库、数据湖和数据库中的数据。

Airflow 是用 Python 写的,支持 Python 2/3 两个版本。 传统 Workflow 通常使用 Text Files (json, xml / etc) 来定义 DAG, 然后 Scheduler 解析这些 DAG 文件形成具体的 Task Object 执行;Airflow 没这么干,它直接用 Python 写 DAG definition, 一下子突破了文本文件表达能力的局限,定义 DAG 变得简单。

Fishtown Analytics 是开源“分析工程”工具 Dbt(数据构建工具)背后的公司,该公司更名为 Dbt Labs。Dbt Labs 是开源分析工程工具的开发商,其使命是帮助分析师创建和传播组织知识。分析工程是指在原始数据进入数据仓库后获取原始数据并为分析做准备的过程,这意味着 Dbt 有效地充当了 ELT 中的“T”。

它被称为dbt,即数据构建工具,它是一种非常灵活的命令行数据管道工具,它使我们能够非常快速,非常轻松地收集和转换数据以进行分析!dbt无需完全重新编程您的管道。

dbt仍然像常规数据库一样是基于SQL构建的,但是它具有使用诸如jinja之类的模板引擎在其之上构建的附加功能。这有效地使您能够在SQL中引入更多逻辑(即循环,函数等)以访问,重新排列和组织数据。有点像对数据集进行编程,但具有更大的灵活性和更多选择。

指标体系 管理系统 闲扯下

指标体系在数仓物理实现层面主要是结合数仓模型分层架构进行指导建设,数仓建模的过程很大一部分其实就是在构建指标体系,可以说指标体系的好坏决定了模型了健壮性。 构建指标体系需要从“管理、计算、使用”三个角度阐述一下什么样的指标管理方法是“合格的”

指标体系在数仓物理实现层面主要是结合数仓模型分层架构进行指导建设,数仓建模的过程很大一部分其实就是在构建指标体系,可以说指标体系的好坏决定了模型了健壮性。

一、 存在的问题

实际工作中不管是做BI还是数仓项目,只要存在计算指标的功能就会存在以下问题:

  • 命名不规范:好的指标命名是可以推断出其包含的业务过程的,但工作中总会碰到一些指标,很难判断这个指标是描述什么业务的。
  • 计算口径不统一:有些指标的计算口径不同的人会有不同的理解方式,导致使用者对这一指标理解产生歧义。
  • 数据来源、计算逻辑不清晰:之前工作中经常会碰到这类问题,当指标出现问题时需要去查代码才能找到指标使用了哪些表中的数据。而有些计算逻辑比较复杂的指标很难用语言描述清楚,即使能够描述清楚也会需要大段文字。指标开发人员很清楚其中的计算逻辑,使用者用起来是一头雾水。
  • 指标重复/冲突/过度开发:由于没有统一的指标管理体系,导致很多指标重复开发,不同指标名称背后很可能是相同的计算逻辑和统计口径;指标名称相同,计算逻辑、统计口径、数据源等不一样,这种情况非常让人费解;工作中有时要开发一些由于“某些原因”必须开发的指标,而这些指标很多时候只使用一次
  • 指标使用不明确:由于指标命名不规范、指标描述不清晰等问题,使用者不知道如何使用、分析这一指标。

二、 指标管理的一些原则

  1. 指标体系化管理、全局统一管理
  2. 指标计算逻辑、计算口径、数据源表述清晰。
  3. 指标命名规范、描述清晰且含义明确
  4. 明确指标的使用方式、系统、使用人等权限明确

从 “管理、计算、使用”三个角度阐述一下什么样的指标管理方法是“合格的”:

三、 基本概念

  • 指标:业务单元细分之后量化的度量值

  • 数据域:业务过程或者维度的抽象集合

    其中,业务过程可以概括为一个个不拆分的行为事件,在业务过程之下,可以定义指标;维度,是度量的环境,如乘客呼单事件,呼单类型是维度。为了保障整个体系的生命力,数据域是需要抽象提炼,并且长期维护更新的,变动需执行变更流程。

  • 业务过程:不可拆分的业务活动事件,如库房操作中的拣选、复核、打包等都是业务过程

  • 时间周期:统计的时间范围或者时间点,非统计口径; 最近30天、自然周、截止当日等

  • 修饰词:业务场景限定词,如AGV仓、Shuttle仓、立体仓库等,个人理解可以和维度属性等同; 修饰类型从属于某个业务域,如日志域的访问终端类型涵盖APP端、PC端等修饰词

  • 修饰类型:修饰词的抽象划分,从属于某个业务域,如仓库类型下包含上述仓库类型在内的多种仓库

  • 原子指标/度量:基于某一业务行为下的量化值,具有明确的业务含义,适合用“动作+度量”的方式命名;

    原子指标和度量含义相同,基于某一业务事件行为下的度量,是业务定义中不可再拆分的指标,具有明确业务含义的名称,如支付金额。

    指标分类主要分为原子指标、派生指标、衍生指标。

    原子指标    基于某一业务事件行为下的度量,是业务定义中不可再拆分的指标,具有明确业务含义的名称,如呼单量、交易金额
    
    派生指标    是1个原子指标+多个修饰词(可选)+时间周期,是原子指标业务统计范围的圈定。派生指标又分以下二种类型:
    
        事务型指标:是指对业务过程进行衡量的指标。例如,呼单量、订单支付金额,这类指标需要维护原子指标以及修饰词,在此基础上创建派生指标。
        存量型指标:是指对实体对象(如司机、乘客)某些状态的统计,例如注册司机总数、注册乘客总数,这类指标需要维护原子指标以及修饰词,在此基础上创建派生指标,对应的时间周期一般为“历史截止当前某个时间”。
    
    衍生指标是在事务性指标和存量型指标的基础上复合成的。主要有比率型、比例型、统计型均值 
  • 维度:度量的环境,反映业务的一类属性,如库房维度、SKU品类维度、时间维度

    维度是度量的环境,用来反映业务的一类属性,这类属性的集合构成一个维度,也可以称为实体对象。维度属于一个数据域,如地理维度(其中包括国家、地区、省市等)、时间维度(其中包括年、季、月、周、日等级别内容)。

  • 维度属性:维度的属性,比如库房维度的属性:库房名称、库房位置、库房类型等

  • 派生指标:时间周期+统计粒度+修饰词+原子指标,采用“修饰词__原子指标_时间周期”命名方式。一个简单的判断标准:如果修饰词有对应的维表,就可以作为派生指标,否则可以当作原子指标管理

四、指标管理方法

指标管理的几项目标是

技术目标   统一指标和维度管理,指标命名、计算口径、统计来源唯一, 维度定义规范、维度值一致
业务目标   统一数据出口、场景化覆盖
产品目标   指标体系管理工具产品化落地;指标体系内容产品化落地支持决策、分析、运营例如决策北极星、智能运营分析产品等

认识和管理复杂事物最好的方法之一就是分类

    A[业务线] -->B{主题域}
    B--> G(修饰类型)
    B --> D(纬度)
    B --> C(业务过程)
    D-->K(纬度属性)
    G-->H(修饰词)
    C -->E(原子指标)
    C-->J(度量)
    H-->F(派生指标)
    E -->F(派生指标)
    F-->M(汇总事实表)
    J-->N(明细纬度事实表)
    K-->N(明细纬度事实表)
    K-->L(纬度表)
    K-->M(汇总事实表)
    J-->M(汇总事实表)

一般会按照业务线、主题域、业务过程三级目录的方式管理指标,如果业务线条之间交叉较多,也可直接按照主题域划分。例如电商行业划分仓储、配送、零售、客服等主题域,都是为电商业务服务等,仓储主题域下面又划分为拣选、复核、打包等业务过程

规范的命名

  • 原子指标:指标名称适合用“动作+度量”的命名方式,标识的命名用英文简称或者汉语拼音缩写比较好。
  • 派生指标:指标名称应严格遵循“时间周期+统计粒度+业务限定+原子指标”的命名方式,标识命名要用“业务限定_原子指标_时间周期”的方式。
  •  

指标管理系统的基本功能

  1. 系统应当能按照指标管理体系进行多维度分类
  2. 能够清晰的描述指标名称(中英文)、业务口径、计算逻辑等;
  3. 能够较为便利的管理指标,进行添加、删除、修改等操作。
  4. 指标能够关联应用系统
  5. 指标应该和能数仓中的数据模型动态关联,即指标能够关联到表和字段上,以便使用者能够深入了解指标的计算过程,开发者能够较为便捷的定位数据源
  6. 系统应该和元数据管理系统关联,否则指标无法关联表和字段
  7. 应当能够同步数仓的主题域和业务过程,并按照命名规范创建指标
  8. 提供指标检索功能