TL;DR
场景:2C4G/2C2G 三节点混部,Druid 30.0.0,Kafka/HDFS/MySQL 协同。
结论:低配能跑,但核心在 DirectMemory 与 processing.buffer 的收敛及基础设施可达性。
产出:按图就班的配置要点、版本矩阵、常见故障速查与定位步骤。
版本矩阵
整体介绍
Apache Druid 是一种高性能、分布式的列式存储数据库,专门用于实时分析和查询大规模数据集。它适用于 OLAP(在线分析处理)场景,尤其在处理大数据实时流时表现优异。Druid 的架构由多个组件组成,主要包括数据摄取、存储、查询和管理。
在集群配置方面,Druid 通常由以下节点构成:
数据摄取层:使用 MiddleManager 节点来处理数据的实时摄取,负责从不同数据源(如 Kafka、HDFS 等)读取数据并进行实时处理。
存储层:数据存储在 Historical 节点上,这些节点负责存储和管理较老的数据,支持高效的查询。数据被以列式格式存储,优化了查询性能。
查询层:Broker 节点充当查询路由器,接受用户的查询请求并将其分发到相应的 Historical 或 Real-time 节点,然后将结果汇总返回给用户。
协调层:Coordinator 节点负责集群的状态管理和数据分配,确保数据均匀分布并自动处理节点故障。
Druid 的配置文件允许用户自定义参数,如 JVM 设置、内存分配和数据分片策略,以便根据不同的工作负载和性能需求进行优化。此外,Druid 还支持多种查询语言,包括 SQL,便于用户进行灵活的数据分析。整体上,Druid 提供了一种高效、可扩展的解决方案,适合需要快速实时分析的大数据应用场景。
集群规划
集群部署采用的分配如下:
主节点部署 Coordinator 和 Overlord 进程
数据节点运行 Historical 和 MiddleManager 进程
查询节点 部署 Broker 和 Router 进程
我的实机部署情况:
h121.wzk.icu 2C4G ZooKeeper、Kafka、Druid
h122.wzk.icu 2C4G ZooKeeper、Kafka、Druid、MySQL(之前 Hive 时搭建)
h123.wzk.icu 2C2G ZooKeeper、Druid
环境变量
写入的内容如下:
# druidexport DRUID_HOME=/opt/servers/apache-druid-30.0.0export PATH=$PATH:$DRUID_HOME/bin
复制代码
配置文件
将 Hadoop 配置文件:
core-site.xml
hdfs-site.xml
yarn-site.xml
mapred-site.xml
上述文件链接到 conf/druid/cluster/_common 下执行下面的 Shell:
cd $DRUID_HOME/conf/druid/cluster/_commonln -s $HADOOP_HOME/etc/hadoop/core-site.xml core-site.xmlln -s $HADOOP_HOME/etc/hadoop/hdfs-site.xml hdfs-site.xmlln -s $HADOOP_HOME/etc/hadoop/yarn-site.xml yarn-site.xmlln -s $HADOOP_HOME/etc/hadoop/mapred-site.xml mapred-site.xmlls
复制代码
执行结果如下图所示:
MySQL
将 MySQL 驱动链接到:$DRUID_HOME/extensions/mysql-metadata-storage 中
cd $DRUID_HOME/extensions/mysql-metadata-storagecp $HIVE_HOME/lib/mysql-connector-java-8.0.19.jar mysql-connector-java-8.0.19.jarls
复制代码
执行结果如下图所示:
修改配置
vim $DRUID_HOME/conf/druid/cluster/_common/common.runtime.properties
复制代码
我们要修改如下的内容:
# 增加"mysql-metadata-storage"druid.extensions.loadList=["mysql-metadata-storage", "druid-hdfs-storage", "druid-kafka-indexing-service", "druid-datasketches", "druid-multi-stage-query"]
# 每台机器写自己的ip或hostname# 我这里是h121节点druid.host=h121.wzk.icu# 填写zk地址druid.zk.service.host=h121.wzk.icu:2181,h122.wzk.icu:2181,h123.wzk.icu:2181druid.zk.paths.base=/druid
# 注释掉前面 derby 的配置# 增加 mysql 的配置druid.metadata.storage.type=mysqldruid.metadata.storage.connector.connectURI=jdbc:mysql://h122.wzk.icu:3306/druiddruid.metadata.storage.connector.user=hivedruid.metadata.storage.connector.password=hive@wzk.icu
# 注释掉local的配置# 增加HDFS的配置,即使用HDFS作为深度存储druid.storage.type=hdfsdruid.storage.storageDirectory=/druid/segments
# 注释掉 indexer.logs For local disk的配置# 增加 indexer.logs For HDFS 的配置druid.indexer.logs.type=hdfsdruid.indexer.logs.directory=/druid/indexing-logs
复制代码
修改截图如下:
修改截图如下所示:
coordinator-overlord
参数大小根据实际情况调整
vim $DRUID_HOME/conf/druid/cluster/master/coordinator-overlord/jvm.config
复制代码
原来的配置如下图所示:
-server-Xms15g-Xmx15g-XX:+ExitOnOutOfMemoryError-XX:+UseG1GC-Duser.timezone=UTC-Dfile.encoding=UTF-8-Djava.io.tmpdir=var/tmp-Djava.util.logging.manager=org.apache.logging.log4j.jul.LogManager-Dderby.stream.error.file=var/druid/derby.log
复制代码
修改内容如下所示:
-server-Xms512m-Xmx512m-XX:+ExitOnOutOfMemoryError-XX:+UseG1GC-Duser.timezone=UTC+8-Dfile.encoding=UTF-8-Djava.io.tmpdir=var/tmp-Djava.util.logging.manager=org.apache.logging.log4j.jul.LogManager
复制代码
对应的截图如下所示:
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 服务无法启动
middleManager
vim $DRUID_HOME/conf/druid/cluster/data/middleManager/jvm.config
复制代码
原配置:
-server-Xms128m-Xmx128m-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:+ExitOnOutOfMemoryError-Duser.timezone=UTC+8-Dfile.encoding=UTF-8-Djava.io.tmpdir=var/tmp-Djava.util.logging.manager=org.apache.logging.log4j.jul.LogManager
复制代码
修改的截图如下:
错误速查
【续接下篇!】
其他系列
🚀 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 案例 详解🔗 大数据模块直达链接
评论