如何使用 MinIO 运行 Apache Druid 和 Apache Superset
当今的业务需要准确及时的数据才能做出决策。每个企业都可以找到基于时间序列数据构建的数据驱动应用程序和仪表板。大量业务数据是时间序列的——从系统和应用程序指标到天气、股票价格、网络遥测、物联网传感器,所有这些都依赖于复杂的时间序列分析和可视化来提供业务洞察力。
有许多数据库是为这种分析而构建的,例如 Clickhouse(有关 Clickhouse 和 MinIO 的更多信息,请参阅将ClickHouse 与 MinIO 集成)、Snowflake、Amazon 的 TimeStream 和 RedShift 以及 Apache Druid。一个典型的工作流涉及收集数据,可能是实时流式传输或从数据湖中提取,将其转换并摄取到数据库中,然后使用针对数据库运行的 SQL 查询构建应用程序和仪表板。
这篇博文主要关注Apache Druid,特别是如何使用 MinIO 作为深度存储来运行 Druid。我们稍后会详细介绍,但简而言之,Druid 将数据保存到 S3 深度存储,并在运行查询时根据需要将其换入和换出本地内存。我们将安装 MinIO,安装 Druid,编辑一些配置文件以告诉 Druid 使用 MinIO,然后导入演示数据并使用Apache Superset将其可视化。
准备好惊叹于使用开源产品构建高性能分析和可视化堆栈的速度有多快。

德鲁伊概述
Druid 是最快的数据存储之一——它的构建结合了数据仓库、时间序列数据库和搜索系统的优势。Druid 通过将这三个系统的关键特性结合到其摄取层、存储格式、查询层和核心架构中,实现了极快的查询响应。Druid 通常与 Apache Kafka、Apache Flink 等其他开源技术一起部署,位于存储或处理层与最终用户之间,充当分析工作负载的查询层。要了解有关 Druid 工作原理的更多信息,请参阅Apache Druid 101。
Druid 是云原生的,依赖于基于微服务的架构。Druid 中的每个核心服务(摄取、查询、协调)都可以在容器或商品硬件上独立部署和扩展。此外,Druid 服务可以独立失败并重新启动或更新,而不会影响其他服务。
Druid 有几种进程类型:
协调器进程管理集群上的数据可用性。
Overlord进程控制数据摄取工作负载的分配。
代理进程处理来自外部客户端的查询。
路由器进程是可选的;他们将请求路由到 Brokers、Coordinators 和 Overlords。
历史进程存储可查询的数据。
MiddleManager进程摄取数据。
这些进程通常成组部署到三种不同的服务器或节点类型上:
Master:运行 Coordinator 和 Overlord 进程,管理数据可用性和摄取。
Query:运行 Broker 和可选的 Router 进程,处理来自外部客户端的查询。
数据:运行 Historical 和 MiddleManager 进程,执行摄取工作负载并存储所有可查询数据。

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 Quickstart for Linux、Docker · Apache Druid for Docker 和Clustered Apache用于 Kubernetes 的笔记本电脑上的 Druid®。
安装 MinIO
如果您还没有运行 MinIO,这里有安装说明。The MinIO Quickstart Guide中详细描述了该过程。
例如,在 Linux 上,下载 MinIO 并运行它(随意更改 root 密码 - 并记住它):
启动浏览器并http://使用您之前配置的 root 用户和密码连接到 MinIO 服务器。
首次登录时,您将被带到 Buckets 页面。

创建存储桶druidbucket。

在现实世界中,您可能希望保护对 Druid 数据的访问,但我们不必在我们的实验室中这样做。您将创建一个服务帐户(在“身份”菜单下),编辑用户策略以仅允许访问druidbucket并在下面的 Druid 配置中使用服务帐户的访问密钥和密钥。
安装德鲁伊
测试 Druid 的最简单方法是通过 Docker。遵循Docker · Apache Druid说明并使用此docker-compose.yaml。这为每个 Druid 服务以及 Zookeeper 和 PostgresSQL 创建了一个容器。此方法使用环境文件来指定 Druid 配置。将此文件下载到您保存 Druid 容器的位置。对于下面的说明(为 MinIO 配置 Druid),您可以编辑环境文件以将变量传递给标准Druid 配置文件或直接在容器内编辑配置文件。
启动德鲁伊docker-compose up。集群启动后,打开浏览器并导航至http://localhost:8888使用 Druid 控制台。

为 MinIO 配置 Druid
现在是时候配置 Druid 以使用 MinIO 进行深度存储了。在此步骤中,您需要编辑 Druid 配置文件(或如上所述的 Docker 环境文件)以引用 MinIO,然后重新启动 Druid。该过程在如何配置 Druid 以将 Minio 用作深度存储 - DZone 大数据中进行了完整描述,我们在此处包含一个缩写版本以供快速参考。
根据您安装德鲁伊的方式,在conf/druid/_common/common.runtime.properties文件中,添加"druid-s3-extensions"到druid.extensions.loadList. 按名称添加扩展名,在引号中并用逗号分隔,例如:
根据上面引用的文章,深层存储的 S3 扩展依赖于引擎盖下的 jets3t。您需要jets3t.properties在类路径上创建一个文件。对于这个例子,我们将在目录jets3t.properties中创建一个新的conf/druid/_common,内容如下:
现在,注释掉“Deep Storage”部分下本地存储的配置,并为 Minio 添加适当的值。就我而言,我在与 Druid 相同的机器上运行 MinIO,因此 S3 端点 URL 包括本地主机和端口。如果您在另一台机器或容器中运行,则需要更改此行以解决您环境中的 MinIO。
在此之后,“Deep Storage”部分应该如下所示:
我们还将配置 Druid 以将索引服务日志存储在 Minio 中。将所有内容存储在一个地方以使其更容易查找是一种很好的做法 - Druid 已经足够复杂,无需在多个位置搜索日志。使用中的适当值更新“索引服务日志”部分conf/druid/_common/common.runtime.properties。
在此之后,“索引服务日志”部分应该如下所示:
好的!这涵盖了对 Druid 进行的所有配置更改。保存文件并重新启动集群。当您使用 Druid 时,您会看到段和索引写入druidbucket.
安装 Apache 超集
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 存储库:
这将在您的当前目录中创建一个超集文件夹。导航到该目录并运行以下命令(可能需要几分钟才能完成):
您会在终端上看到大量初始化文本。一旦你看到这样的东西,Superset 就准备好了:
打开浏览器并导航至http://localhost:8088以访问 Superset。使用默认用户名“admin”和密码“admin”登录。
登录 Superset 后,必须将其连接到 Druid。点击右上角的“+”添加数据库。

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

呜呜!您现在已经在您的环境中运行了 Druid、MinIO 和 Superset。
通过Druid、SuperSet和MinIO的三驾马车,我们可以对实时数据有一个完整及时的查看。有许多组织在此组合之上构建了网络规模的数据驱动应用程序,用于点击流分析(网络和移动分析)、风险/欺诈分析、网络遥测分析(网络性能监控)、供应链分析(制造指标)和应用程序性能指标。
这种云原生分析和可视化堆栈灵活且可扩展,并且具有可扩展性和高性能,因此您可以构建让用户满意的应用程序。赋予他们监控、分析和可视化实时数据的能力。让他们根据列的任意组合进行切片和切块、过滤和分组,这样他们就可以按照业务需求的速度做出最终的以行动为导向的数据驱动决策。
把它们放在一起
为了演示我们构建的一些功能,我们将随时间推移将维基百科编辑的教程数据文件加载到 Druid 中,然后在 SuperSet 中可视化编辑。请记住,这是由 MinIO 作为深度存储支持的。Wikipedia 编辑在Quickstart·Apache Druid中有更详细的介绍。
摄入德鲁伊
Druid 通过向 Overlord 服务器提交 JSON 格式的摄取任务规范来加载数据。您可以使用 Web GUI 构建摄取规范,或者自己编写并安排它。构建和调整摄取规范后,您可以重用 JSON,这样您就不必重复该任务。在生产中,团队经常安排和自动化摄取。
打开浏览器并在http://localhost:8888加载 Druid Web 界面。

在窗口顶部,单击加载数据。从这里选择示例数据,然后从右侧的下拉列表中选择 Wikipedia Edits,然后单击蓝色的加载示例按钮。

Web GUI 将引导您构建一个摄取规范,该规范将从源读取数据并将其分段存储在深度存储中。摄取基于用于对数据进行分区和排序的时间戳,而数据存储为维度和指标的列。有关如何优化摄取性能的更多信息,请参阅Apache Druid 中的数据建模和查询性能。
使用教程数据,我们只需单击接受默认值的摄取工作流,或单击“编辑 JSON 规范”,然后单击“提交”。如果您想要(或需要),您可以将原始文件视为 JSON 并对其进行解析。Druid 创建了自己的时间列调用__time来组织和分割数据。因为时间对 Druid 来说非常重要,所以它非常擅长弄清楚如何处理时间戳,而不管它们的格式如何。此外,我们可以转换数据,并通过分区数据和调整段大小来优化查询性能。最后,您可以根据线程和内存利用率调整摄取作业,然后安排并运行它。

GUI 发送给您查看任务:

这是一个非常小的摄取工作,所以它几乎立即完成。
从这里,您可以对 Druid 中的数据运行查询并获得闪电般的快速响应。您可以通过 Web GUI 或 API 运行查询。Druid 发现自己落后于许多仪表板,因为它能够为大规模的海量数据提供出色的查询性能。

在超集中可视化
返回您登录 Superset 的浏览器,再次单击主屏幕右上角的“+”。然后单击图表。

我们可以在屏幕底部运行单独的 SQL 查询。仪表板是一组单独的查询。对重复查询的响应缓存在 Superset 中以提高性能。
选择数据集druid.wikipedia,然后选择可视化。Superset 包括许多时间序列可视化。我们将选择时间序列图表,然后单击新建图表。

最初,您不会看到任何结果,但不要因此而蒙蔽。首先,通过将时间范围设置为“无过滤器”来删除时间范围。“天”的时间粒度设置得太高,所以将其更改为“5 分钟”。我们现在正在查看示例数据中 5 分钟窗口内发生的维基百科编辑次数的图表。

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

到目前为止,您已经了解了安装 Druid 和 MinIO、获取第一个数据集并生成第一个 Superset 图表的基本步骤。一个有用的下一步可能是了解更多关于在 Superset 中探索数据的信息。
大规模可扩展分析
在这篇博文中,我们介绍了一组云原生应用程序:用于分析的 Apache Druid、用于可视化的 Apache Superset 和用于 S3 深度存储的 MinIO。这个简单的演示是构建云原生分析和可视化堆栈的开始,并且可以使用用于 ML 的 Apache Spark 或用于数据科学的 Jupyter 进行扩展。
感谢您阅读此演示。如果您有任何问题,请发送电子邮件至 sales@minio.org.cn,或加入MinIO slack 频道并提问。