高性能实时分析数据库:Apache Druid 快速入门指南

文中内容仅限技术学习与代码实践参考,市场存在不确定性,技术分析需谨慎验证,不构成任何投资建议。

Apache Druid
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 的一些关键特性包括:

  1. 列式存储格式。 Druid 采用列式存储。这意味着它仅加载特定查询所需的精确列。这极大地提高了仅检索少量列的查询速度。此外,为了支持快速扫描和聚合,Druid 根据每列的数据类型优化列存储。
  2. 可扩展的分布式系统。 典型的 Druid 部署跨越从几十台到数百台服务器的集群。Druid 能够以每秒数百万条记录的速率摄取数据,同时保留数万亿条记录,并保持查询延迟在亚秒级到几秒之间。
  3. 大规模并行处理。 Druid 可以在整个集群中并行处理每个查询。
  4. 实时或批处理摄取。 Druid 可以实时或批量摄取数据。摄取的数据可立即用于查询。
  5. 自愈、自平衡,易于运维。 作为运维人员,您可以添加服务器以扩展或移除服务器以缩减。Druid 集群在后台自动重新平衡,无需任何停机时间。如果某个 Druid 服务器发生故障,系统会自动绕过故障路由数据,直到该服务器被替换。Druid 设计为持续运行,无需因任何原因进行计划内停机。这对于配置更改和软件更新同样适用。
  6. 云原生、容错架构,不会丢失数据。 摄取后,Druid 会将您的数据安全地存储在深层存储中。深层存储通常是云存储、HDFS 或共享文件系统。即使在极不可能发生的所有 Druid 服务器故障的情况下,您也可以从深层存储中恢复数据。对于仅影响少数 Druid 服务器的有限故障,复制可确保在系统恢复期间仍可执行查询。
  7. 用于快速过滤的索引。 Druid 使用 RoaringCONCISE 压缩位图索引来创建索引,以实现跨多列的快速过滤和搜索。
  8. 基于时间的分区。 Druid 首先按时间对数据进行分区。您可以选择基于其他字段实施额外分区。基于时间的查询仅访问与查询时间范围匹配的分区,从而显著提高性能。
  9. 近似算法。 Druid 包含用于近似去重计数、近似排名以及近似直方图和分位数计算的算法。这些算法提供有界内存使用,并且通常比精确计算快得多。对于准确性比速度更重要的场景,Druid 也提供精确去重计数和精确排名。
  10. 摄取时的自动汇总。 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_HOMEDRUID_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

发行目录包含 LICENSENOTICE 文件,以及可执行文件、配置文件、示例数据等子目录。

启动 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。

img

所有 Druid 服务(包括提供控制台的 Druid router)可能需要几秒钟才能完全启动。如果在启动完成前尝试打开 Web 控制台,浏览器可能会报错。请稍等片刻后重试。

在本快速入门中,您将使用 Web 控制台进行数据摄取。MSQ 任务引擎专门使用 Query 视图编辑并运行 SQL 查询。
如需了解 Query 视图与多阶段查询架构和 MSQ 任务引擎的完整介绍,请参见 UI 指南。

加载数据

Druid 发行版捆绑了 wikiticker-2015-09-12-sampled.json.gz 示例数据集,可用于测试。该示例数据集位于 quickstart/tutorial/ 文件夹,可从 Druid 根目录访问,表示某一天的 Wikipedia 页面编辑数据。

按以下步骤加载示例 Wikipedia 数据集:

  1. Query 视图中,点击 Connect external data

  2. 选择 Local disk 磁贴并输入以下值:

    • Base directoryquickstart/tutorial/
    • File filterwikiticker-2015-09-12-sampled.json.gz

    img

    通过 UI 分别输入基础目录和通配文件筛选器,可一次性指定多个文件进行摄取。

  3. 点击 Connect data

  4. Parse 页面,您可以检查原始数据,并在将数据加载到 Druid 之前执行以下可选操作:

    • 展开一行以查看对应的源数据。
    • 通过 Input format 选项自定义数据处理。
    • 调整数据的主时间戳列。Druid 要求数据具有主时间戳列(内部存储在名为 __time 的列中)。如果数据集没有时间戳,Druid 将使用默认值 1970-01-01 00:00:00

    img

  5. 点击 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
    
  6. (可选)点击 Preview 在摄取前查看数据的大致形状。

  7. 编辑查询的第一行,将默认目标数据源名称从 wikiticker-2015-09-12-sampled 更改为 wikipedia

  8. 点击 Run 执行查询。任务可能需要一两分钟完成。完成后,任务将显示持续时间以及插入表的行数。视图会自动刷新,因此无需刷新浏览器即可看到状态变化。

    img

    成功的任务意味着 Druid 数据服务器已获取一个或多个段。

查询数据

摄取作业完成后,即可查询数据。

Query 视图中运行以下查询,以生成频道列表:

SELECT
  channel,
  COUNT(*)
FROM "wikipedia"
GROUP BY channel
ORDER BY COUNT(*) DESC

img

恭喜!从下载 Druid 到使用 MSQ 任务引擎查询数据,您仅通过一个快速入门就完成了全过程。

后续步骤

更多信息请参考以下主题:

请记住,停止 Druid 服务后,下次可以通过删除 Druid 根目录中的 var 目录并再次运行 bin/start-druid 脚本来启动一个全新的环境。在尝试其他数据摄取教程之前,您可能需要这样做,因为它们使用相同的 Wikipedia 数据源。

风险提示与免责声明
本文内容基于公开信息研究整理,不构成任何形式的投资建议。历史表现不应作为未来收益保证,市场存在不可预见的波动风险。投资者需结合自身财务状况及风险承受能力独立决策,并自行承担交易结果。作者及发布方不对任何依据本文操作导致的损失承担法律责任。市场有风险,投资须谨慎。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

船长Q

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值