如何使用 MinIO 运行 Apache Druid 和 Apache Superset

How to Run Apache Druid and Apache Superset with MinIO

如今的商业需要准确和及时的数据来进行决策。基于时间序列数据的驱动型应用程序和仪表板在每个企业中都能找到。大量的商业数据是时间序列数据——从系统和应用程序指标到天气、股票价格、网络遥测、物联网传感器,都依赖于复杂的时间序列分析和可视化来提供商业洞察。

有许多数据库是为这种类型的分析而构建的,例如 Clickhouse(有关 Clickhouse 和 MinIO 的更多信息,请参阅将 ClickHouse 与 MinIO 集成)、Snowflake、亚马逊的 TimeStream 和 RedShift 以及 Apache Druid。一个典型的流程包括收集数据(可能实时流入或从数据湖中提取)、将其转换并导入到数据库中,然后使用针对数据库运行的 SQL 查询构建应用程序和仪表板。

这篇博文重点介绍Apache Druid,特别是如何使用 MinIO 作为深度存储来运行 Druid。我们稍后会详细介绍,但简而言之,Druid 将数据保存到 S3 深度存储中,并在运行查询时根据需要将其进出本地内存交换。我们将安装 MinIO,安装 Druid,编辑一些配置文件以告诉 Druid 使用 MinIO,然后导入演示数据并使用Apache Superset对其进行可视化。

准备好惊叹于使用开源产品构建高性能分析和可视化堆栈的速度。

Druid 概述

Druid 是速度最快的存储之一——它旨在结合数据仓库、时间序列数据库和搜索系统的优势。Druid 通过将其三个系统的关键特性结合到其摄取层、存储格式、查询层和核心架构中,实现了极快的查询响应。Druid 通常与其他开源技术(如 Apache Kafka、Apache Flink)一起部署,位于存储或处理层与最终用户之间,作为分析工作负载的查询层。要了解有关 Druid 工作原理的更多信息,请参阅Apache Druid 101

Druid 是云原生的,并依赖于基于微服务的架构。Druid 中的每个核心服务(摄取、查询、协调)都可以在容器或商品硬件上独立部署和扩展。此外,Druid 服务可以独立故障和重启或更新,而不会影响其他服务。

Druid 有几种进程类型

  • 协调器 进程管理集群上的数据可用性。
  • Overlord 进程控制数据摄取工作负载的分配。
  • 代理 进程处理来自外部客户端的查询。
  • 路由器 进程是可选的;它们将请求路由到代理、协调器和 Overlord。
  • 历史 进程存储可查询数据。
  • 中间管理器 进程摄取数据。

这些进程通常以组的形式部署到三种不同的服务器或节点类型上

  • 主服务器:运行协调器和 Overlord 进程,管理数据可用性和摄取。
  • 查询服务器:运行代理和可选的路由器进程,处理来自外部客户端的查询。
  • 数据服务器:运行历史和中间管理器进程,执行摄取工作负载并存储所有可查询数据。

Druid 有三个主要的外部依赖项:深度存储、元数据存储和 ZooKeeper。简而言之,元数据用于跟踪段的使用情况和任务信息,通常由 PostgreSQL 或 MySQL 处理。Zookeeper 用于内部服务发现和协调。

由于这是 MinIO 博客,我们将重点关注深度存储。深度存储是每个 Druid 服务器都可以访问的共享文件系统,数据在摄取后存储在此处。在单服务器部署中,这仅仅是本地驱动器。在集群部署中,深度存储将采用分布式对象存储(如 S3 或 MinIO、HDFS)或网络挂载的文件系统的形式。

深度存储 是 Druid 在进程之间传输数据和备份数据的方式。Druid 将数据存储在称为段的文件中。有一个内部映射将段从深度存储拉取到本地驱动器和内存中进行缓存。为了最大程度地减少延迟,查询针对本地段运行,而不是针对存储在深度存储中的段运行。深度存储支持 Druid 的弹性和容错设计。Druid 通过在数据节点发生故障并恢复后从深度存储引导来提供持久性。需要注意的是,您需要在数据节点和深度存储中提供足够的空间来容纳您希望在 Druid 中处理的数据。

Druid 使用 S3 API 进行对象存储以进行深度存储。使用与 S3 API 兼容的对象存储(如 MinIO)使您能够在任何地方运行 Druid,这可能是您为了提高性能和安全性而想要做的事情。MinIO 是 Druid 的极佳深度存储,因为它具有出色的 S3 兼容性、满足实时 OLAP 需求的性能以及最重要的是能够提供可扩展的性能。MinIO 还提供了必要的数据保护生命周期管理

您可以直接在 Linux 上或在 Docker 或 Kubernetes 上的容器中运行 Druid、MinIO 和 Superset。已经有一些很棒的资源可以向您展示如何启动和运行 Druid,因此,如果出于某种原因这篇博文不能满足您的需求,请查看Apache Druid 快速入门(适用于 Linux)、Docker · Apache Druid(适用于 Docker)和笔记本电脑上的集群式 Apache Druid®(适用于 Kubernetes)。

安装 MinIO

如果您尚未运行 MinIO,请参阅安装说明。此过程在MinIO 快速入门指南中进行了详细说明。

例如,在 Linux 上,下载 MinIO 并运行它(您可以随意更改根密码——并记住它)

wget https://dl.min.io/server/minio/release/linux-amd64/minio
chmod +x minio
MINIO_ROOT_USER=admin MINIO_ROOT_PASSWORD=password ./minio server /mnt/data --console-address ":9001"

启动浏览器并使用您之前配置的根用户和密码连接到 http://<your-IP-address>:9000 上的 MinIO 服务器。

第一次登录时,您将进入“存储桶”页面。

创建存储桶 druidbucket

在现实世界中,您可能希望保护对 Druid 数据的访问,但在我们的实验环境中不必这样做。您将创建一个服务帐户(在“身份”菜单下),编辑用户策略以仅允许访问 druidbucket,并在下面的 Druid 配置中使用服务帐户的访问密钥和密钥。

安装 Druid

使用 Docker 测试 Druid 最简单的方法是通过 Docker。请按照Docker · Apache Druid中的说明,并使用此 docker-compose.yaml 文件。这将为每个 Druid 服务创建一个容器,以及 Zookeeper 和 PostgresSQL。此方法使用 环境文件 来指定 Druid 配置。将 此文件 下载到您保存 Druid 容器的位置。对于以下说明(为 MinIO 配置 Druid),您可以编辑环境文件以将变量传递到标准的 Druid 配置文件 或直接在容器中编辑配置文件。

使用 docker-compose up 启动 Druid。集群启动后,打开浏览器并导航到 http://localhost:8888 以使用 Druid 控制台。

为 MinIO 配置 Druid

现在是时候配置 Druid 以使用 MinIO 作为深度存储了。在此步骤中,您需要编辑 Druid 配置文件(或如上所述的 Docker 环境文件)以引用 MinIO,然后重新启动 Druid。整个过程在 如何配置 Druid 以使用 Minio 作为深度存储 - DZone 大数据 中进行了完整描述,并且我们在此处包含一个简短版本以供快速参考。

根据您安装 Druid 的方式,在 conf/druid/_common/common.runtime.properties 文件中,将 "druid-s3-extensions" 添加到 druid.extensions.loadList 中。按名称添加扩展,用引号括起来并用逗号分隔,例如

druid.extensions.loadList=["druid-parser-route", "druid-s3-extensions"]

根据上述文章,深度存储的 S3 扩展在底层依赖于 jets3t。您需要在类路径上创建一个 jets3t.properties 文件。在本例中,我们将在 conf/druid/_common 目录中创建一个新的 jets3t.properties 文件,其中包含以下内容:

s3service.s3-endpoint=localhost
s3service.s3-endpoint-http-port=9000
s3service.disable-dns-buckets=true
s3service.https-only=false

现在,注释掉“深度存储”部分下本地存储的配置,并为 Minio 添加适当的值。在我的情况下,我是在与 Druid 相同的机器上运行 MinIO,因此 S3 端点 URL 包括 localhost 和端口。如果您在另一台机器或容器上运行,则需要更改此行以在您的环境中访问 MinIO。

之后,“深度存储”部分应如下所示:

#
# 深度存储
#
# 对于本地磁盘(仅当它是网络挂载时,在集群中才可行):
# druid.storage.type=local
# druid.storage.storageDirectory=var/druid/segments
# 对于HDFS:
# druid.storage.type=hdfs
# druid.storage.storageDirectory=/druid/segments
# 对于S3:
druid.storage.type=s3
druid.storage.bucket=druidbucket
druid.storage.baseKey=druid/segments
druid.s3.accessKey= <插入您的MinIO accessKey>
druid.s3.secretKey= <插入您的MinIO secretKey>
druid.s3.protocol=http
druid.s3.enablePathStyleAccess=true
druid.s3.endpoint.signingRegion=us-east-1
druid.s3.endpoint.url=http://localhost:9000/

我们还将配置Druid以将索引服务日志存储在Minio中。将所有内容存储在一个位置是一个好习惯,以便于查找 - Druid已经足够复杂了,无需在多个位置搜索日志。使用适当的值更新conf/druid/_common/common.runtime.properties中的“索引服务日志”部分。

此后,“索引服务日志”部分应如下所示

# 索引服务日志
# 适用于本地磁盘(仅在集群中有效,如果这是一个网络挂载点):
# druid.indexer.logs.type=file
# druid.indexer.logs.directory=var/druid/indexing-logs
# 适用于HDFS:
# druid.indexer.logs.type=hdfs
# druid.indexer.logs.directory=/druid/indexing-logs
# 适用于S3:
druid.indexer.logs.type=s3
druid.indexer.logs.s3Bucket=druidbucket
druid.indexer.logs.s3Prefix=druid/indexing-logs

好的!这涵盖了对 Druid 进行的所有配置更改。保存文件并重新启动集群。在使用 Druid 的过程中,您将看到写入到 druidbucket 的段和索引。

安装 Apache Superset

Apache Superset 是一款功能强大的可视化工具,经常与 Druid 一起使用。Superset 是一款云原生商业智能应用程序,快速、轻量级、功能丰富,最重要的是,它是免费的!Superset 的直观界面使创建交互式仪表板变得相对容易。Superset 提供了对大多数 SQL 数据库的开箱即用支持。Superset 集成了数据库、OpenID、LDAP 和 OAuth 等身份验证后端,以保护可视化。

作为云原生软件,Superset 具有高度可扩展性和高可用性。它旨在扩展到大型分布式环境。

我们更感兴趣的是开始使用 Superset,而不是在生产环境中对其进行扩展,因此我们将使用 Docker Compose 进行最简单的安装。这是在 Linux 或 Mac OSX 上试用 Superset 的最快方法。

如果您尚未安装 Docker,请按照 Docker 的说明 进行操作。安装 Docker 后,请 安装 Docker Compose

打开一个终端窗口并克隆 Superset 仓库

$ git clone https://github.com/apache/superset.git

这将在您的当前目录中创建一个 superset 文件夹。导航到该目录并运行以下命令(可能需要几分钟才能完成)

$ docker-compose -f docker-compose-non-dev.yml pull
$ docker-compose -f docker-compose-non-dev.yml up

您将在终端上看到大量初始化文本。一旦您看到类似以下内容,Superset 就已准备就绪

superset_app            | 在 [/app/docker/pythonpath_dev/superset_config.py]加载了您的本地配置
superset_app            | 127.0.0.1 - - [12/May/2022:23:59:35 +0000] "GET /health HTTP/1.1" 200 2 "-" "curl/7.74.0"

打开浏览器并导航到 http://localhost:8088 以访问 Superset。使用默认用户名“admin”和密码“admin”登录。

登录 Superset 后,您必须将其连接到 Druid。在右上角,单击“+”添加数据库。

从下拉列表中选择 Apache Druid。然后为连接命名并在 SQLALCHEMY URI 下输入以下内容,确保更新 IP 地址或根据需要替换为 localhost。如果我们通过要求身份验证来保护 Druid API,我们还将输入用户名和密码。

druid://10.0.0.10:8888/druid/v2/sql

测试连接以确保其正常工作,然后单击“完成”。

太棒了!您现在已在您的环境中运行了 Druid、MinIO 和 Superset。


借助 Druid、SuperSet 和 MinIO 三位一体的组合,我们可以获得完整且及时的实时数据视图。许多组织已经在此基础上构建了网络规模的数据驱动应用程序,用于点击流分析(网络和移动分析)、风险/欺诈分析、网络遥测分析(网络性能监控)、供应链分析(制造指标)和应用程序性能指标。

这个云原生分析和可视化栈灵活且可扩展,并且具有可扩展性和高性能,因此您可以构建让用户满意的应用程序。赋予他们监控、分析和可视化实时数据的能力。让他们能够根据任意列的组合进行切片和切块、过滤和分组,以便能够以业务需求的速度做出最终的、面向行动的数据驱动决策。

整合所有内容

为了演示我们构建的一些功能,我们将加载一个维基百科编辑随时间推移的教程数据文件到 Druid 中,然后在 SuperSet 中可视化这些编辑。请记住,这由 MinIO 作为深度存储来支持。维基百科编辑在Apache Druid 快速入门中进行了更详细的介绍。

导入到 Druid

Druid 通过将以 JSON 格式的导入任务规范提交到 Overlord 服务器来加载数据。您可以使用 Web GUI 构建导入规范,也可以自己编写并安排它。构建并调整导入规范后,您可以重复使用 JSON,避免重复执行任务。在生产环境中,团队经常安排和自动化导入。

打开浏览器并在http://localhost:8888处加载 Druid Web 界面。

在窗口顶部,点击“加载数据”。在此处,选择“示例数据”,然后从右侧的下拉菜单中选择“维基百科编辑”,并点击蓝色的“加载示例”按钮。

Web GUI 将引导您完成构建导入规范的过程,该规范将读取来自源的数据并将其存储在深度存储上的段中。导入基于用于对数据进行分区和排序的时间戳,而数据则存储为维度和指标的列。有关如何在导入时优化性能的更多信息,请参阅Apache Druid 中的数据建模和查询性能

对于教程数据,我们将简单地点击导入工作流程并接受默认值,或者点击“编辑 JSON 规范”,然后点击“提交”。如果您想(或需要)查看原始文件作为 JSON 并解析它,也是可以的。Druid 创建了自己的名为__time的时间列来组织和分割数据。由于时间对于 Druid 非常重要,因此它非常擅长处理各种格式的时间戳。此外,我们可以转换数据,并通过对数据进行分区和调整段大小来优化查询性能。最后,您可以根据线程和内存使用情况调整导入作业,然后对其进行计划和运行。

GUI 将引导您查看“任务”。

这是一个非常小的导入作业,因此几乎立即完成。

从此处,您可以针对 Druid 中的数据运行查询并获得闪电般的快速响应。您可以通过 Web GUI 或 API 运行查询。Druid 凭借其能够在规模巨大的数据上提供卓越的查询性能,成为了许多仪表板背后的核心引擎。

在 Superset 中可视化

返回到您已登录 Superset 的浏览器,然后再次点击主屏幕右上角的“+”。然后点击“图表”。

我们可以在屏幕底部运行单个 SQL 查询。仪表板是单个查询的集合。Superset 会缓存对重复查询的响应以提高性能。

选择数据集druid.wikipedia,然后选择可视化。Superset 包含许多时间序列可视化。我们将选择“时间序列图表”,然后点击“新建图表”。

最初,您不会看到任何结果,但不要被这迷惑。首先,通过将其设置为“无过滤器”来移除“时间范围”。“时间粒度”设置为“天”,粒度过高,将其更改为“5 分钟”。我们现在正在查看样本数据中每 5 分钟窗口内维基百科编辑次数的图表。

您可以使用 Superset 过滤和分组结果。要保存图表,请点击屏幕顶部的“保存”,然后为图表命名并保存它。

到目前为止,您已经了解了安装 Druid 和 MinIO、导入第一个数据集和生成第一个 Superset 图表的步骤。下一步可以学习更多关于在 Superset 中探索数据的内容。

大规模可扩展分析

在这篇博文中,我们介绍了一组云原生应用程序:用于分析的 Apache Druid、用于可视化的 Apache Superset 和用于 S3 深度存储的 MinIO。这个简单的演示是构建云原生分析和可视化栈的起点,并且可以通过 Apache Spark for ML 或 Jupyter for Data Science 进行扩展。

感谢您阅读此演示。如果您有任何疑问,请发送电子邮件至 hello@min.io,或加入MinIO Slack 频道并提出您的问题。