文中内容仅限技术学习与代码实践参考,市场存在不确定性,技术分析需谨慎验证,不构成任何投资建议。
Druid 是一款高性能实时分析数据库,主要价值在于缩短洞察和行动的时间。Druid 专为需要快速查询和数据采集的工作流而设计。Druid 擅长于支持 UI、运行操作型(即席)查询或处理高并发性。您可以将 Druid 视为适用于各种用例的数据仓库的开源替代方案。
Apache Druid 简介
Introduction to Apache Druid
Apache Druid 是一个实时分析数据库,专为在大规模数据集上进行快速切片切块分析(OLAP 查询)而设计。Druid 最常用于对实时摄取、快速查询性能和高可用性至关重要的场景。
Druid 通常被用作分析应用界面的数据库后端,或用于需要快速聚合的高并发 API。Druid 在处理面向事件的数据时表现最佳。
Druid 的常见应用领域包括:
用例 | 描述 |
---|---|
点击流分析 Clickstream analytics | 分析网站和移动应用上的用户行为,了解导航模式、热门内容和用户参与度 |
网络遥测分析 Network telemetry analytics | 监控并分析网络流量和性能指标,以优化网络效率、识别瓶颈并确保服务质量 |
服务器指标存储 Server metrics storage | 收集并存储性能指标,如 CPU 使用率、内存使用率、磁盘 I/O 和网络活动,以监控服务器健康并优化资源分配 |
供应链分析 Supply chain analytics | 利用供应链各阶段的数据来优化库存管理、简化物流、预测需求并提升整体运营效率 |
应用性能指标 Application performance metrics | 监控并分析软件应用的性能,识别改进区域、排查问题并确保最优用户体验 |
数字营销/广告分析 Digital marketing/advertising analytics | 跟踪并分析数字营销活动及广告投放效果,涵盖社交媒体、搜索引擎和展示广告等多种渠道 |
商业智能(BI)/OLAP(在线分析处理)Business intelligence (BI)/OLAP (Online Analytical Processing) | 利用数据分析工具和技术,从大型数据集中获取洞察,生成报告并做出数据驱动的决策,以改善业务运营和战略 |
客户分析 Customer analytics | 分析客户数据以了解偏好、行为和购买模式,实现个性化营销策略、改进客户服务并提升客户留存 |
IoT(物联网)分析 IoT (Internet of Things) analytics | 处理并分析由 IoT 设备生成的数据,洞察设备性能、用户行为和环境条件,促进自动化、优化和预测性维护 |
金融分析 Financial analytics | 评估财务数据以衡量财务绩效、管理风险、检测欺诈并做出明智的投资决策 |
医疗分析 Healthcare analytics | 分析医疗数据以改善患者结果、优化医疗服务、降低成本并识别疾病和治疗的趋势和模式 |
社交媒体分析 Social media analytics | 监控并分析社交媒体活动,如点赞、分享、评论和提及,以了解受众情绪、追踪品牌认知并识别影响者 |
如果您正在尝试 Druid 的新用例,或对 Druid 的功能有疑问,请加入 Apache Druid Slack 频道。在该频道,您可以与 Druid 专家联系,实时提问并获得帮助。
Druid 的关键特性
Druid 的核心架构结合了数据仓库、时序数据库和日志搜索系统的理念。Druid 的一些关键特性包括:
- 列式存储格式。 Druid 采用列式存储。这意味着它仅加载特定查询所需的精确列。这极大地提高了仅检索少量列的查询速度。此外,为了支持快速扫描和聚合,Druid 根据每列的数据类型优化列存储。
- 可扩展的分布式系统。 典型的 Druid 部署跨越从几十台到数百台服务器的集群。Druid 能够以每秒数百万条记录的速率摄取数据,同时保留数万亿条记录,并保持查询延迟在亚秒级到几秒之间。
- 大规模并行处理。 Druid 可以在整个集群中并行处理每个查询。
- 实时或批处理摄取。 Druid 可以实时或批量摄取数据。摄取的数据可立即用于查询。
- 自愈、自平衡,易于运维。 作为运维人员,您可以添加服务器以扩展或移除服务器以缩减。Druid 集群在后台自动重新平衡,无需任何停机时间。如果某个 Druid 服务器发生故障,系统会自动绕过故障路由数据,直到该服务器被替换。Druid 设计为持续运行,无需因任何原因进行计划内停机。这对于配置更改和软件更新同样适用。
- 云原生、容错架构,不会丢失数据。 摄取后,Druid 会将您的数据安全地存储在深层存储中。深层存储通常是云存储、HDFS 或共享文件系统。即使在极不可能发生的所有 Druid 服务器故障的情况下,您也可以从深层存储中恢复数据。对于仅影响少数 Druid 服务器的有限故障,复制可确保在系统恢复期间仍可执行查询。
- 用于快速过滤的索引。 Druid 使用 Roaring 或 CONCISE 压缩位图索引来创建索引,以实现跨多列的快速过滤和搜索。
- 基于时间的分区。 Druid 首先按时间对数据进行分区。您可以选择基于其他字段实施额外分区。基于时间的查询仅访问与查询时间范围匹配的分区,从而显著提高性能。
- 近似算法。 Druid 包含用于近似去重计数、近似排名以及近似直方图和分位数计算的算法。这些算法提供有界内存使用,并且通常比精确计算快得多。对于准确性比速度更重要的场景,Druid 也提供精确去重计数和精确排名。
- 摄取时的自动汇总。 Druid 可选支持在摄取时进行数据汇总。此汇总会部分预聚合您的数据,有可能显著节省成本并提升性能。
何时使用 Druid
各种规模的公司将 Druid 用于许多不同的用例。更多信息请参见 Powered by Apache Druid。
如果您的用例符合以下部分描述,Druid 可能是一个不错的选择:
- 插入速率非常高,但更新较少。
- 大多数查询是聚合和报告查询,例如 “group by” 查询。您也可能有搜索和扫描查询。
- 您的目标查询延迟为 100 毫秒到几秒。
- 您的数据具有时间组件。Druid 包含与时间相关的优化和设计选择。
- 您可能有多个表,但每个查询仅命中一个大型分布式表。查询可能会命中多个较小的“查找”表。
- 您有高基数数据列,例如 URL、用户 ID,并且需要对其进行快速计数和排名。
- 您希望从 Kafka、HDFS、平面文件或 Amazon S3 等对象存储加载数据。
您可能不希望使用 Druid 的情况包括:
- 您需要使用主键对现有记录进行低延迟更新。Druid 支持流式插入,但不支持流式更新。您可以使用后台批处理作业执行更新。
- 您正在构建一个查询延迟不重要的离线报告系统。
- 您希望进行“大型”连接,即将一个大型事实表连接到另一个大型事实表,并且您愿意接受这些查询需要很长时间才能完成。
了解更多
本地快速入门
Local quickstart
本快速入门帮助您安装 Apache Druid,并引导您了解 Druid 的数据摄取与查询功能。完成本教程需要一台至少拥有 6 GiB RAM 的机器。
在本快速入门中,您将:
- 安装 Druid
- 启动 Druid 服务
- 使用 SQL 摄取并查询数据
Druid 支持多种摄取方式。完成本教程后,请参阅
Ingestion 页面以确定适合您的摄取方法。
前置条件
您可以在相对普通的机器(如工作站或 6 GiB RAM 的虚拟服务器)上执行以下步骤。
安装机器的软件要求:
- Linux、macOS 或其他类 Unix 操作系统(不支持 Windows)
- Java 11 或 17
- Python 3(推荐)或 Python 2
- Perl 5
必须能够使用 Java。可以将其加入 PATH,或设置 JAVA_HOME
或 DRUID_JAVA_HOME
环境变量。
运行 apache-druid-33.0.0/bin/verify-java
可验证您环境的 Java 要求。
在安装生产 Druid 实例之前,请务必查看安全概述。通常应避免以 root 用户运行 Druid,建议创建专用用户账户运行 Druid。
安装 Druid
从 Apache Druid 下载 33.0.0 版本。
在终端中解压文件并切换到发行目录:
tar -xzf apache-druid-33.0.0-bin.tar.gz
cd apache-druid-33.0.0
发行目录包含 LICENSE
和 NOTICE
文件,以及可执行文件、配置文件、示例数据等子目录。
启动 Druid 服务
使用单机自动配置启动 Druid 服务。
该配置包含适合本教程的默认设置,例如默认加载 druid-multi-stage-query
扩展,以便您使用 MSQ 任务引擎。
可在 conf/druid/auto
中的配置文件里查看默认设置。
在 apache-druid-33.0.0
包根目录执行以下命令:
这将启动 ZooKeeper 和 Druid 服务的实例。例如:
$ ./bin/start-druid
[Tue Nov 29 16:31:06 2022] Starting Apache Druid.
[Tue Nov 29 16:31:06 2022] Open http://localhost:8888/ in your browser to access the web console.
[Tue Nov 29 16:31:06 2022] Or, if you have enabled TLS, use https on port 9088.
[Tue Nov 29 16:31:06 2022] Starting services with log directory [/apache-druid-33.0.0/log].
[Tue Nov 29 16:31:06 2022] Running command[zk]: bin/run-zk conf
[Tue Nov 29 16:31:06 2022] Running command[broker]: bin/run-druid broker /apache-druid-33.0.0/conf/druid/single-server/quickstart '-Xms1187m -Xmx1187m -XX:MaxDirectMemorySize=791m'
[Tue Nov 29 16:31:06 2022] Running command[router]: bin/run-druid router /apache-druid-33.0.0/conf/druid/single-server/quickstart '-Xms128m -Xmx128m'
[Tue Nov 29 16:31:06 2022] Running command[coordinator-overlord]: bin/run-druid coordinator-overlord /apache-druid-33.0.0/conf/druid/single-server/quickstart '-Xms1290m -Xmx1290m'
[Tue Nov 29 16:31:06 2022] Running command[historical]: bin/run-druid historical /apache-druid-33.0.0/conf/druid/single-server/quickstart '-Xms1376m -Xmx1376m -XX:MaxDirectMemorySize=2064m'
[Tue Nov 29 16:31:06 2022] Running command[middleManager]: bin/run-druid middleManager /apache-druid-33.0.0/conf/druid/single-server/quickstart '-Xms64m -Xmx64m' '-Ddruid.worker.capacity=2 -Ddruid.indexer.runner.javaOptsArray=["-server","-Duser.timezone=UTC","-Dfile.encoding=UTF-8","-XX:+ExitOnOutOfMemoryError","-Djava.util.logging.manager=org.apache.logging.log4j.jul.LogManager","-Xms256m","-Xmx256m","-XX:MaxDirectMemorySize=256m"]'
Druid 最多可使用系统总内存的 80%。
如需显式设置 Druid 可用总内存,可传递 memory 参数,例如 ./bin/start-druid -m 16g
。
Druid 将所有持久状态数据(如集群元数据存储和数据段)保存在 apache-druid-33.0.0/var
中。
每个服务将日志写入 apache-druid-33.0.0/log
下的日志文件。
随时可通过删除整个 var
目录将 Druid 恢复到初始安装状态。例如在多个 Druid 教程之间或实验后,可这样做以获得全新实例。
如需随时停止 Druid,请在终端中使用 CTRL+C。这将退出 bin/start-druid
脚本并终止所有 Druid 进程。
打开 Web 控制台
启动 Druid 服务后,在浏览器中打开 http://localhost:8888。
所有 Druid 服务(包括提供控制台的 Druid router)可能需要几秒钟才能完全启动。如果在启动完成前尝试打开 Web 控制台,浏览器可能会报错。请稍等片刻后重试。
在本快速入门中,您将使用 Web 控制台进行数据摄取。MSQ 任务引擎专门使用 Query 视图编辑并运行 SQL 查询。
如需了解 Query 视图与多阶段查询架构和 MSQ 任务引擎的完整介绍,请参见 UI 指南。
加载数据
Druid 发行版捆绑了 wikiticker-2015-09-12-sampled.json.gz
示例数据集,可用于测试。该示例数据集位于 quickstart/tutorial/
文件夹,可从 Druid 根目录访问,表示某一天的 Wikipedia 页面编辑数据。
按以下步骤加载示例 Wikipedia 数据集:
-
在 Query 视图中,点击 Connect external data。
-
选择 Local disk 磁贴并输入以下值:
- Base directory:
quickstart/tutorial/
- File filter:
wikiticker-2015-09-12-sampled.json.gz
通过 UI 分别输入基础目录和通配文件筛选器,可一次性指定多个文件进行摄取。
- Base directory:
-
点击 Connect data。
-
在 Parse 页面,您可以检查原始数据,并在将数据加载到 Druid 之前执行以下可选操作:
- 展开一行以查看对应的源数据。
- 通过 Input format 选项自定义数据处理。
- 调整数据的主时间戳列。Druid 要求数据具有主时间戳列(内部存储在名为
__time
的列中)。如果数据集没有时间戳,Druid 将使用默认值1970-01-01 00:00:00
。
-
点击 Done。将返回 Query 视图并显示新生成的查询。该查询将示例数据插入名为
wikiticker-2015-09-12-sampled
的表中。REPLACE INTO "wikiticker-2015-09-12-sampled" OVERWRITE ALL WITH input_data AS (SELECT * FROM TABLE( EXTERN( '{"type":"local","baseDir":"quickstart/tutorial/","filter":"wikiticker-2015-09-12-sampled.json.gz"}', '{"type":"json"}', '[{"name":"time","type":"string"},{"name":"channel","type":"string"},{"name":"cityName","type":"string"},{"name":"comment","type":"string"},{"name":"countryIsoCode","type":"string"},{"name":"countryName","type":"string"},{"name":"isAnonymous","type":"string"},{"name":"isMinor","type":"string"},{"name":"isNew","type":"string"},{"name":"isRobot","type":"string"},{"name":"isUnpatrolled","type":"string"},{"name":"metroCode","type":"long"},{"name":"namespace","type":"string"},{"name":"page","type":"string"},{"name":"regionIsoCode","type":"string"},{"name":"regionName","type":"string"},{"name":"user","type":"string"},{"name":"delta","type":"long"},{"name":"added","type":"long"},{"name":"deleted","type":"long"}]' ) )) SELECT TIME_PARSE("time") AS __time, channel, cityName, comment, countryIsoCode, countryName, isAnonymous, isMinor, isNew, isRobot, isUnpatrolled, metroCode, namespace, page, regionIsoCode, regionName, user, delta, added, deleted FROM input_data PARTITIONED BY DAY
-
(可选)点击 Preview 在摄取前查看数据的大致形状。
-
编辑查询的第一行,将默认目标数据源名称从
wikiticker-2015-09-12-sampled
更改为wikipedia
。 -
点击 Run 执行查询。任务可能需要一两分钟完成。完成后,任务将显示持续时间以及插入表的行数。视图会自动刷新,因此无需刷新浏览器即可看到状态变化。
成功的任务意味着 Druid 数据服务器已获取一个或多个段。
查询数据
摄取作业完成后,即可查询数据。
在 Query 视图中运行以下查询,以生成频道列表:
SELECT
channel,
COUNT(*)
FROM "wikipedia"
GROUP BY channel
ORDER BY COUNT(*) DESC
恭喜!从下载 Druid 到使用 MSQ 任务引擎查询数据,您仅通过一个快速入门就完成了全过程。
后续步骤
更多信息请参考以下主题:
- Druid SQL 概述或查询教程,了解如何查询刚刚摄取的数据。
- 摄取概述,探索更多数据摄取选项。
- 教程:使用 SQL 加载文件,学习如何生成将外部数据加载到 Druid 数据源的 SQL 查询。
- 教程:使用原生批处理摄取加载数据,通过 Druid 的原生批处理摄取功能加载并查询数据。
- 教程:从 Apache Kafka 加载流数据,从 Kafka 主题加载流数据。
- 扩展,了解 Druid 扩展的详细信息。
请记住,停止 Druid 服务后,下次可以通过删除 Druid 根目录中的 var
目录并再次运行 bin/start-druid
脚本来启动一个全新的环境。在尝试其他数据摄取教程之前,您可能需要这样做,因为它们使用相同的 Wikipedia 数据源。
风险提示与免责声明
本文内容基于公开信息研究整理,不构成任何形式的投资建议。历史表现不应作为未来收益保证,市场存在不可预见的波动风险。投资者需结合自身财务状况及风险承受能力独立决策,并自行承担交易结果。作者及发布方不对任何依据本文操作导致的损失承担法律责任。市场有风险,投资须谨慎。