一.下载安装(以下操作均需在所有节点执行)
- 创建/opt/druid目录作为安装目录。
- 下载最新版本druid wget http://static.druid.io/artifacts/releases/druid-0.12.3-bin.tar.gz
- 解压下载后的文件并重命名为druid tar -zxvf druid-0.12.3-bin.tar.gz;mv druid-0.12.3 druid
- 配置环境变量,在~/.bashrc中配置export DRUID_HOME=/opt/druid 添加至path ,source ~/.bashrc
二.配置信息
由于Druid各个节点角色不一样,只能分别配置。Druid配置文件目录比较清晰,各个节点进程启动只会读自己配置目录中的配置文件。
目录结构:
- bin目录:存放启动停止druid服务的脚本
- conf:配置信息
- extensions:各种场景外部组件需要用到的jar包依赖
- quickstart:快速测试案例
1.公共配置:
公共配置在部署目录的conf/druid/_common中,我们先配置common.runtime.properties文件。主要列出重要的配置,其他配置保留默认即可。
配置两个启动加载的扩展。一个是HDFS存储,一个是MySQL元数据。根据上文提到的部署环境来。
druid.extensions.loadList=["druid-hdfs-storage","mysql-metadata-storage"]
配置Zookeeper访问URL。
druid.zk.service.host=vubuntuez1:2181,vcentosez2:2181,vdebianez3:2181
druid.zk.paths.base=/druid
配置MYSQL 相关信息。
druid.metadata.storage.type=mysql
druid.metadata.storage.connector.connectURI=jdbc:mysql://data-237:3306/druid
druid.metadata.storage.connector.user=root
druid.metadata.storage.connector.password=innotech
配置底层存储。路径是HDFS路径。
druid.storage.type=hdfs
druid.storage.storageDirectory=/druid/segments
配置indexing服务的日志存储路径,下面的路径是HDFS路径。
druid.indexer.logs.type=hdfs
druid.indexer.logs.directory=/druid/indexing-logs
由于我们需要访问HDFS,Druid需要将Hadoop的配置文件配置到Classpath,这步骤是启动脚本完成的,我们只需要将HDFS配置文件复制到conf/druid/_common/目录下即可。hdfs-site.xml,core-site.xml,mapred-site.xml,yarn-site.xml四个配置文件。
2.historical配置:
配置文件在conf/druid/historical,先配置jvm.config,再配置runtime.properties。
a.jvm.config配置
-server
-Xms256m
-Xmx2g
-XX:MaxDirectMemorySize=1024m
-Duser.timezone=UTC+8
-Dfile.encoding=UTF-8
-Djava.io.tmpdir=/root/druid/druid-data/tmpdir
-Djava.util.logging.manager=org.apache.logging.log4j.jul.LogManager
每个配置项一行即可,java.io.tmpdir路径手动创建出来。说说内存配置。这个关乎是否能正常运行。-Xms,初始堆内存大小,设置了256M,-Xmx,最大堆内存大小,设置了2g。historical节点将在4G内存的data-241节点运行. 有个参数是MaxDirectMemorySize,有个公式:
druid.processing.buffer.sizeBytes*(druid.processing.numThreads+1+druid.processing.numMergeBuffers) <= MaxDirectMemorySize
而MaxDirectMemorySize不能大于Xmx。公式左边的参数都在runtime.properties文件中配置。如果提交任务时出现
Not enough direct memory. Please adjust -XX:MaxDirectMemorySize, druid.processing.buffer.sizeBytes, druid.processing.numThreads, or druid.processing.numMergeBuffers
可以通过减少druid.processing.buffer.sizeBytes 来解决
b.runtime.properties配置
druid.service=druid/historical
druid.port=8083
# HTTP server threads
druid.server.http.numThreads=2
# Processing threads and buffers
druid.processing.buffer.sizeBytes=67108864
druid.processing.numThreads=1
# Segment storage
druid.segmentCache.locations=[{"path":"/opt/druid/druid-data/segment cache","maxSize":130000000000}]
druid.server.maxSize=130000000000
大部分配置项我们可以不用管,主要配置的是内存部分和线程。druid.server.http.numThreads,配置了2,可以配置更多,但与内存有很大关系,我们的内存并没有这么大。还得根据上面提到的公式限制MaxDirectMemorySize。另外,数据段存储(Segment storage)部分的缓存路径请手动创建出来,这部分存储在磁盘,注意磁盘大小。
3.MiddleManager配置
配置文件在conf/druid/middleManager/路径下,两个配置文件,和historical一样。
a. jvm.config配置
-server
-Xms256m
-Xmx256m
-Duser.timezone=UTC+8
-Dfile.encoding=UTF-8
-Djava.io.tmpdir=/opt/druid/druid-data/tmpdir
-Djava.util.logging.manager=org.apache.logging.log4j.jul.LogManager
b. runtime.properties配置
druid.service=druid/middleManager
druid.port=8091
# Number of tasks per middleManager
druid.worker.capacity=3
# Task launch parameters
druid.indexer.runner.javaOpts=-server -Xmx512m -Duser.timezone=UTC+8 -Dfile.encoding=UTF-8 -Djava.util.logging.manager=org.apache.logging.log4j.jul.LogManager
druid.indexer.task.baseTaskDir=/opt/druid/druid-data
# HTTP server threads
druid.server.http.numThreads=5
# Processing threads and buffers on Peons
druid.indexer.fork.property.druid.processing.buffer.sizeBytes=67108864
druid.indexer.fork.property.druid.processing.numThreads=1
# Hadoop indexing
druid.indexer.task.hadoopWorkingPath=/opt/druid/druid-data
druid.indexer.task.defaultHadoopCoordinates=["org.apache.hadoop:hadoop-client:2.7.3"]
注意几个内存和线程的配置,保证上面提到的公式。还有一个task launch参数,是创建indexer task时所配置的虚拟机参数。indexer task很像MapReduce的task,每个任务都会产生一个虚拟机。Druid强大之处也是实现了自己的分布式计算框架。大部分配置都可以不用修改。这里我们用的hadoop-client是2.7.3。 我们的测试hdfs环境是2.7.6,这里不能更改。
4、broker配置
配置文件在conf/druid/broker。
a. jvm.config配置
-server
-Xms256m
-Xmx2048m
-XX:MaxDirectMemorySize=1024m
-Duser.timezone=UTC+8
-Dfile.encoding=UTF-8
-Djava.io.tmpdir=/opt/druid/druid-data/tmpdir
-Djava.util.logging.manager=org.apache.logging.log4j.jul.LogManager
b. runtime.properties配置
druid.service=druid/broker
druid.port=9001
# HTTP server threads
druid.broker.http.numConnections=1
druid.server.http.numThreads=5
# Processing threads and buffers
druid.processing.buffer.sizeBytes=67108864
druid.processing.numThreads=1
# Query cache
druid.broker.cache.useCache=true
druid.broker.cache.populateCache=true
druid.cache.type=local
druid.cache.sizeInBytes=2000000000
5、coordinator配置
配置文件在conf/druid/coordinator/。
a. jvm.config配置
-server
-Xms512m
-Xmx1024m
-Duser.timezone=UTC+8
-Dfile.encoding=UTF-8
-Djava.io.tmpdir=/opt/druid/druid-data/tmpdir
-Djava.util.logging.manager=org.apache.logging.log4j.jul.LogManager
-Dderby.stream.error.file=/opt/druid/derby.log
b. runtime.properties配置
druid.service=druid/coordinator
druid.port=9002
druid.coordinator.startDelay=PT30S
druid.coordinator.period=PT30S
6、overlord配置
配置文件在conf/druid/overlord/配置文件。
a. jvm.config配置
-server
-Xms512m
-Xmx1024m
-Duser.timezone=UTC+8
-Dfile.encoding=UTF-8
-Djava.io.tmpdir=/opt/druid/druid-data/tmpdir
-Djava.util.logging.manager=org.apache.logging.log4j.jul.LogManager
b. runtime.properties配置
druid.service=druid/overlord
druid.port=9003
druid.indexer.queue.startDelay=PT30S
druid.indexer.runner.type=remote
druid.indexer.storage.type=metadata
7、MySQL服务配置
创建druid数据库,并且允许远程访问
CREATE DATABASE druid DEFAULT CHARACTER SET utf8;
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'innotech' WITH GRANT OPTION;
FLUSH PRIVILEGES;
三。启动服务
- 登录data-237执行:
overlord.sh start
(统治节点)
启动overlord服务。 overlord.sh脚本内容:
cd $(dirname $0)/../
sh ./bin/node.sh overlord $1
通过node.sh 这个脚本进行启动
node.sh 脚本内容主要分为两部分 start 和 stop
start主要内容为:
nohup $JAVA `cat $CONF_DIR/$nodeType/jvm.config | xargs` -cp $CONF_DIR/_common:$CONF_DIR/$nodeType:$LIB_DIR/*:$HADOOP_CONF_DIR io.druid.cli.Main server $nodeType >> $LOG_DIR/$nodeType.log 2>&1 &
所以也可以通过这种命令进行启动;
stop主要是记录 pid通过kill 命令停止各个进程,其他脚本类似
2.登录data-238执行:coordinator.sh start
(协调节点)
3.登录data-239执行:broker.sh start
(查询节点)
4.登录data-241执行: historical start
(历史节点)middlemanager.sh start
(中间管理者)
四。查看服务
分别在各个节点启动相应的进程,启动完成后,查看log中的日志,各个进程的日志对应名字相同。若能运行稳定,没有抛出异常,则启动成功,我们可以查看Web的UI界面。
登录data-237:9003查看统治节点是否启动成功
登录data-238:9002查看协调节点是否启动成功
需要开放一下端口才能本地访问,
9002 (Coordinator)
9001 (Broker)
8083 (Historical)
8084 (Standalone Realtime, 暂未测试)
8088 (Router, 暂未测试)
9003 (Overlord)
8091 (Druid Middle Manager)
8100–8199 这些端口号是middleManager开启作业时各个作业自己的端口号,端口号上限取决于druid.worker.capacity。
8200 (Tranquility Server, 暂未测试)
五。遇到的问题
1.配置_common类时如果配置了mysql :
druid.extensions.loadList=["druid-hdfs-storage","mysql-metadata-storage"]
需要下载
wget http://static.druid.io/artifacts/releases/mysql-metadata-storage-0.12.3.tar.gz
并且解压到 druid/extensions目录下生成 mysql-metadata-storage文件夹。否则抛异常,因为druid默认没有添加mysql的连接驱动。
2.设置时区问题。
druid中 默认是utc时区需要和hadoop 以及本地时区一致。所以在配置各个文件的时候需要在utc处更改为 utc+8;否则会报 No buckets?? seems there is no data to index. 异常。
3.在从Hadoop导入数据到DRUID时出现了问题
com.google.inject.util.Types.collectionOf(Ljava/lang/reflect/Type;)Ljava/lang/reflect/ParameterizedType
DRUID依赖的谷歌的guice的版本与hadoop的版本冲突,解决办法:
cp $DRUID_HOME/lib/*guice* $HADOOP_HOME/share/hadoop/yarn/lib/
cp $DRUID_HOME/lib/*guice* $HADOOP_HOME/share/hadoop/mapreduce/lib/
会出现新的异常:
com.google.common.primitives.Longs.tryParse(Ljava/lang/String;)Ljava/lang/Long;
原因跟上面一样,Druid需要guava-16.0.1.jar,而Hadoop中只有guava-11.0.2.jar。将Druid中的guava-16.0.1.jar复制到Hadoop中。
cp $DRUID_HOME/lib/guava-16.0.1.jar $HADOOP_HOME/share/hadoop/yarn/lib/
cp $DRUID_HOME/lib/guava-16.0.1.jar $HADOOP_HOME/share/hadoop/common/lib/
cp $DRUID_HOME/lib/guava-16.0.1.jar $HADOOP_HOME/share/hadoop/hdfs/lib/
如果还是出现此异常 需要在摄入数据的json文件中的job.properties 添加
mapreduce.job.user.classpath.first = true
官方解释为:
Druid使用了许多可能存在于Hadoop集群中的库,如果这些库发生冲突,Map / Reduce作业可能会失败。启用classloader 可以避免此问题 mapreduce.job.classloader = true。这指示Druid依赖项和Hadoop自己的依赖项使用单独的类加载器。
如果您的Hadoop版本不支持此功能,您还可以尝试设置该属性 mapreduce.job.user.classpath.first = true。这指示Hadoop在发生冲突时加载Druid的库。
通常,您应该只设置其中一个参数,而不是两者。
可以使用以下任一方法设置这些属性:
- 使用任务定义,例如添加"mapreduce.job.classloader": "true"到索引服务的tuningConfig中的jobProperties
- 使用系统属性,例如在middleManager上添加druid.indexer.runner.javaOpts=... -Dhadoop.mapreduce.job.classloader=true。