DataHub LookML 元数据摄取实战指南:从 Looker 到 DataHub 的三种接入方式与配置详解
2026/9/19 0:13:05 网站建设 项目流程

DataHub LookML 元数据摄取实战指南:从 Looker 到 DataHub 的三种接入方式与配置详解

【免费下载链接】datahubThe Context Platform for your Data and AI Stack项目地址: https://gitcode.com/GitHub_Trending/da/datahub

导读

本文基于 DataHub 开源仓库中的 LookML 摄取模块(lookmlsource)文档,系统讲解如何将 Looker 的 LookML 模型、视图与字段元数据摄入 DataHub。你将掌握 UI、GitHub Action、CLI 三种摄取方式的选型与配置,学会 GitHub Deploy Key、连接映射(connection mapping)、API 化血缘提取等关键前置条件,并了解大视图字段拆分、Liquid 模板与 LookML 常量解析等生产环境高频场景的配置细节。

一、LookML 摄取模块概述

lookml模块是 DataHub 元数据摄取框架中的一个 source,负责把 Looker 中由 LookML(Looker Modeling Language)定义的模型(model)、视图(view)、字段(field)以及视图到上游数据仓库表/列的依赖关系摄取为 DataHub 中的 Dataset 实体。

从源码结构看,该模块位于 metadata-ingestion/src/datahub/ingestion/source/looker/,核心入口为 lookml_source.py,配置模型定义在 lookml_config.py。它被设计用于生产环境摄取工作流,支持状态化摄取(stateful ingestion)与陈旧实体清理(stale entity removal)。

摄取方式选型

你有 3 种控制 LookML 摄取运行位置的方式:

方式适用场景特点
DataHub UI开箱即用的最简体验(官方推荐)在 Web 界面配置源并手动/定时触发,无需本地环境
GitHub Action推送式集成(官方推荐)Looker 的 GitHub 仓库变更即触发摄取,保证元数据最新鲜
CLI通过 Airflow 等编排器调度可编程、可调度,适合纳入现有数据管道

下文分别展开这三种方式。

二、UI 方式摄取 LookML 元数据

要通过 UI 摄取 LookML 元数据,必须先用下文「GitHub Deploy Key 配置」一节的方法为你的 Looker GitHub 仓库配置一个 deploy key。配置完成后,进入 DataHub 的Ingestion页面,按页面指引创建 LookML 类型的源,并将 deploy key 的私钥内容填入GitHub Deploy Key字段即可。官方文档同时提供了一段视频演示如何通过 UI 摄取 LookML 元数据以及如何从 Looker 账号中找到相关信息。

三、基于 GitHub Action 的推送式摄取

如果你希望每次主 Looker GitHub 仓库发生变更时自动推送元数据,可以使用 GitHub Action 方式。将下面的示例工作流文件放入 Looker GitHub 仓库的.github/workflows目录,并在仓库中配置如下 Secrets:

  • DATAHUB_GMS_URL:DataHub 服务端地址(如http://datahub-gms:8080
  • DATAHUB_GMS_TOKEN:为 DataHub 摄取预置的认证 Token
  • LOOKER_BASE_URL:Looker 资产所在的 base URL(例如https://acryl.cloud.looker.com
  • LOOKER_CLIENT_ID:已申请的 Looker Client ID
  • LOOKER_CLIENT_SECRET:已申请的 Looker Client Secret

示例工作流文件:

name: lookml metadata upload on: # 该 Action 只在推送到 main 分支时运行。 # 如果想在 pull request 上也运行,建议用 `--dry-run` 标志执行 datahub ingest。 push: branches: - main release: types: [published, edited] workflow_dispatch: jobs: lookml-metadata-upload: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - uses: actions/setup-python@v5 with: python-version: "3.10" - name: Run LookML ingestion run: | pip install 'acryl-datahub[lookml,datahub-rest]' cat << EOF > lookml_ingestion.yml # LookML ingestion configuration. # This is a full ingestion recipe, and supports all config options that the LookML source supports. source: type: "lookml" config: base_folder: ${{ github.workspace }} parse_table_names_from_sql: true git_info: repo: ${{ github.repository }} branch: ${{ github.ref }} # Options #connection_to_platform_map: # connection-name: # platform: platform-name (e.g. snowflake) # default_db: default-db-name (e.g. DEMO_PIPELINE) api: client_id: ${LOOKER_CLIENT_ID} client_secret: ${LOOKER_CLIENT_SECRET} base_url: ${LOOKER_BASE_URL} # Enable API-based lineage extraction (required for field splitting features) use_api_for_view_lineage: true # Optional: Large view handling configuration # field_threshold_for_splitting: 100 # allow_partial_lineage_results: true # enable_individual_field_fallback: true # max_workers_for_parallel_processing: 10 sink: type: datahub-rest config: server: ${DATAHUB_GMS_URL} token: ${DATAHUB_GMS_TOKEN} EOF datahub ingest -c lookml_ingestion.yml env: DATAHUB_GMS_URL: ${{ secrets.DATAHUB_GMS_URL }} DATAHUB_GMS_TOKEN: ${{ secrets.DATAHUB_GMS_TOKEN }} LOOKER_BASE_URL: ${{ secrets.LOOKER_BASE_URL }} LOOKER_CLIENT_ID: ${{ secrets.LOOKER_CLIENT_ID }} LOOKER_CLIENT_SECRET: ${{ secrets.LOOKER_CLIENT_SECRET }}

这份配置是一个完整的 ingestion recipe,lookml源支持的所有配置项都可以在其中使用。该工作流在以下三种情况下触发:推送到main分支、发布 release(published/edited)、手动触发(workflow_dispatch),从而保证元数据在仓库变更后保持新鲜。

四、前置条件:GitHub Deploy Key 与克隆超时

无论使用 UI 摄取还是通过 CLI 自动 checkout GitHub 仓库,都需要为 Looker 的 GitHub 仓库配置 deploy key。deploy key 的创建遵循 GitHub 官方 deploy key 管理文档,核心为三步:

  1. 生成无 passphrase 的 SSH 密钥对(生成looker_datahub_deploy_keylooker_datahub_deploy_key.pub两个文件);
  2. 将公钥添加到 Looker git 仓库,配置为只读 deploy key;
  3. 保存私钥文件内容,供 UI 摄取页面的GitHub Deploy Key字段使用,或通过环境变量/Secret 传给 CLI 摄取。

克隆超时配置

默认情况下,DataHub 允许 git clone 最多600 秒。如果仓库较大或网络较慢,可以调大该值:

source: type: lookml config: git_info: repo: https://github.com/your-org/your-lookml-repo branch: main deploy_key: ${DEPLOY_KEY} clone_timeout: 900 # 单位:秒;设为 null 表示不设超时

需要说明的是,源码中GitInfo.clone_timeout的默认值为300 秒(见 metadata-ingestion/src/datahub/configuration/git.py),文档中 600 秒是更宽松的运行环境约定,实际以你安装版本为准;将其设为null可完全禁用超时。

如果 clone 失败(网络错误、SSH 配置错误、超时),摄取会以清晰的错误条目停止,而不是让整个 pipeline 崩溃。GitInfo还支持deploy_key_file(指向包含私钥的文件)与repo_ssh_locator(自定义git clone的地址,对 GitHub/GitLab 会自动推断),并且deploy_key字段支持多行字符串自动修复换行(见 git.py)。

五、连接映射:让血缘精确指向上游数仓

连接映射(connection mapping)通过把 Looker 连接名映射到平台与数据库,实现到上游数据仓库的准确血缘。LookML 摄取要求配置中必须提供以下二者之一(源码校验见 lookml_config.py):

  1. api凭据(Looker API 配置),或
  2. connection_to_platform_map(连接名到平台标识的映射)。

同时,还要求提供project_nameapi凭据之一(见 lookml_config.py)。

方式一:自动映射(推荐)

提供具备 LookerAdmin权限的 API 凭据,即可自动完成映射。创建方式:按照 Looker API 认证文档创建一个 Client ID 与 Client Secret,并确保该 API key 拥有Admin 权限。DataHub 会通过 Looker 的连接(connection)API 自动读取连接定义(见 looker_connection.py 中的get_connection_def_based_on_connection_string,以及 looker_config.py 中对 BigQuery/通用平台的连接定义推导逻辑)。

方式二:手动映射

如果没有 admin API 凭据,则需要在 recipe 中手动填充connection_to_platform_mapproject_name。仓库自带的 starter recipe lookml_recipe.yml 给出了完整示例:

source: type: "lookml" config: # GitHub Coordinates: 用于本地 checkout 仓库并在 Dataset 实体页添加 github 链接 git_info: repo: org/repo-name deploy_key_file: ${LOOKER_DEPLOY_KEY_FILE} # 指向 looker git 仓库 deploy key 私钥的文件 # Coordinates # base_folder: /path/to/model/files ## 若无法提供 GitHub deploy key 则为可选 # Options api: # 你的 looker 实例地址 base_url: "https://YOUR_INSTANCE.cloud.looker.com" # 你的 Looker 连接凭据 client_id: ${LOOKER_CLIENT_ID} client_secret: ${LOOKER_CLIENT_SECRET} # 手动连接映射的替代方案: # project_name: PROJECT_NAME # connection_to_platform_map: # connection_name_1: # platform: snowflake # bigquery, hive, etc # default_db: DEFAULT_DATABASE. # 该连接配置的默认数据库 # default_schema: DEFAULT_SCHEMA # 该连接配置的默认 schema # platform_instance: snow_warehouse # 可选 # platform_env: PROD # 可选

手动映射中每个连接可配置的字段包括:platform(如 snowflake、bigquery、hive 等)、default_dbdefault_schema、可选的platform_instanceplatform_env。从源码看,platform/default_db/default_schema会被统一转小写处理,platform_env仅允许prod/dev等枚举值(见 looker_config.py)。

base_folder是纯文件式摄取的另一种输入方式:当你不打算提供 GitHub deploy key 时,可以指定一个已被 git clone 到本地的 LookML 仓库根目录(存放*.model.lkml*.view.lkml文件的根目录)。注意git_infobase_folder至少要提供其一(校验逻辑见 lookml_config.py),若只提供git_info而没有 SSH key,私有仓库将无法克隆。

六、摄取核心能力与进阶配置

6.1 API 化血缘提取与可达视图

use_api_for_view_lineage: true时,DataHub 使用LookerQueryAPIBasedViewUpstream实现提取血缘。该方案:

  • 使用 Looker API 的 SQL:系统调用 Looker API 生成视图的完整解析后 SQL 语句,再解析出列级与表级血缘,比基于正则的解析更准确;
  • 仅适用于可达视图:Looker Query API 需要 explore 名称来生成 SQL,因此该方法只对从 model 文件中定义的 explore 可达(被至少一个 explore 直接或通过 join 引用)的视图有效;
  • 回退行为:不可达的视图无法使用 API 方案,会自动回退到基于正则的解析;若emit_reachable_views_only: true(默认),不可达视图会被整体跳过。
source: type: lookml config: # 启用基于 API 的血缘提取(需要可达视图) use_api_for_view_lineage: true # 控制是否处理不可达视图 # 为 true(默认)时,只处理被 explore 引用的视图 # 为 false 时,处理所有视图,但不可达视图使用正则解析 emit_reachable_views_only: true

视图不可达时的行为:

  • emit_reachable_views_only: true:跳过该视图并记录 warning(源码通过report_unreachable_view_dropped上报,见 lookml_config.py);
  • emit_reachable_views_only: false:视图改用正则解析处理(血缘精度可能受限)。

另外,源码中use_api_for_view_lineage: true时若未配置api凭据会直接报错提示(见 lookml_config.py),并支持通过use_api_cache_for_view_lineage: true启用 Looker API 服务端缓存。

6.2 大视图(100+ 字段)的字段拆分处理

对于字段数量较多的 Looker 视图(100+ 字段),DataHub 会自动启用字段拆分(field splitting):把大字段集拆成多个可管理的块,并行处理后再合并结果,以保证血缘提取的可靠性。

字段拆分的触发条件(缺一不可):

  • use_api_for_view_lineage: true
  • 已提供 Looker API 凭据(api配置段)
  • 视图字段数超过阈值(默认 100)

无 API 配置时,字段拆分不可用,系统回退到基于正则的解析,大视图可能解析失败。可配置项如下:

source: type: lookml config: base_folder: /path/to/lookml # API 配置(字段拆分必需) api: base_url: "https://your-instance.cloud.looker.com" client_id: ${LOOKER_CLIENT_ID} client_secret: ${LOOKER_CLIENT_SECRET} # 启用基于 API 的血缘提取(字段拆分必需) use_api_for_view_lineage: true # 可选:启用 API 缓存提升性能 use_api_cache_for_view_lineage: true # 大视图处理配置 field_threshold_for_splitting: 100 # 字段数超过该值则拆分(默认 100) allow_partial_lineage_results: true # 部分块失败时仍返回部分血缘(默认 true) enable_individual_field_fallback: true # 块失败时逐字段处理(默认 true) max_workers_for_parallel_processing: 10 # 并行处理的工作线程数(默认 10,上限 100)

各参数的调优建议:

  • field_threshold_for_splitting:若 50-100 字段的视图出现 SQL 解析失败,可降低阈值(如 50);若视图普遍 100+ 字段且想减少 API 调用,可提高阈值(如 150);
  • allow_partial_lineage_results:默认true,保证即使某些字段块解析失败也能拿到可用字段的血缘;调试排障时可设false追求严格校验;
  • enable_individual_field_fallback:块失败时逐个处理字段,最大化血缘覆盖并定位问题字段;若已知字段全部有效、想省去回退开销可设false
  • max_workers_for_parallel_processing:提高(如 20-30)可加速处理但占用更多系统资源;遇到 API 限流则降低(如 5);设为 1 即串行处理(便于调试)。源码中该参数低于 1 会直接报错,超过 100 会被自动截断为 100 并告警(见 lookml_config.py)。

通过日志验证与排障:

  • 拆分触发:View 'view_name' has X fields, exceeding threshold of Y. Splitting into multiple queries
  • 成功率统计:Combined results for view 'view_name': X tables, Y column lineages, success rate: Z%
  • 问题字段:日志中针对处理失败字段的 warning

常见问题:

  • 字段拆分不生效:检查use_api_for_view_lineage: true与 API 凭据是否配置;
  • 成功率低于 50%:考虑降低field_threshold_for_splitting或排查问题字段;
  • API 限流:降低max_workers_for_parallel_processing减少并发请求;
  • 内存压力:同样降低max_workers_for_parallel_processing

6.3 Liquid 模板与 LookML 常量解析

Liquid 模板变量:若视图包含 Liquid 模板(例如sql_table_name: {{ user_attributes['db'] }}.kafka_streaming.events,其中db=ANALYTICS_PROD),需要在liquid_variables配置中指定变量值:

liquid_variables: user_attributes: db: ANALYTICS_PROD

LookML 常量:若视图包含 LookML 常量(例如sql_table_name: @{db}.kafka_streaming.events;),摄取会尝试从项目manifest.lkml文件中解析其值:

manifest.lkml constant: db { value: "ANALYTICS_PROD" }

如果常量解析不到或解析错误,可在 recipe 中通过lookml_constants显式指定——recipe 中的常量值优先于 manifest 解析结果

lookml_constants: db: ANALYTICS_PROD

支持范围限制:

  • 支持:简单变量插值({{ var }})与条件指令({% condition filter_name %} field {% endcondition %});
  • 不支持:带if/else/endif的条件逻辑,以及date_startdate_endparameter等自定义 Looker 标签。

重要提示:不支持的模板可能导致部分资产的 lineage 提取失败。虽然 Liquid 变量与 LookML 常量可以出现在 LookML 代码的任何位置,但 DataHub 目前只对 LookML 视图解析它们的值——由于 LookML 摄取只处理视图及其上游依赖,这一行为已足够。

6.4 多项目 LookML(高级)

Looker 项目可以组织为多个 git 仓库,并通过 remote include 引用存储在其他仓库中的项目。多项目场景下,LookML 文件中会出现类似include: "//e_flights/views/users.view.lkml"的指令,manifest.lkml中也会列出被引用的项目:

project_name: this_project local_dependency: { project: "my-remote-project" } remote_dependency: ga_360_block { url: "https://github.com/llooker/google_ga360" ref: "0bbbef5d8080e88ade2747230b7ed62418437c21" }

要摄取包含其他项目文件的 Looker 仓库,需在配置中使用project_dependencies指令。例如:主项目引用了托管在 GitHub 仓库my_org/my_remote_project的远程项目my_remote_project,且已配置 deploy key 并存于环境变量(或 UI Secret)${MY_REMOTE_PROJECT_DEPLOY_KEY},则可以这样配置:

source: type: lookml config: ... other config variables project_dependencies: my_remote_project: repo: my_org/my_remote_project deploy_key: ${MY_REMOTE_PROJECT_DEPLOY_KEY}

底层实现上,DataHub 会使用提供的 deploy key checkout 你的远程仓库,并用它解析主项目 model 文件中的 include。如果你的远程项目已在本地 checkout、不需要 DataHub 代为克隆,也可以直接提供本地路径:

source: type: lookml config: ... other config variables project_dependencies: my_remote_project: /path/to/local_git_clone_of_remote_project

:::note 这与把远程项目作为主 Looker 项目摄取不是一回事:DataHub 不会处理远程项目中可能存在的 model 文件。如果还想额外摄取远程项目 model 中可访问的视图,请再建一个以远程项目为主项目的 recipe。 :::

从源码看,project_dependencies是「项目名 → 本地目录或 Git 凭据」的映射,所有在manifest.lkml中列出的local_dependencies或私有remote_dependencies都应有对应条目;若未提供 deploy key,会复用主项目的 deploy key(见 lookml_config.py)。

七、排障指南

7.1 仓库克隆失败或超时

症状:摄取的 Errors 中出现Failed to clone LookML repository;错误上下文包含GitCommandErrorssh: not foundConnection refusedexit code(128)

解决方案:

  1. SSH/deploy key 未配置——确保在git_info中通过deploy_keydeploy_key_file提供了公钥已加入仓库的 deploy key(或个人 SSH key);
  2. 22 端口被封——若环境屏蔽出站 SSH(22 端口),无法用git@github.com克隆,可改用带 personal access token 的 HTTPS(通过repo_ssh_locator)或换一个允许 SSH 的网络运行摄取;
  3. 大仓库克隆超时——调大clone_timeout(默认 600 s):
    git_info: repo: https://github.com/your-org/your-lookml-repo deploy_key: ${DEPLOY_KEY} clone_timeout: 900
  4. 手动验证 SSH 连通性——在运行摄取的主机上执行ssh -T git@github.com,成功响应形如Hi <user>! You've successfully authenticated…

7.2 LookML 解析错误排查

如果日志出现类似my_file.view.lkml': "failed to load view file: Unable to find a matching expression for '<literal>' on line 5"的消息,说明 LookML 文件解析失败。

首先确认 Looker IDE 能在开发模式下通过Validate LookML校验该文件。若 IDE 校验正常,则可能是 DataHub 使用的解析器(基于 joshtemple/lkml 库)比 Looker 官方解析器略严格——目前已知的差异仅有一处,与块中使用前导冒号(leading colons in blocks)有关。可以使用lkmlCLI 工具验证 DataHub 能否解析你的 LookML 文件:

pip install lkml lkml path/to/my_file.view.lkml

若该命令抛出异常,DataHub 解析该文件时也会失败。

八、总结:从文档到源码的完整摄取链路

回顾整条链路:LookML 摄取以git_info/base_folder获取 LookML 代码 → 解析 model/view 文件(含process_refinements视图细化、Liquid 模板与常量解析)→ 通过connection_to_platform_map或 Looker API 解析连接定义 → 生成视图 Dataset 与列级血缘(正则解析或LookerQueryAPIBasedViewUpstreamAPI 化解析)→ 经 datahub-rest sink 写入 DataHub。

配置校验层面,lookml_config.py 内置了五重 pydantic 校验:连接映射或 API 必须二选一、项目名或 API 必须二选一、启用 API 血缘必须有 API 凭据、必须有base_foldergit_info、并行 worker 数必须在 1-100 区间。理解这些校验规则,可以帮助你在写 recipe 时一步到位,避免运行时才暴露配置错误。更多能力说明与故障排查细节,可继续阅读同模块的 lookml_post.md 与完整示例 lookml_recipe.yml。

【免费下载链接】datahubThe Context Platform for your Data and AI Stack项目地址: https://gitcode.com/GitHub_Trending/da/datahub

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询