建议使用JDK1.8。可以参考《Linux安装JDK完整步骤》。
创建druid用户,用来管理druid相关的服务。执行命令:
useradd druid #创建用户
passwd druid #设置druid用户密码
Druid的服务套件imply自带zookeeper,方便单机部署。如果是集群部署,最好使用自己部署的zookeeper集群。
如果已安装,则跳过本节;如果没有安装,请参考《日志平台搭建手册》。
Druid集群搭建需要依赖HDFS,用来存储数据文件,这里只需要进行单机安装。本文档采用Hadoop安装包为hadoop-2.9.1.tar.gz,所有命令均由druid用户操作执行。
执行命令,完成安装包的解压:tar -zxvf hadoop-2.9.1.tar.gz,解压完成后在当前目录生成hadoop-2.9.1目录,针对该目录创建软连接,方便以后软件升级,执行命令:ln -s hadoop-2.9.1 hadoop,创建完成之后,当前目录结构如下图:
创建hadoop运行目录,执行命令:
mkdir -p /data/var/hadoop/tmp
再创建hdfs namenode的name目录和data目录,执行命令:
mkdir -p /data/var/hadoop/tmp/dfs/name
mkdir -p /data/var/hadoop/tmp/dfs/data
这里涉及两个配置文件,均位于hadoop解压目录下,分别为:etc/hadoop/core-site.xml和etc/hadoop/hdfs-site.xml。
编辑core-site.xml文件,内容如下:
hadoop.tmp.dir
file:/data/var/hadoop/tmp
hadoop的运行临时文件的主目录
fs.defaultFS
hdfs://yourhost:9000
HDFS的访问路径
注意将上述配置中红色字体部分内容改为实际ip或域名。
编辑hdfs-site.xml文件,内容如下:
dfs.replication
1
dfs.namenode.name.dir
file:/data/var/hadoop/tmp/dfs/name
dfs.namenode.data.dir
file:/data/var/hadoop/tmp/dfs/data
配置完成之后,执行以下语句格式化NameNode:
./bin/hdfs namenode –format,成功后会看到如下提示:
接着执行以下命令启动NameNode和DataNode守护进程:
./sbin/start-dfs.sh
若提示ssh连接,输入yes即可。完成之后,输入命令jps来判断是否成功启动。若成功启动则会列出如下进程:
NameNode
DataNode
SecondaryNameNode
成功启动后,可以访问 Web 界面 http://localhost:50070 查看 NameNode 和 Datanode 信息,还可以在线查看 HDFS 中的文件。 若有如下页面,恭喜安装成功!
停止hadoop,执行命令:./sbin/stop-dfs.sh。
使用验证主要是利用脚本hdfs进行相关操作,执行命令:./bin/hdfs dfs -h进行命令帮助查看。
查看根目录的文件列表:./bin/hdfs dfs -ls /
上传文件到HDFS的根目录:./bin/hdfs dfs -put README.txt /
删除刚才上传的文件:./bin/hdfs dfs -rm /README.txt
4.3节中执行hdfs的启动命令之后,控制台会提示需要输入ssh的连接密码,总共需要输入3次密码,比较繁琐。本节实现ssh免密登录本机。假设该机器已安装ssh客户端。
首先执行如下命令生成公钥和私钥对:ssh-keygen -t rsa,一直按回车键,直到命令执行完毕。执行完成之后进入当前用户目录,使用ls -al命令查看目录列表,生成了一个.ssh目录,该目录下有id_rsa和id_rsa.pub两个文件。
在.ssh目录下创建文件authorized_keys,然后执行cat id_rsa.pub >> authorized_keys。
最后确定文件访问权限,id_rsa,id_rsa.pub,authorized_keys的访问权限设置为600。
测试时候成功,执行命令:ssh localhost,如果成功登录,则表示免密登录设置成功。
再次执行hdfs的启动命令,则控制台不会提示输入登录密码。
Druid集群搭建依赖MySql数据库,存储元数据信息。
执行如下命令安装必要的编译工具:
yum -y install cmake ncurses-devel gcc gcc-c++
安装mysql之前是必须先安装boost库。经过我之前的失败经历,安装mysql5.7.12要求boost的版本是boost_1_59_0,版本不同的话会失败。
这里在Download boost_1_59_0.tar.gz (Boost C++ Libraries)下载压缩包,也可以在centos中使用wget命令下载。
下载完毕后: tar -xzvf boost_1_59_0.tar.gz cd boost_1_59_0 ./bootstrap.sh --with-libraries=system,filesystem,log,thread --with-toolset=gcc ./b2 toolset=gcc
./b2 install --prefix=/usr/local/boost地址自己决定,默认是/usr/local/lib
在http://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.12.tar.gz下载mysql5.7.12的压缩包,或使用wget命令直接下载。
tar -xzvf mysql-5.7.12.tar.gz解压
cd mysql-5.7.12
cmake -DCMAKE_INSTALL_PREFIX=/usr/local/mysql -DMYSQL_DATADIR=/mysqldata/ -DDEFAULT_CHARSET=utf8 -DDEFAULT_COLLATION=utf8_general_ci -DMYSQL_TCP_PORT=3306 -DMYSQL_USER=mysql -DWITH_MYISAM_STORAGE_ENGINE=1 -DWITH_INNOBASE_STORAGE_ENGINE=1 -DWITH_ARCHIVE_STORAGE_ENGINE=1 -DWITH_BLACKHOLE_STORAGE_ENGINE=1 -DWITH_MEMORY_STORAGE_ENGINE=1 -DDOWNLOAD_BOOST=1 -DWITH_BOOST=boost_1_59_0(boost解压目录)
make
make install
make clean
rm CMakeCache.txt
vim /etc/my.cnf 写入内容:
[mysqld]
basedir =/usr/local/mysql
datadir=/usr/local/mysql/data/
port = 3306
socket=/tmp/mysql.sock
user=root
[client]
socket=/tmp/mysql.sock
设置mysql开机自动启动
cp /usr/local/mysql/support-files/mysql.server /etc/init.d/mysqld
chmod 755 /etc/init.d/mysqld
chkconfig –add mysqld
chkconfig –level 345 mysqld on
初始化mysql ./mysqld --initialize --user=mysql --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data 这条命令执行后会产生一个初始密码: A temporary password is generated for root@localhost: tj+/Yssvc9Gb (要记下来)
执行命令启动mysql服务:service mysqld start
使用root登录数据库 密码是之前记下来的密码,使用set password=‘’;命令修改密码。
Druid是一种列式存储数据库,能够实现大数据量的实时统计分析。本文档采用druid安装包为imply-2.6.0.tar,所有命令均由druid用户操作执行。
执行命令,完成安装包的解压:tar -zxvf imply-2.6.0.tar,解压完成后在当前目录生成imply-2.6.0目录,针对该目录创建软连接,方便以后软件升级,执行命令:ln -s imply-2.6.0 imply,创建完成之后,当前目录结构如下图:
单机安装无须任何配置,进入imply目录执行如下命令即可启动Druid:
./bin/supervise -c conf/supervise/quickstart.conf
命令执行之后,控制台将输出信息,可以看出该脚本启动了7个相关进程,包括:zk、coordinator、broker、historical、overlord、middleManager、imply-ui。
如果Druid相关服务正常启动,可以访问Druid控制台页面:http://localhost:8081;还可以访问Druid协调信息页面:http://localhost:8090;还可以访问一个最重要的页面——数据操作查看页面:http://localhost:9095
服务节点名称 |
说明 |
端口 |
协调节点coordinator |
负责历史节点的负载均衡以及通过规则管理数据的生命周期 |
8081 |
历史节点historical |
负责加载已生成好的数据文件已提供数据查询 |
8083 |
索引服务——overlord |
索引服务的主节点 |
8090 |
索引服务——middleManager |
索引服务的从节点 |
8091 |
查询节点broker |
对外提供数据查询服务,并同时从实时节点与历史节点查询数据,合并后返回给调用方 |
8082 |
Imply-ui,pivot服务 |
提供可视化的数据操作界面 |
9095 |
将协调节点coordinator和索引服务的主节点overlord部署在一台机器上,这两个节点均属于管理类型节点,主要负责协调其他节点有条不紊的工作。假设该机器ip为192.168.10.100,命令为master节点。
将历史节点historical、索引服务从节点middleManager、查询节点broker和数据管理界面imply-ui部署在一个节点,方便数据操作交互。假设该机器ip为192.168.10.101,名为query节点。
配置文件路径:imply/conf/druid/_common/common.runtime.properties,全局配置内容如下:
#
# Extensions
#
druid.extensions.directory=dist/druid/extensions
druid.extensions.hadoopDependenciesDir=dist/druid/hadoop-dependencies
druid.extensions.loadList=["druid-parser-route","mysql-metadata-storage","druid-hdfs-storage","druid-kafka-indexing-service"]
#
# Logging
#
# Log all runtime properties on startup. Disable to avoid logging properties on startup:
druid.startup.logging.logProperties=true
#
# Zookeeper
#
druid.zk.service.host=host1:2181,host2:2181,host3:2181
druid.zk.paths.base=/druid
#
# Metadata storage
#
# For MySQL:
druid.metadata.storage.type=mysql
druid.metadata.storage.connector.connectURI=jdbc:mysql://host:3306/druid
druid.metadata.storage.connector.user=root
druid.metadata.storage.connector.password=888888
#
# Deep storage
#
# For HDFS:
druid.storage.type=hdfs
druid.storage.storageDirectory=hdfs://host-hadoop:9000/druid/segments
#
# Indexing service logs
#
# For HDFS:
druid.indexer.logs.type=hdfs
druid.indexer.logs.directory=hdfs://host-hadoop:9000/druid/indexing-logs
#
# Service discovery
#
druid.selectors.indexing.serviceName=druid/overlord
druid.selectors.coordinator.serviceName=druid/coordinator
#
# Monitoring
#
druid.monitoring.monitors=["io.druid.java.util.metrics.JvmMonitor"]
druid.emitter=logging
druid.emitter.logging.logLevel=debug
注意上述配置中加粗的配置项,请根据之前的zookeeper、mysql和hadoop的安装,填写实际的ip、端口和访问账号和密码。
该节点配置文件所在目录:imply/conf/druid/coordinator,下面包含三个配置文件:jvm.config,main.config,runtime.properties。
修改jvm.config文件,调整jvm的参数如下:
-server
-Xms512m #根据实际情况进行设置
-Xmx512m #根据实际情况进行设置
-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
编辑runtime.properties文件,修改协调节点的host和port。
druid.host=192.168.10.100
druid.port=8081
该节点配置文件所在目录:imply/conf/druid/historical,同协调节点一样包含3个配置文件。
修改jvm.config文件,调整jvm的参数如下:
-server
-Xms512m #根据实际情况进行设置
-Xmx512m #根据实际情况进行设置
-XX:MaxDirectMemorySize=1g #根据实际情况进行设置
-Duser.timezone=UTC+0800
-Dfile.encoding=UTF-8
-Djava.io.tmpdir=var/tmp
-Djava.util.logging.manager=org.apache.logging.log4j.jul.LogManager
编辑runtime.properties文件,修改协调节点的host和port。
druid.host=192.168.10.101
druid.port=8083
该节点配置文件所在目录:imply/conf/druid/overlord,同协调节点一样包含3个配置文件。
修改jvm.config文件,调整jvm的参数如下:
-server
-Xms256m
-Xmx256m
-Duser.timezone=UTC+0800
-Dfile.encoding=UTF-8
-Djava.io.tmpdir=var/tmp
-Djava.util.logging.manager=org.apache.logging.log4j.jul.LogManager
编辑runtime.properties文件,修改协调节点的host和port。
druid.host=192.168.10.100
druid.port=8090
该节点配置文件所在目录:imply/conf/druid/middleManager,同协调节点一样包含3个配置文件。
修改jvm.config文件,调整jvm的参数如下:
-server
-Xms64m
-Xmx64m
-Duser.timezone=UTC+0800
-Dfile.encoding=UTF-8
-Djava.io.tmpdir=var/tmp
-Djava.util.logging.manager=org.apache.logging.log4j.jul.LogManager
编辑runtime.properties文件,修改协调节点的host和port,以及indexer的javaOpts。
druid.host=192.168.10.101
druid.port=8091
druid.indexer.runner.javaOpts=-server -Xmx1g -Duser.timezone=UTC+0800 -Dfile.encoding=UTF-8 -Djava.util.logging.manager=org.apache.logging.log4j.jul.LogManager
该节点配置文件所在目录:imply/conf/druid/broker,同协调节点一样包含3个配置文件。
修改jvm.config文件,调整jvm的参数如下:
-server
-Xms512m
-Xmx512m
-XX:MaxDirectMemorySize=1g
-Duser.timezone=UTC+0800
-Dfile.encoding=UTF-8
-Djava.io.tmpdir=var/tmp
-Djava.util.logging.manager=org.apache.logging.log4j.jul.LogManager
编辑runtime.properties文件,修改协调节点的host和port。
druid.host=192.168.10.101
druid.port=8082
配置文件路径:imply/conf/pivot/config.yaml,配置内容如下:
# The port on which the imply-ui server will listen on.
port: 9095
# runtime directory
varDir: var/pivot
# The initial settings that will be loaded in, in this case a connection will be created for a Druid cluster that is running locally.
initialSettings:
connections:
- name: druid
type: druid
title: My Druid
host: 192.168.10.101:8082
coordinatorHosts: ["192.168.10.100:8081"]
overlordHosts: ["192.168.10.100:8090"]
# imply-ui must have a state store in order to function
# The state (data cubes, dashboards, etc) can be stored in two ways.
# Choose just one option and comment out the other.
#
# 1) Stored in a sqlite file, editable at runtime with Settings View. Not suitable for running in a cluster.
# 2) Stored in a database, editable at runtime with Settings View. Works well with a cluster of Imply servers.
#stateStore:
# type: sqlite
# connection: var/pivot/pivot-settings.sqlite
stateStore:
type: mysql
#location: mysql
connection: 'mysql://root:888888@host:3306/pivot'
上述配置中字体加粗的内容需要根据实际情况填写。
常用的启动命令为imply/bin/supervise,该命令的启动配置文件位于imply/conf/supervise目录下,配置文件指定启动的服务列表。
Master节点服务包含协调节点coordinator和统治节点overlord,且这些服务依赖独立的zookeeper服务。我们把master节点启动配置文件命令为master.conf。在imply/conf/supervise目录下执行如下命令:
cp master-no-zk.conf master.conf
前台启动命令如下:
./bin/supervise -c conf/supervise/master.conf
后台启动命令如下:
nohup ./bin/supervise -c conf/supervise/master.conf > master.log &
成功启动之后,执行命令ps -ef | grep imply,结果如下:
从上图可以看出,协调节点coordinator和统治节点overlord已正常运行。
修改imply/conf/supervise/query.conf,内容如下:
:verify bin/verify-java
:verify bin/verify-node
:verify bin/verify-version-check
broker bin/run-druid broker conf #启动broker查询节点
imply-ui bin/run-imply-ui conf #启动imply-ui
historical bin/run-druid historical conf #启动historical历史节点
middleManager bin/run-druid middleManager conf #启动索引服务从节点middleManager
# Uncomment to user Tranquility Server
#!p95 tranquility-server bin/tranquility server -configFile conf/tranquility/server.json
# Uncomment to use Tranquility Kafka
#!p95 tranquility-kafka bin/tranquility kafka -configFile conf/tranquility/kafka.json
前台启动命令如下:
./bin/supervise -c conf/supervise/query.conf
后台启动命令如下:
nohup ./bin/supervise -c conf/supervise/query.conf > query.log &
成功启动之后,执行命令ps -ef | grep imply,结果如下:
从上图可以看出,查询节点broker、imply-ui节点、历史节点historical、middleManager节点均已正常运行。
Druid集群服务的停止方法有两种,一种是通过ps命令获取服务进程号之后,采用kill命令直接杀掉;另外一种方法是使用druid自带的命令,命令为imply/bin/service。查看命令使用方法:./bin/service --help,输出如下:
Unknown option: help usage: ./bin/service (--restart | --tail | --down) [-d ]
执行命令:./bin/service --down,可以关闭该机器上所有的druid相关服务。
本文采用index-serveice服务进行实时数据导入,导入过程可以分为三个步骤:
在kafka集群创建一个topic,供生产者实时往该topic写入数据,供消费者实时从该topic读取数据。执行命令:
$KAFKA_HOME/bin/kafka-topics.sh --zookeeper localhost:2181 --replication-factor 3 --partitions 3 --topic test
以上命令创建了一个名称为test的topic,该topic的分片数为3,副本数也为3。
Druid读取kafka数据采用index-service,需要先向overlord的节点提交任务,提交地址:http://192.168.10.100:8090/druid/indexer/v1/supervisor。
提交任务的规范明细内容如下:
{
"type": "kafka",
"dataSchema": {
"dataSource": "trans-kafka",
"parser": {
"type": "string",
"parseSpec": {
"format": "json",
"timestampSpec": {
"column": "tran_timestamp",
"format": "auto"
},
"dimensionsSpec": {
"dimensions": [
"mon_sid",
"target_ip",
"target_port",
"source_ip",
"tran_name",
"channel",
{"name" : "tran_cost", "type" : "long"},
"ret_code",
"ret_msg",
"tran_result",
"excp_stat"
]
}
}
},
"metricsSpec" : [],
"granularitySpec": {
"type": "uniform",
"segmentGranularity": "HOUR",
"queryGranularity": "NONE",
"rollup": false
}
},
"ioConfig": {
"topic": "test",
"consumerProperties": {
"group.id": "druid"
"bootstrap.servers": "IP2:9092,ip2:9092,IP3:9092"
}
}
}
上述内容仅供参考,请读者根据自己的实际情况进行编写任务规范明细,将上述文件保存为kafka-index.json,然后执行如下命令,将任务提交给索引服务主节点overlord。
curl -X POST -H 'Content-Type:application/json' -d @kafka-index.json http://192.168.10.100:8090/druid/indexer/v1/supervisor。
提交完成之后,可以查看活跃的任务列表,执行如下命令:
curl -X GET http://192.168.10.100:8090/druid/indexer/v1/supervisor
本节写入数据是指向kafka中的topic写入数据,上节druid已经指定消费test topic,那么现在我们只需要向test topic写入数据,即可实现数据实时流转。写入数据的方法有两种:
(1)采用kafka自带的生产者命令写入数据,该方法只能用来测试系统的联通性,命令如下:
$KAFKA_HOME/bin/kafka-console-producer.sh --broker-list localhost:9092 --topic test
(2)采用Java程序调用kafka的依赖包,自己编码写入数据,该部分类型不详述,在生产环境中以实现。
数据查询需要发送查询参数给查询节点broker,请求地址为http://192.168.10.101:8082/druid/v2/,目前有两种方式实现数据查询:
将查询参数信息保存到本地文件,本文假设该文件命名为query.json,内容如下:
{
"queryType": "timeseries",
"dataSource": "trans-kafka",
"granularity": "minute",
"intervals": ["2018-08-09T19:20:00.000Z/2018-08-10T00:00:01.000Z"],
"aggregations": [
{
"type": "count",
"name": "total"
}
]
}
查询参数以json格式组织,发起请求则可以通过curl命令实现,如下:
curl -X POST -H 'Content-Type:application/json' -d @query.json http://192.168.10.101:8082/druid/v2/