当今的业务需要准确、及时的数据才能做出决策。每个企业都可以找到基于时间序列数据构建的数据驱动应用程序和仪表板。大量业务数据是时间序列——从系统和应用程序指标到天气、股票价格、网络遥测、物联网传感器,所有这些都依赖于复杂的时间序列分析和可视化来提供业务洞察。
有很多数据库是为这种分析而构建的,例如 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进程控制数据摄取工作负载的分配。
代理进程处理来自外部客户端的查询。
路由器进程是可选的;他们将请求发送给经纪人、协调员和霸主。
历史进程存储可查询的数据。
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,因此,如果由于某种原因这篇博文不能满足您的需求,请查看适用于 Linux 的Apache Druid 快速入门、 Docker · 适用于 Docker 的 Apache Druid和Clustered Apache适用于 Kubernetes 的笔记本电脑上的 Druid® 。
如果您尚未运行 MinIO,请参阅以下安装说明。 The MinIO Quickstart Guide中详细描述了该过程。
例如,在 Linux 上,下载 MinIO 并运行它(随意更改 root 密码 - 并记住它):
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"
启动浏览器并使用您之前配置的 root 用户和密码连接到http://<your-IP-address>:9000
的 MinIO Server。
首次登录时,您将进入“存储桶”页面。
创建存储桶druidbucket
。
在现实世界中,您可能希望安全地访问您的 Druid 数据,但我们不必在实验室中这样做。您将创建一个服务帐户(在“身份”菜单下),编辑用户策略以仅允许访问druidbucket
,并在下面的 Druid 配置中使用服务帐户的访问密钥和秘密密钥。
测试 Druid 的最简单方法是通过 Docker。按照Docker·Apache Druid说明并使用此docker-compose.yaml 。这会为每个 Druid 服务以及 Zookeeper 和 PostgresSQL 创建一个容器。该方法使用环境文件来指定Druid配置。 将此文件下载到您保存 Druid 容器的位置。对于下面的说明(为 MinIO 配置 Druid),您可以编辑环境文件以将变量传递到标准Druid 配置文件或直接在容器内编辑配置文件。
使用docker-compose up
启动 Druid。集群启动后,打开浏览器并导航至http://localhost:8888
以使用 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
现在,注释掉“Deep Storage”部分下的本地存储配置,并为 Minio 添加适当的值。就我而言,我在与 Druid 相同的计算机上运行 MinIO,因此 S3 端点 URL 包括本地主机和端口。如果您在另一台计算机或容器中运行,则需要更改此行以解决环境中的 MinIO。
之后,“深层存储”部分应如下所示:
# # Deep storage # # For local disk (only viable in a cluster if this is a network mount): # druid.storage.type=local # druid.storage.storageDirectory=var/druid/segments # For HDFS: # druid.storage.type=hdfs # druid.storage.storageDirectory=/druid/segments # For S3: druid.storage.type=s3 druid.storage.bucket=druidbucket druid.storage.baseKey=druid/segments druid.s3.accessKey= <insert your MinIO accessKey> druid.s3.secretKey= <insert your MinIO secretKey> druid.s3.protocol=http druid.s3.enabePathStyleAccess=true druid.s3.endpoint.signingRegion=us-east-1 druid.s3.endpoint.url=http://localhost:9000/
我们还将配置 Druid 在 Minio 中存储索引服务日志。将所有内容存储在一个地方以便于查找是一种很好的做法 - Druid 已经足够复杂,无需在多个位置搜索日志。使用conf/druid/_common/common.runtime.properties
中的适当值更新“索引服务日志”部分。
之后,“索引服务日志”部分应如下所示:
# Indexing service logs # For local disk (only viable in a cluster if this is a network mount): # druid.indexer.logs.type=file # druid.indexer.logs.directory=var/druid/indexing-logs # For HDFS: # druid.indexer.logs.type=hdfs # druid.indexer.logs.directory=/druid/indexing-logs # For S3: druid.indexer.logs.type=s3 druid.indexer.logs.s3Bucket=druidbucket druid.indexer.logs.s3Prefix=druid/indexing-logs
好的!这涵盖了对 Druid 进行的所有配置更改。保存文件并重新启动集群。当您使用 Druid 时,您将看到写入druidbucket
段和索引。
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
这将在您的当前目录中创建一个超集文件夹。导航到该目录并运行以下命令(可能需要几分钟才能完成):
$ docker-compose -f docker-compose-non-dev.yml pull $ docker-compose -f docker-compose-non-dev.yml up
您将在终端上看到大量初始化文本。一旦你看到这样的东西,超级组就准备好了:
superset_app | Loaded your LOCAL configuration at [/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中更详细地介绍了 Wikipedia 的编辑。
Druid 通过向 Overlord 服务器提交 JSON 格式的摄取任务规范来加载数据。您可以使用 Web GUI 构建摄取规范或自行编写并安排它。构建并调整摄取规范后,您可以重用 JSON,这样就不必重复该任务。在生产中,团队经常安排和自动化摄取。
打开浏览器并在http://localhost:8888加载 Druid Web 界面。
在窗口顶部,单击加载数据。从这里,选择示例数据,然后从右侧的下拉列表中选择维基百科编辑,然后单击蓝色的加载示例按钮。
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。这个简单的演示是构建云原生分析和可视化堆栈的开始,并且可以使用用于机器学习的 Apache Spark 或用于数据科学的 Jupyter 进行扩展。
感谢您阅读此演示。如果您有任何疑问,请发送电子邮件至 [email protected],或加入MinIO slack 频道并提问。
也发布在这里。