写点什么

大数据 -152 Apache Druid 集群模式 [下篇] 低内存集群实操:JVM/DirectMemory 与启动脚本

作者:武子康
  • 2025-11-14
    山东
  • 本文字数:3064 字

    阅读完需:约 10 分钟

大数据-152 Apache Druid 集群模式 [下篇] 低内存集群实操:JVM/DirectMemory与启动脚本

TL;DR

  • 场景:三节点(h121/h122/h123)在已有 ZK/HDFS 上部署 Druid 30.0.0,并将 Broker/Historical/Router 压到低内存可运行。

  • 结论:堆与堆外需联动收敛;processing.buffer.sizeBytes 与 MaxDirectMemorySize 同步收口,否则服务起不来或查询抖。

  • 产出:分角色 jvm.config 与 runtime.properties 最小化示例、rsync 分发、启停与 WebUI 验证路径。


版本矩阵


整体介绍

Apache Druid 是一种高性能、分布式的列式存储数据库,专门用于实时分析和查询大规模数据集。它适用于 OLAP(在线分析处理)场景,尤其在处理大数据实时流时表现优异。Druid 的架构由多个组件组成,主要包括数据摄取、存储、查询和管理。


在集群配置方面,Druid 通常由以下节点构成:


  • 数据摄取层:使用 MiddleManager 节点来处理数据的实时摄取,负责从不同数据源(如 Kafka、HDFS 等)读取数据并进行实时处理。

  • 存储层:数据存储在 Historical 节点上,这些节点负责存储和管理较老的数据,支持高效的查询。数据被以列式格式存储,优化了查询性能。

  • 查询层:Broker 节点充当查询路由器,接受用户的查询请求并将其分发到相应的 Historical 或 Real-time 节点,然后将结果汇总返回给用户。

  • 协调层:Coordinator 节点负责集群的状态管理和数据分配,确保数据均匀分布并自动处理节点故障。


Druid 的配置文件允许用户自定义参数,如 JVM 设置、内存分配和数据分片策略,以便根据不同的工作负载和性能需求进行优化。此外,Druid 还支持多种查询语言,包括 SQL,便于用户进行灵活的数据分析。整体上,Druid 提供了一种高效、可扩展的解决方案,适合需要快速实时分析的大数据应用场景。

修改配置【续接上篇】

historical

参数大小根据实际情况调整


vim $DRUID_HOME/conf/druid/cluster/data/historical/jvm.config
复制代码


原配置内容如下所示:


-server-Xms8g-Xmx8g-XX:MaxDirectMemorySize=13g-XX:+ExitOnOutOfMemoryError-Duser.timezone=UTC-Dfile.encoding=UTF-8-Djava.io.tmpdir=var/tmp-Djava.util.logging.manager=org.apache.logging.log4j.jul.LogManager
复制代码


修改内容如下:


-server-Xms512m-Xmx512m-XX:MaxDirectMemorySize=1g-XX:+ExitOnOutOfMemoryError-Duser.timezone=UTC+8-Dfile.encoding=UTF-8-Djava.io.tmpdir=var/tmp-Djava.util.logging.manager=org.apache.logging.log4j.jul.LogManager
复制代码


修改结果如下图:



此外还有一个参数:


vim $DRUID_HOME/conf/druid/cluster/data/historical/runtime.properties
复制代码


原配置内容如下:


druid.processing.buffer.sizeBytes=500MiB
复制代码


修改为如下内容:


# 相当于 50MiBdruid.processing.buffer.sizeBytes=50000000
复制代码


修改的截图如下:



备注:


  • druid.processing.buffer.sizeBytes 每个查询用于聚合的对外哈希表的大小

  • maxDirectMemory = druid.processing.buffer.sizeBytes * (durid.processing.numMergeBuffers + druid.processing.numThreads + 1)

  • 如果 druid.processing.buffer.sizeBytes 太大的话,需要加大 maxDirectMemory,否则 historical 服务无法启动

broker

vim $DRUID_HOME/conf/druid/cluster/query/broker/jvm.config
复制代码


原配置如下:


-server-Xms12g-Xmx12g-XX:MaxDirectMemorySize=6g-XX:+ExitOnOutOfMemoryError-Duser.timezone=UTC-Dfile.encoding=UTF-8-Djava.io.tmpdir=var/tmp-Djava.util.logging.manager=org.apache.logging.log4j.jul.LogManager
复制代码


修改配置如下:


-server-Xms512m-Xmx512m-XX:MaxDirectMemorySize=512m-XX:+ExitOnOutOfMemoryError-Duser.timezone=UTC+8-Dfile.encoding=UTF-8-Djava.io.tmpdir=var/tmp-Djava.util.logging.manager=org.apache.logging.log4j.jul.LogManager
复制代码


修改截图如下图:



此外还需要修改额外的参数:


vim $DRUID_HOME/conf/druid/cluster/query/broker/runtime.properties
复制代码


原参数为:


druid.processing.buffer.sizeBytes=500MiB
复制代码


修改为:


# 与刚才修改的一样 大约是50MiBdruid.processing.buffer.sizeBytes=50000000
复制代码


修改截图如下所示:



备注:


  • druid.processing.buffer.sizeBytes 每个查询用于聚合的堆外哈希表的大小

  • maxDirectMemory = druid.processing.buffer.sizeBytes*(druid.processing.numMergeBuffers + druid.processing.numThreads + 1)

  • 如果 druid.processing.buffer.sizeBytes 太大,那么需要加大 maxDirectMemory,否则 broker 服务无法启动

router

vim $DRUID_HOME/conf/druid/cluster/query/router/jvm.config
复制代码


原配置如下:


-server-Xms1g-Xmx1g-XX:+UseG1GC-XX:MaxDirectMemorySize=128m-XX:+ExitOnOutOfMemoryError-Duser.timezone=UTC-Dfile.encoding=UTF-8-Djava.io.tmpdir=var/tmp-Djava.util.logging.manager=org.apache.logging.log4j.jul.LogManager
复制代码


修改配置如下:


-server-Xms128m-Xmx128m-XX:+UseG1GC-XX:MaxDirectMemorySize=128m-XX:+ExitOnOutOfMemoryError-Duser.timezone=UTC+8-Dfile.encoding=UTF-8-Djava.io.tmpdir=var/tmp-Djava.util.logging.manager=org.apache.logging.log4j.jul.LogManager
复制代码


修改截图如下:


配置汇总

  • coordinator-overlord:512M

  • historical:512M,堆外 1G

  • middleManger:128M

  • broker:512M、堆外 512M

  • router:128M,堆外 128M

分发软件

你可以用的方式完成,我这里用之前写好的 rsync-script 工具进行分发,刚才我们配置都是在 h121 节点上完成的,所以接下来,我们从 h121 节点分发到 h122、h123


rsync-script apache-druid-30.0.0
复制代码


运行结果如下图所示:



分发之后,要注意你需要修改的东西:


  • common.runtime.properties 中的 druid.host 为所在节点的 IP

  • h121 h122 h123 上都配置好环境、环境变量等内容

启动服务

ZK 启动

在三台节点上都需要启动 ZK,并且需要组成 ZK 集群。这部分内容之前已经有 ZooKeeper 集群环境搭建,且在多个环节中,如 Kafka 集群环节中已经测试过。


zkServer.sh start
复制代码

启动 Hadoop

start-all.sh# 或者只启动 dfs也行start-dfs.sh
复制代码


执行结果如下图所示:


Druid 启动

h121 查询节点

这里是查询节点


cd /opt/servers/apache-druid-30.0.0nohup start-cluster-query-server &
复制代码


运行结果如下图所示:


h122 数据节点

这里是数据节点


cd /opt/servers/apache-druid-30.0.0nohup start-cluster-data-server &
复制代码


运行结果如下图所示:


h123 主节点

这里是主节点


cd /opt/servers/apache-druid-30.0.0nohup start-cluster-master-no-zk-server &
复制代码


运行结果如下所示:


日志查看

可以在 log 下查看,我这里是查看了 nohup 的内容

h121

h122

h123

停止服务

需要在每个节点都执行:


# 在各个节点运行/opt/servers/apache-druid-30.0.0/bin/service --down
复制代码

查看界面

http://h121.wzk.icu:8888
复制代码


页面结果如下:



错误速查

到此!顺利完成!一路艰难险阻!

其他系列

🚀 AI 篇持续更新中(长期更新)

AI 炼丹日志-29 - 字节跳动 DeerFlow 深度研究框斜体样式架 私有部署 测试上手 架构研究,持续打造实用 AI 工具指南!AI-调查研究-108-具身智能 机器人模型训练全流程详解:从预训练到强化学习与人类反馈🔗 AI模块直达链接

💻 Java 篇持续更新中(长期更新)

Java-154 深入浅出 MongoDB 用 Java 访问 MongoDB 数据库 从环境搭建到 CRUD 完整示例 MyBatis 已完结,Spring 已完结,Nginx 已完结,Tomcat 已完结,分布式服务正在更新!深入浅出助你打牢基础!🔗 Java模块直达链接

📊 大数据板块已完成多项干货更新(300 篇):

包括 Hadoop、Hive、Kafka、Flink、ClickHouse、Elasticsearch 等二十余项核心组件,覆盖离线+实时数仓全栈!大数据-278 Spark MLib - 基础介绍 机器学习算法 梯度提升树 GBDT 案例 详解🔗 大数据模块直达链接

发布于: 3 小时前阅读数: 12
用户头像

武子康

关注

永远好奇 无限进步 2019-04-14 加入

Hi, I'm Zikang,好奇心驱动的探索者 | INTJ / INFJ 我热爱探索一切值得深究的事物。对技术、成长、效率、认知、人生有着持续的好奇心和行动力。 坚信「飞轮效应」,相信每一次微小的积累,终将带来深远的改变。

评论

发布
暂无评论
大数据-152 Apache Druid 集群模式 [下篇] 低内存集群实操:JVM/DirectMemory与启动脚本_Java_武子康_InfoQ写作社区