在druid进行配置时,首先需要搞清楚druid的整体架构、节点等概念,这对于后续各节点配置有更好的作用,druid整体架构如下:

druid removeAbandoned参数如何配置_druid

 (1)broker Nodes:对于Historical Nodes和Real-time Nodes来说作用是查询路由,所有的客户端请求都会发送到Broker Nodes中,该节点知道在zookeeper之上的segments信息,哪些segments是可查询的和这些segments存储在什么位置,最后该节点会merge来自Historical Nodes 和Real-time Nodes的查询结果,反馈给客户端,此外该节点还提供缓存的功能,它会缓存查询结构,如果后续查询hit 缓存,则只会去Historical 和Real-time Nodes去查询。

(2)Real-time Nodes:实时节点,实时ingest摄取数据,并可提供立即查询,该节点只关注较小时间范围内的数据,它会周期性的将接受到的stream 流数据落盘(hand off ),通过zookeeper与其他节点进行协调,它内部为将要摄取的Stream 流数据提供了一个基于内存的Buffer,为了避免内存溢出,会周期性或者达到最大数据量时将数据落盘。

(3)Historical Nodes:历史查询节点,只负责从Deep Storage中加载数据,删除数据,并对加载到内存中数据提供查询功能,通过zookeeper上报状态,并且接受来自zookeeper的指令,包括加载(load)和删除(drop)segments,并保存着Deep Storage中segments中的存储信息,知道如何解压缩和处理segments.

 (4)Coordinate Nodes:主要负责分布在Historical Nodes节点之上数据的管理,它通过zookeeper告知Historical Nodes 去Load 新的segments 和drop 过期的segments,并保持真个cluster 的运行的balance。

(5) MySQL: 主要存储druid 的元数据,主要包括segments元数据信息、rule table 信息,ingest task任务信息等。

                                 

druid removeAbandoned参数如何配置_数据_02

(6)zookeeper: 负责与各个节点进行协调和状态同步,并接受来自coordinate的指令(drop 、load),并存储druid 从Deep Storage中加载到内存中的segments信息,只有加载到内存,数据才是可查询的。

    对于druid 在搭建的时候需要配置各个节点,主要包括,

      

druid removeAbandoned参数如何配置_json_03

      其中middelManager和overlord均属于Real-time Node节点范围,overlord负责接受来自客户端的supervisor的请求,创建supervisor,而middelManager负责根据supervisor创建实际的task任务,task任务负责从外部message bus中实时获取数据,每个节点都包括jvm.properites和runtime.properties配置。

  (1) common configuration

      minial 配置如下,主要包括zookeeper配置,deep storage配置,mysql配置以及比较重要的druid.indexer.logs.directory配置,该属性便于后续查看task的日志信息。

druid.extensions.loadList主要配置extensions的依赖,如果实时从kafka读取数据,需要“druid-kafka-indexing-service”,如果需要hdfs 存储,则需要“druid-hdfs-storage”,需要根据实际情况去配置。

# Extensions
#

# This is not the full list of Druid extensions, but common ones that people often use. You may need to change this list
# based on your particular setup.
druid.extensions.loadList=["mysql-metadata-storage", "druid-hdfs-storage","druid-kafka-indexing-service","kafka-emitter","druid-datasketches"]

# If you have a different version of Hadoop, place your Hadoop client jar files in your hadoop-dependencies directory
# and uncomment the line below to point to your directory.
#druid.extensions.hadoopDependenciesDir=/my/dir/hadoop-dependencies

#
# Logging
#

# Log all runtime properties on startup. Disable to avoid logging properties on startup:
druid.startup.logging.logProperties=true

#
# Zookeeper
#

druid.zk.service.host=10.1.1.84:2181,10.1.1.77:2181,10.1.1.182:2181
druid.zk.paths.base=/druid

#
# Metadata storage
#

# For MySQL:
druid.metadata.storage.type=mysql
druid.metadata.storage.connector.connectURI=jdbc:mysql://xxxxxxxxxxxxxxxxxx:3306/druid
druid.metadata.storage.connector.user=xxxx
druid.metadata.storage.connector.password=xxxxx
#
# Deep storage
#

# For local disk (only viable in a cluster if this is a network mount):
druid.storage.type=local
druid.storage.storageDirectory=/var/druid/segments

# For HDFS (make sure to include the HDFS extension and that your Hadoop config files in the cp):
#druid.storage.type=hdfs
#druid.storage.storageDirectory=/druid/segments

#
# Indexing service logs
#

# For local disk (only viable in a cluster if this is a network mount):
druid.indexer.logs.type=file
druid.indexer.logs.directory=/var/druid/indexing-logs

# For HDFS (make sure to include the HDFS extension and that your Hadoop config files in the cp):
#druid.indexer.logs.type=hdfs
#druid.indexer.logs.directory=/druid/indexing-logs
#
# Service discovery
#

druid.selectors.indexing.serviceName=druid/overlord
druid.selectors.coordinator.serviceName=druid/coordinator

#
# Monitoring
#

druid.monitoring.monitors=["com.metamx.metrics.JvmMonitor"]
druid.emitter=composing
druid.emitter.logging.logLevel=info

  (2)Broker节点

    jvm.properties:

    

druid removeAbandoned参数如何配置_json_04

  runtime.propertis

 

druid removeAbandoned参数如何配置_druid_05

其中druid.processing.buffer.sizeBytes * (druid.processing.numThreads + 3)要小于此目录下jvm.config文件中MaxDirectMemorySize的值,否则启动不起来。

(2)coordinate

   jvm.properties :

druid removeAbandoned参数如何配置_zookeeper_06

runtime.properties:

druid removeAbandoned参数如何配置_druid_07

(3)historical configuration

  jvm.properties;

druid removeAbandoned参数如何配置_json_08

runtime.properties:

druid removeAbandoned参数如何配置_数据_09

druid.processing.buffer.sizeBytes * (druid.processing.numThreads + 3)要小于此目录下jvm.config文件中MaxDirectMemorySize的值,否则启动不起来。

并可配置segments Cache的,以提高查询效率。

(4)overload configuration

 jvm.properties:

druid removeAbandoned参数如何配置_json_10

runtime.properties

druid removeAbandoned参数如何配置_json_11

(5)middle manager

jvm.properties;  

druid removeAbandoned参数如何配置_数据_12

该节点的堆大小可设置较少,其主要创建task ,由task进行创建peon进行数据的实时ingest.

runtime.propertis:

druid removeAbandoned参数如何配置_json_13

其中,druid.worker.capacity主要配置可运行的task数量,task launch parameters主要用配置每个taskd的运行参数,并且

druid.processing.buffer.sizeBytes * (druid.processing.numThreads + 3)要小每个任务线程所使用的内存 –Xmx

启动druid

1、进入到druid-0.10.0目录下,使用bin/overlord.sh start,bin/coordinator.sh start 等命令启动对应的overlord、coordinator等节点。整个集群中,为确保HA,需要启动两个overlord、两个middleManager、两个coordinator、两个broker、三个historical节点。每台服务器上执行相应的启动节点命令。
2、验证:进入druid-0.10.0目录

①执行解压命令:

gzip -c -d quickstart/wikiticker-2015-09-12-sampled.json.gz > "quickstart/wikiticker-2015-09-12-sampled.json"


②导入数据:


curl -X 'POST' -H 'Content-Type:application/json' -d @quickstart/wikiticker-index.json  
overlordip:host 
/druid/indexer/v1/task 

       //overlordip替换为overlord节点所在服务器ip 

   出现{"task":"index_hadoop_wikiticker_2018-02-07T02:23:25.718Z"}说明导入成功


③查询

curl -L -H'Content-Type: application/json' -XPOST --data-binary @quickstart/wikiticker-top-pages.json http://brokerip:host/druid/v2/?pretty
//brokerip替换为broker节点所在服务器ip
返回查询结果说明集群无问题