面向数据工程师的 Metabase

数据工程师应了解的 Metabase 相关事项。

  • Metabase 是一款基于自助分析理念的数据可视化工具。我们希望每个人都能够就他们的数据提出自己的问题。人们提出问题的难易程度取决于他们可用的数据以及您对这些数据的建模方式。
  • Metabase 是一个独立的 Web 应用程序,公开 REST API:您可以使用 Metabase 的 UI,也可以通过我们的 REST API 与其通信。您只需通过 HTTP 调用即可将其与您的堆栈的其余部分集成。
  • 与任何数据工具一样,请注意权限。如果您授予 Metabase 数据库的 root 帐户,那么任何在 Metabase 中拥有 SQL 访问权限的人都可以执行 root 用户可以执行的任何操作,因此请谨慎选择用于将 Metabase 连接到数据库的凭据以及您授予 Metabase 组的权限。

作为数据库客户端的 Metabase

Metabase 使用 JDBC 驱动程序连接到数据库,但我们不使用纯驱动程序:我们用 Clojure 代码封装这些驱动程序(Metabase 的后端是用 Clojure 编写的)。我们进行这种封装是有原因的:我们的驱动程序是高级抽象,将数据库数据类型转换为人们可以理解的更简单的数据类型。我们的驱动程序还会从您的数据库中提取元数据,以便 Metabase 了解如何处理您的数据。

您不应该期望在 Metabase 中运行的查询与从本机客户端(或者,如果您的数据库是 SaaS 产品,则为数据库的 Web 控制台)运行的查询具有相同的响应时间。但我们谈论的只是几毫秒:Metabase 将 JDBC 协议所说的 Java 对象转换为 JSON 所需的时间。

数据库类型和 Metabase

Metabase 官方支持许多数据库,并通过社区驱动程序非官方支持其他一些数据库。如果您需要连接到我们不支持的数据库,请检查您的数据库引擎是否可以对其他引擎进行联邦查询。许多数据库引擎支持连接到各种服务,如果这些连接有效,您将能够很好地使用 Metabase。

如果您没有任何方法可以将 Metabase 连接到您的数据库,您可以将数据导入到受支持的数据库中。市场上有许多产品可以让您选择源和目标,并在几个小时内完成设置。

异步进程和元数据

为了让人们更容易查询您的数据,Metabase 会从您的数据库同步元数据

  • 同步和扫描:Metabase 请求模式、表、列和列数据类型的列表。
  • 获取筛选器值:在此过程中,Metabase 将向您的数据库发出查询,请求它找到的任何文本字段的前 1,000 个唯一值。
  • 指纹识别:此过程在前两个过程之后运行。它会获取前 10,000 个数字和日期值的样本,以了解每个字段的最小值、最大值和平均值。这有助于 Metabase 在图表上提供更好的 x 轴和 y 轴等。

Metabase 还会提取您添加到 `CREATE TABLE` 语句中的表和列的注释。它会将这些注释显示在数据参考、查询构建器和表视图中(将鼠标悬停在列上可查看其描述)。

您可以将同步和扫描过程从每小时更改为每天。您还可以关闭特定表的同步和扫描

您还可以关闭获取筛选器值和指纹识别,但您应该了解其影响

禁用“获取筛选器值”过程

如果您的数据库有大量表,或者根本不关心 `LIMIT` 子句并执行全列扫描(如 BigQuery),则禁用此过程是一个不错的选择。

后果:当人们尝试在问题和仪表板中筛选文本字段时,他们将看不到可用值列表。他们必须在输入框或搜索框中输入值。如果您将字段配置为显示搜索框,Metabase 将向数据库发出 `LIKE` 查询语句以查找人员输入的值,因此如果您的数据库在处理这些类型的查询时遇到困难,请采取预防措施。

如果即使搜索框方法也存在问题,您可能需要考虑通过外部过程获取字段值。您可以更有效地获取这些值,然后通过 API 调用在 Metabase 仪表板中填充筛选器值。例如,您可以创建一个数据管道,查询您的数据库以通过优化语句(例如,HLL 或近似计数)获取列的唯一值,然后调用 Metabase 的 API 以更新仪表板中的筛选器。

禁用指纹识别

当您将鼠标悬停在列标题上时,您可能会看到数据不正确:例如最大值、最小值或平均值不正确。

如何识别 Metabase 发送到数据库的查询

同步和扫描进程

  • 查询信息模式,或您的数据库用于维护模式、表和列清单的任何模式,或
  • 在特定表上查询 `SELECT TRUE` 或 `SELECT 1`。

如果查询以 `LIMIT 1000` 结尾,那么您正在查看 `get-filter-values` 进程,而如果您正在查看以 `LIMIT 10000` 结尾的查询,那么您很可能正在查看指纹识别查询。您不能覆盖这些限制。这些限制决定了数据在应用程序中(例如筛选器或图表)的显示方式和内容。

性能考量

随着数据库规模的增长,某些元数据查询的运行成本可能非常高。例如,如果您的数据库有 5 亿行,您可能不希望 Metabase 随机运行查询以进行数据指纹识别或获取字段值。当您的数据量显著增长时(无论是表行数增加还是数据库表数超过 100 个),我们建议采取以下预防措施:

  • 转到管理设置 > 数据库下的数据库设置。
  • 启用选择同步和扫描发生的时间
  • 将同步和扫描频率设置为每周。
  • 扫描筛选器值设置为“从不,如果需要我会手动执行”或“添加筛选器时”。
  • 保持指纹识别禁用状态。

我们上面提到的“100 个表”数字很大程度上取决于您的查询运行速度。如果您的数据库有 100 个表,每个表有 5 行和 10 列,这与 100 个表,每个表有 500 列和 1000 万行是不同的,因此请谨慎对待此建议。

通知端点

Metabase 有一个专门为数据管道和/或超大型数据库设计的特殊端点。此端点告知 Metabase 数据管道何时完成运行,以便 Metabase 可以转到特定表或模式并对其进行抓取。

如果您的数据足够大,或者您需要在任何时候告知 Metabase 遍历特定表或模式(可能每小时作业不够或成本很高),请考虑使用通知端点,并将同步作业设置为每天只运行一次。

此端点有两种形式,需要在 URL 中传递 Metabase 数据库内部 ID

  • /api/notify/db/<id>:端点将重新扫描已知表

此端点需要通过 HTTP 调用的正文传递以下参数

  • scan:“full”或“schema”,表示您希望 Metabase 遍历所有模式或特定模式
  • table_nametable_id:您希望 Metabase 遍历特定表,而不是所有表。对于原子同步很有用。
  • synchronous:如果您希望 Metabase 立即启动该过程,或者将其安排在接下来的几分钟内(当内部任务运行器开始轮询可用作业时)。如果人们需要尽快看到更新的更改,这会很有用。

  • /api/notify/db/<id>/new-table:端点将在数据库中搜索新表并对其进行扫描。

此端点需要新的表名和模式名。这些参数应在 HTTP 调用的正文中。

元数据存储

Metabase 将所有元数据存储在应用程序数据库中。如果在某个时候 Metabase 找不到以前存在的模式、表或列,它将软删除 Metabase 应用程序数据库中的记录(它在数据库中设置一个标志以完全将其从 UI 中隐藏)。

不要让 Metabase 访问人们永远不会查询的数据。如果 Metabase 访问数据库中的这些对象并同步它们,它们将永远保留在那里——即使您取消了对它们的访问。拥有这些表不会导致 Metabase 后端出现任何性能损失,但会使 Metabase 应用程序数据库的备份大于其应有的大小。

_metabase_metadata

如果您未在 `CREATE TABLE` 语句中添加任何注释,或者您的数据库根本不支持它,您可以在数据库中创建一个具有以下结构的特殊表

CREATE TABLE public._metabase_metadata (
    keypath character varying(255) NOT NULL,
    value character varying(255)
);
INSERT INTO public._metabase_metadata VALUES
    ('table.description', 'This is a table description'),
    ('table.field.description', 'This is a field description');

您可以使用此模式插入您想要的表和字段的元数据。

这有帮助吗?

感谢您的反馈!
分析师每周技巧
获取可行的见解
关于 AI 和数据的资讯,直接发送到您的收件箱
© . This site is unofficial and not affiliated with Metabase, Inc.