一.服务器及规划
我的集群是三台服务器,每台安装的软件及服务如下:
我集群的每个软件的具体的版本是:
apache-druid-0.17.0-bin.tar.gz
hadoop-2.8.3.tar.gz
jdk-8u171-linux-x64.tar.gz
kafka_2.12-2.1.0.tgz
mysql-5.7.11-linux-glibc2.5-x86_642.tar.gz
zookeeper-3.4.14.tar.gz
其中:
1.1. java的版本是必须是1.8以上,并且;以上软件请自行准备,版本请自行选择,不要太老即可;
1.2.所有的软件压缩包我都放在 /home/apps/下;
1.3. 提前关闭防火墙,提前关闭防火墙,提前关闭防火墙;
systemctl stop firewalld.service || chkconfig iptables off || service iptables stop
二.安装软件及相关的配置
2.1 修改每台服务的hostname (三台服务器都需要)
主要是方便后面的管理和配置,红色部分就是需要添加的:
2.2 jdk的安装 (三台服务器都需要)
(1)看下当前的服务器有无安装jdk,如果有且符合要求可以不用安装;
java -version
(2)如果当前的服务器没有安装过jdk,请安装:
tar -zxvf jdk-8u201-linux-x64.tar.gz
(3) 配置环境变量
vim /etc/profile 在最后一行
export JAVA_HOME=/apps/jdk1.8
export CLASSPATH=.:$JAVA_HOME/jre/lib/rt.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export PATH=$PATH:$JAVA_HOME/bin
(4) 使环境生效:source /etc/profile
2.3 mysql的安装,这里我个人选择用mysql存储元数据:(一台安装mysql即可,我是安装在mysql)
关于mysql的安装请自行解决,以下是官网的配置:
-- create a druid database, make sure to use utf8mb4 as encoding
CREATE DATABASE druid DEFAULT CHARACTER SET utf8mb4;
-- create a druid user
CREATE USER 'druid'@'localhost' IDENTIFIED BY 'diurd';
-- grant the user all the permissions on the database we just created
GRANT ALL PRIVILEGES ON druid.* TO 'druid'@'localhost';
注意:这里如果使用的是MySQL数据库,可能因为版本不同,设置编码时会有问题,官方文档为CREATE DATABASE druid DEFAULT CHARACTER SET utf8mb4;,后面发下会报如下错误:
Caused by: org.skife.jdbi.v2.exceptions.UnableToExecuteStatementException: java.sql.BatchUpdateException: Specified key was too long; max key length is 767 bytes [statement:"null", located:"null", rewritten:"null", arguments:null]
at org.skife.jdbi.v2.Batch.execute(Batch.java:131) ~[jdbi-2.63.1.jar:2.63.1]
at org.apache.druid.metadata.SQLMetadataConnector$2.withHandle(SQLMetadataConnector.java:189) ~[druid-server-0.15.0-incubating.jar:0.15.0-incubating]
at org.apache.druid.metadata.SQLMetadataConnector$2.withHandle(SQLMetadataConnector.java:179) ~[druid-server-0.15.0-incubating.jar:0.15.0-incubating]
at org.skife.jdbi.v2.DBI.withHandle(DBI.java:281) ~[jdbi-2.63.1.jar:2.63.1]
... 15 more
因此创建元数据库时,最好设置为utf8_general_ci编码。
2.4 zoookeeper的安装(三台,每台的配置不一样)
(1)解压,tar -zxvf zookeeper-3.4.14.tar.gz
(2)修改下文件名: mv zookeeper-3.4.14.tar.gz zookeeper
(3) 修改配置文件 :vim /home/apps/zookeeper/conf/zoo.cfg (如果没有此文件,请把zoo_sample.cfg复制一份,命名为zoo.cfg)
(4) 上图红色部分是需要修改的:
(5) ①在/zookeeper/下创建data目录,
②在data下创建 /log/目录;
③在其他的两台服务器上也执行上面的操作;
④在data下创建myid文件,其中的内容是 zoo.cfg中最下面的“server.1”中的1(master对应的是1);集群第2台服务器必须是2,集群第3台服务器必须是3:即
上述配置完后,可以启动集群了,启动集群前必须关闭防火墙,常用的命令是:
a. 启动ZK服务: sh bin/zkServer.sh start
b. 查看ZK服务状态: sh bin/zkServer.sh status
c. 停止ZK服务: sh bin/zkServer.sh stop
d. 重启ZK服务: sh bin/zkServer.sh restart
2.5 kafka的安装配置三台(每台的配置不一样)
(1)解压,tar -zxvf kafka_2.12-2.1.0.tgz
(2)修改下文件名: mv kafka_2.12-2.1.0.tgz kafka
(3) 修改配置文件 :vim /home/apps/kafka/config/server.properties
(4) 在以上配置的基础上,其余的两台服务器需要修改的地方有:
broker.id=1 (主机是1,其余两台集群的是2和 3)
listeners=PLAINTEXT://192.168.3.41:9092(当前机器的ip)
(5) 启动 kafka
cd /home/apps/kafka
nohup bin/kafka-server-start.sh config/server.properties > /home/apps/kafka/kafka.log &
(6) 停止kafka
bin/kafka-server-stop.sh
2.6 hadoopka的安装配置三台(每台的配置不一样)
(1)解压,tar -zxvf hadoop-2.8.3.tar.gz
(2)修改下文件名: mv hadoop-2.8.3.tar.gz hadoop
(3) 修改配置文件 cd /home/apps/hadoop/etc/hadoop/,这里需要修改5个文件,具体是
core-site.xml、hadoop-env.s、hdfs-site.xml、mapred-site.xml、yarn-site.xml
① vim core-site.xml
<configuration>
<property>
<name>fs.defaultFS</name>
<value>hdfs://query:9000</value>
</property>
<!-- hadoop.tmp.dir 是 hadoop文件系统依赖的基本配置
默认的配置每次启动服务器都会被清空,这里要重新配置 如果没有目录 自己新建一下-->
<property>
<name>hadoop.tmp.dir</name>
<value>/home/apps/hadoop/data/tmp</value>
</property>
</configuration>
② vim hadoop-env.sh
# The java implementation to use.
export JAVA_HOME=export JAVA_HOME=/home/jdk1.8
③vim hdfs-site.xml
<configuration>
<!-- 文件备份数 -->
<property>
<name>dfs.replication</name>
<value>2</value>
</property>
<property>
<name>dfs.http.address</name>
<value>query:50070</value>
</property>
<!-- 配置SecondaryNamenode -->
<property>
<name>dfs.secondary.http.address</name>
<value>data:50090</value>
</property>
<property>
<name>dfs.permissions</name>
<value>false</value>
</property>
</configuration>
④vim mapred-site.xml
<configuration>
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
</configuration>
⑤vim yarn-site.xml
<configuration>
<!-- reducer获取数据的方式 -->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
<!-- 指定YARN的老大(ResourceManager)的地址 -->
<property>
<name>yarn.resourcemanager.hostname</name>
<value>master</value>
</property>
</configuration>
(4)在其余两台服务器上也进行上面的配置修改;
(5)创建 data目录(只在master)
mkdir data
(6)执行格式化文件系统命令(只在master)
hadoop namenode -format
(7)启动和关闭Hadoop集群(只在master)
cd /home/apps/hadoop/
启动在 master服务器上 sbin/start-all.sh
关闭 master 服务器上 sbin/stop-all.sh
三.druid的安装及配置
3.1 配置druid的公共配置文件
(1) 修改文件 vim /home/apps/druid/conf/druid/cluster/_common/common.runtime.properties
#druid.extensions.loadList=["mysql-metadata-storage","druid-hdfs-storage", "druid-kafka-indexing-service", "druid-datasketches"]
druid.extensions.loadList=["druid-histogram", "druid-datasketches", "druid-lookups-cached-global", "mysql-metadata-storage", "druid-kafka-indexing-service", "druid-hdfs-storage"]
# Hostname
druid.host=192.168.3.41
# Log all runtime properties on startup. Disable to avoid logging properties on startup:
druid.startup.logging.logProperties=true
# Zookeeper
#druid.zk.service.host=localhost
#druid.zk.paths.base=/druid
druid.zk.service.host=master:2181,query:2181,data:2181
druid.zk.paths.base=/druid
# For MySQL (make sure to include the MySQL JDBC driver on the classpath):
druid.metadata.storage.type=mysql
druid.metadata.storage.connector.connectURI=jdbc:mysql://192.168.3.41:3306/druid?characterencoding=utf-8
druid.metadata.storage.connector.user=druid
druid.metadata.storage.connector.password=druid
# For HDFS:
#druid.storage.type=hdfs
#druid.storage.storageDirectory=/druid/segments
druid.storage.type=hdfs
druid.storage.storageDirectory=hdfs://192.168.3.42:9000/druid/segments
# For HDFS:
#druid.indexer.logs.type=hdfs
#druid.indexer.logs.directory=/druid/indexing-logs
druid.indexer.logs.type=hdfs
druid.indexer.logs.directory=hdfs://192.168.3.42:9000/druid/indexing-logs
# Service discovery
druid.selectors.indexing.serviceName=druid/overlord
druid.selectors.coordinator.serviceName=druid/coordinator
druid.request.logging.type=file
druid.request.logging.dir=/home/apps/druid/logs
# Monitoring
druid.monitoring.monitors=["org.apache.druid.java.util.metrics.JvmMonitor"]
druid.emitter=noop
druid.emitter.logging.logLevel=info
# Storage type of double columns
# ommiting this will lead to index double as float at the storage layer
druid.indexing.doubleStorage=double
# Security
druid.server.hiddenProperties=["druid.s3.accessKey","druid.s3.secretKey","druid.metadata.storage.connector.password"]
# SQL
druid.sql.enable=true
# Lookups
druid.lookup.enableLookupSyncOnStartup=false
上面的配置三台服务器都一样,除了“druid.host”需要改为当前服务器的host;
(2) 复制上面2.6.3章节中修改的5个文件到当前目录(和common.runtime.properties同一路径下)
3.2 master节点的配置
vim /home/apps/druid/conf/druid/cluster/master/coordinator-overlord/jvm.config
-server
-Xms10g
-Xmx10g
-XX:+ExitOnOutOfMemoryError
-XX:+UseG1GC
-Duser.timezone=UTC+0800
-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
修改:(1)-Xms 根据自己的电脑配置调
(2)-Xmx 根据自己的电脑配置调
(3)Duser.timezone 改为UTC+0800
vim /home/apps/druid/conf/druid/cluster/master/coordinator-overlord/runtime.properties ,默认配置就可以;
3.3 query节点的配置
(1) broker的配置jvm.config
vim /home/apps/druid/conf/druid/cluster/query/broker/jvm.config,内存的配置结合自己的电脑配置,user.timezone 改为UTC+0800;
(2)broker的配置runtime.properties
vim /home/apps/druid/conf/druid/cluster/query/broker/runtime.properties
#druid.processing.buffer.sizeBytes * (druid.processing.numMergeBuffers + druid.processing.numThreads + 1)
druid.service=druid/broker
druid.plaintextPort=8082
# HTTP server settings
druid.server.http.numThreads=20
#如果代理从不处于高并发负载下(在这种情况下,快速处理收集的数据并释放所使用的内存),那么拥有大限制并不一定是坏事
#druid.server.http.maxScatterGatherBytes=Long.MAX_VALUE #9223372036854775807
# HTTP client settings
#查询线程数
druid.broker.http.numConnections=20
#
druid.broker.http.maxQueuedBytes=25000000
# Processing threads and buffers
druid.processing.buffer.sizeBytes=150000000
#可用于合并查询结果的直接内存缓冲区数
druid.processing.numMergeBuffers=4
#并行处理segment的线程数 默认是(Number of cores - 1 (or 1))
druid.processing.numThreads=8
druid.processing.tmpDir=var/druid/processing
#在单个JDBC帧中返回的最大行数。将此属性设置为-1表示不应应用行限制
druid.sql.avatica.maxRowsPerFrame=-1
#选定查询的页大小阈值。对于较大结果集的Select查询将使用分页连续发出
druid.sql.planner.selectThreshold=10000
# Query cache disabled -- push down caching and merging instead
druid.broker.cache.useCache=false
druid.broker.cache.populateCache=false
(3)router的配置jvm.config
vim /home/apps/druid/conf/druid/cluster/query/router/jvm.config,内存的配置结合自己的电脑配置,user.timezone 改为UTC+0800;
(4)router的配置runtime.properties
vim /home/apps/druid/conf/druid/cluster/query/router/runtime.properties,默认配置就可以;
3.4 data节点的配置
(1)historical的配置jvm.config
vim /home/apps/druid/conf/druid/cluster/data/historical/jvm.config,内存的配置结合自己的电脑配置,user.timezone 改为UTC+0800;
(2)historical的配置runtime.properties
vim /home/apps/druid/conf/druid/cluster/data/historical/runtime.properties:
druid.service=druid/historical
druid.plaintextPort=8083
# HTTP server threads
# HTTP请求的线程数 max(10, (Number of cores * 17) / 16 + 2) + 30
druid.server.http.numThreads=30
# Processing threads and buffers
druid.processing.buffer.sizeBytes=125000000
druid.processing.numMergeBuffers=8
#可用于并行处理段的处理线程数 默认Number of cores - 1 (or 1)
druid.processing.numThreads=15
druid.processing.tmpDir=var/druid/processing
# Segment storage
# 段的缓存位置,及此目录可以缓存的大小 默认 300G
druid.segmentCache.locations=[{"path":"var/druid/segment-cache","maxSize":300000000000}]
#进程分配给它的段的最大字节数。这不是历史进程实际执行的限制,只是发布到协调进程的值,以便它可以相应地进行计划
#相当于这个历史节点的总容量 计算采用的是 /1000 默认130G
druid.server.maxSize=300000000000
#分层是使用,在前台设置规则
#druid.server.tier=_default_tier
#分层时使用,层的优先级 数字越高,优先级越高
#druid.server.priority=0
# Query cache
druid.historical.cache.useCache=true
druid.historical.cache.populateCache=true
druid.cache.type=caffeine
druid.cache.sizeInBytes=128000000
(3)middleManager的配置jvm.config
vim /home/apps/druid/conf/druid/cluster/data/middleManager/jvm.config,内存的配置结合自己的电脑配置,user.timezone 改为UTC+0800;
(4)middleManager的配置runtime.properties
vim /home/apps/druid/conf/druid/cluster/data/middleManager/runtime.properties:
druid.service=druid/middleManager
druid.plaintextPort=8091
# Number of tasks per middleManager
# 可以创建的最大任务数
druid.worker.capacity=4
# Task launch parameters
druid.indexer.runner.javaOpts=-server -Xms512m -Xmx512m -XX:MaxDirectMemorySize=512m -Duser.timezone=UTC+0800 -Dfile.encoding=UTF-8 -XX:+ExitOnOutOfMemoryError -Djava.util.logging.manager=org.apache.logging.log4j.jul.LogManager
druid.indexer.task.baseTaskDir=var/druid/task
# HTTP server threads
#HTTP请求的线程数 两个大小相等的HTTP线程池 一个是 Overlord Indexer 的通信 一个处理所有其他HTTP请求 公式 max(10, (Number of cores * 17) / 16 + 2) + 30
druid.server.http.numThreads=30
#以字节为单位的请求标头的最大大小 较大的报头会消耗更多内存,并且会使服务器更容易受到拒绝服务攻击
#druid.server.http.maxRequestHeaderSize = 8*1024
# Processing threads and buffers on Peons
# peons的设置 内存计算方式与middlemanager的计算一致 druid.processing.buffer.sizeBytes * (druid.processing.numMergeBuffers + druid.processing.numThreads + 1)
druid.indexer.fork.property.druid.processing.numMergeBuffers=2
druid.indexer.fork.property.druid.processing.buffer.sizeBytes=100000000
druid.indexer.fork.property.druid.processing.numThreads=1
#druid middleManager 需要的直接内存 这一块都是使用的默认值
# druid.processing.numThreads=Number of cores - 1
# druid.processing.numMergeBuffers=max(2, druid.processing.numThreads / 4)
# druid.processing.buffer.sizeBytes=auto (max 1GB)
# druid.processing.buffer.sizeBytes * (druid.processing.numMergeBuffers + druid.processing.numThreads + 1)
# Hadoop indexing
druid.indexer.task.hadoopWorkingPath=var/druid/hadoop-tmp
3.5 druid集群的启动
cd /learn/druid
在master节点: nohup ./bin/start-cluster-master-no-zk-server > master.log &
在query节点: nohup ./bin/start-cluster-query-server > query.log &
在data 节点: nohup ./bin/start-cluster-data-server > data.log &
看相应的master.log、query.log、data.log,结合 “jps”命令看下进程,表名成功启动;
3.6 从web控制台登录;
登录地址:http://ip:8888/ ,(ip为query节点的ip)
能从页面上看见红色部分的内容,说明集群的启动是没问题了;其中“Services”就是druid集群的服务及个数,我本地是2个“historical”,2个“middle_manager”。
四.其他的问题
4.1 集群的启动脚本;
4.2 本人安装druid遇见的问题;
4.3 SSH免密码登录;
上面的三个内容,后面单独介绍;
最后:感谢济南同事郑先生在学习过程中给予的帮助;
参考资料:https://druid.apache.org/docs/0.17.0/design/index.html