配色: 字号:
海量数据实时OLAP分析系统-Druid
2017-03-28 | 阅:  转:  |  分享 
  
海量数据实时OLAP分析系统-Druid.io安装配置和体验一、Druid简介二、Druid架构组成及相关依赖三、Druid集群配置四
、Druid集群启动五、Druid查询六、后记一、Druid简介Druid是一个为大型冷数据集上实时探索查询而设计的开源数据分
析和存储系统,提供极具成本效益并且永远在线的实时数据摄取和任意数据处理。主要特性:为分析而设计——Druid是为OLAP工作流的探
索性分析而构建。它支持各种filter、aggregator和查询类型,并为添加新功能提供了一个框架。用户已经利用Druid的基础
设施开发了高级K查询和直方图功能。交互式查询——Druid的低延迟数据摄取架构允许事件在它们创建后毫秒内查询,因为Druid的查询
延时通过只读取和扫描有必要的元素被优化。Aggregate和filter没有坐等结果。高可用性——Druid是用来支持需要一直在
线的SaaS的实现。你的数据在系统更新时依然可用、可查询。规模的扩大和缩小不会造成数据丢失。可伸缩——现有的Druid部署每天处理
数十亿事件和TB级数据。Druid被设计成PB级别。就系统而言,Druid功能位于PowerDrill和Dremel之间。它实现几
乎所有Dremel提供的工具(Dremel处理任意嵌套数据结构,而Druid只允许一个基于数组的嵌套级别)并且从PowerDril
l吸收一些有趣的数据格式和压缩方法。Druid对于需要实时单一、海量数据流摄取产品非常适合。特别是如果你面向无停机操作时,如果你对
查询查询的灵活性和原始数据访问要求,高于对速度和无停机操作,Druid可能不是正确的解决方案。在谈到查询速度时候,很有必要澄清“快
速”的意思是:Druid是完全有可能在6TB的数据集上实现秒级查询。二、Druid架构组成及其他依赖2.1OverlordNo
de(IndexingService)Overlord会形成一个加载批处理和实时数据到系统中的集群,同时会对存储在系统中的数据
变更(也称为索引服务)做出响应。另外,还包含了MiddleManager和Peons,一个Peon负责执行单个task,而Mid
dleManager负责管理这些Peons。2.2CoordinatorNode监控Historical节点组,以确保数据可
用、可复制,并且在一般的“最佳”配置。它们通过从MySQL读取数据段的元数据信息,来决定哪些数据段应该在集群中被加载,使用Zook
eeper来确定哪个Historical节点存在,并且创建Zookeeper条目告诉Historical节点加载和删除新数据段。2
.3HistoricalNode是对“historical”数据(非实时)进行处理存储和查询的地方。Historical节点响
应从Broker节点发来的查询,并将结果返回给broker节点。它们在Zookeeper的管理下提供服务,并使用Zookeeper
监视信号加载或删除新数据段。2.4BrokerNode接收来自外部客户端的查询,并将这些查询转发到Realtime和Histo
rical节点。当Broker节点收到结果,它们将合并这些结果并将它们返回给调用者。由于了解拓扑,Broker节点使用Zookee
per来确定哪些Realtime和Historical节点的存在。2.5Real-timeNode实时摄取数据,它们负责监听输
入数据流并让其在内部的Druid系统立即获取,Realtime节点同样只响应broker节点的查询请求,返回查询结果到broker
节点。旧数据会被从Realtime节点转存至Historical节点。2.6ZooKeeper为集群服务发现和维持当前的数据拓扑
而服务;2.7MySQL用来维持系统服务所需的数据段的元数据;2.8DeepStorage保存“冷数据”,可以使用HDFS。
三、Druid集群配置3.1环境信息我这里有两台机器,node1有32G内存,上面部署了HistoticalNode和Coor
dinatorNode;node2有72G内存,上面部署了其他四个服务。3.2通用配置(CommonConfiguratio
n)##创建MySQL数据库CREATEDATABASE`druid`DEFAULTCHARACTERSETutf8
COLLATEutf8_general_ci;grantallondruid.todruid@’%’identif
iedby‘druid1234′WITHGRANTOPTION;flushprivileges;##配置文件cd$D
RUID_HOME/config/_commonvicommon.runtime.properties(所有节点)##使用Mys
ql存储元数据druid.extensions.coordinates=["io.druid.extensions:druid-e
xamples","io.druid.extensions:druid-kafka-eight","io.druid.exten
sions:mysql-metadata-storage","io.druid.extensions:druid-hdfs-sto
rage"]##zookeeperdruid.zk.service.host=zkNode1:2181,zkNode2:2181
,zkNode3:2181##Mysql配置druid.metadata.storage.type=mysqldruid.met
adata.storage.connector.connectURI=jdbc:mysql://node1:3306/druidd
ruid.metadata.storage.connector.user=druiddruid.metadata.storage.
connector.password=diurd1234##配置deepstorage到HDFSdruid.storage.t
ype=hdfsdruid.storage.storageDirectory=hdfs://cdh5/tmp/druid/stor
age##配置查询缓存,暂用本地,可配置memcacheddruid.cache.type=localdruid.cache.s
izeInBytes=10737418240##配置监控druid.monitoring.monitors=["com.meta
mx.metrics.JvmMonitor"]##配置Indexingservice的名字druid.selectors.in
dexing.serviceName=druid/overlord##druid.emitter=logging3.3Ove
rlordNode(IndexingService)在运行OverlordNode节点上:cd$DRUID_HOME/co
nfig/overlordviruntime.propertiesdruid.host=node2druid.port=8090
druid.service=druid/overlord#Onlyrequiredifyouareautoscali
ngmiddlemanagersdruid.indexer.autoscale.doAutoscale=truedruid.i
ndexer.autoscale.strategy=ec2druid.indexer.autoscale.workerIdleTi
meout=PT90mdruid.indexer.autoscale.terminatePeriod=PT5Mdruid.inde
xer.autoscale.workerVersion=0#Uploadalltasklogstodeepstor
agedruid.indexer.logs.type=hdfsdruid.indexer.logs.directory=hdfs:
//cdh5/tmp/druid/indexlog#Runinremotemodedruid.indexer.runne
r.type=remotedruid.indexer.runner.minWorkerVersion=0#Storeall
taskstateinthemetadatastoragedruid.indexer.storage.type=meta
data3.4MiddleManagerNode在运行MiddleManagerNode节点上:cd$DRUID_HOM
E/config/middleManagerviruntime.propertiesdruid.host=node2druid.
port=8091druid.service=druid/middlemanagerdruid.indexer.logs.type
=hdfsdruid.indexer.logs.directory=hdfs://cdh5/tmp/druid/indexlog
#Resourcesforpeonsdruid.indexer.runner.javaOpts=-server-Xmx2g
-XX:+UseG1GC-XX:MaxGCPauseMillis=100-XX:+PrintGCDetails-XX:+P
rintGCTimeStampsdruid.indexer.task.baseTaskDir=/tmp/persistent/ta
sk/3.5CoordinatorNode在运行CoordinatorNode节点上:cd$DRUID_HOME/conf
ig/coordinatorviruntime.propertiesdruid.host=node1druid.port=808
1druid.service=coordinatordruid.coordinator.startDelay=PT5M3.6H
istoricalNode在运行HistoricalNode节点上:cd$DRUID_HOME/config/histori
calviruntime.propertiesdruid.host=node1druid.port=8082druid.serv
ice=druid/historicaldruid.historical.cache.useCache=truedruid.hi
storical.cache.populateCache=truedruid.processing.buffer.sizeByt
es=1073741824druid.processing.numThreads=9druid.server.http.numT
hreads=9druid.server.maxSize=300000000000druid.segmentCache.loca
tions=[{"path":"/tmp/druid/indexCache","maxSize":300000000000
}]druid.monitoring.monitors=["io.druid.server.metrics.Historical
MetricsMonitor","com.metamx.metrics.JvmMonitor"]3.7BrokerNode在
运行BrokerNode节点上:cd$DRUID_HOME/config/brokerviruntime.propertie
sdruid.host=node2druid.port=8092druid.service=druid/brokerdruid.
broker.http.numConnections=20druid.broker.http.readTimeout=PT5Md
ruid.processing.buffer.sizeBytes=2147483647druid.processing.numTh
reads=11druid.server.http.numThreads=203.8Real-timeNode在运行Real
-timeNode节点上:cd$DRUID_HOME/config/realtimeviruntime.properties
druid.host=node2druid.port=8093druid.service=druid/realtimedruid
.processing.buffer.sizeBytes=1073741824druid.processing.numThread
s=5#Overrideemittertoprintlogsabouteventsingested,rejec
ted,etcdruid.emitter=loggingdruid.monitoring.monitors=["io.drui
d.segment.realtime.RealtimeMetricsMonitor","com.metamx.metrics.J
vmMonitor"]四、Druid集群启动首次启动时候,可以遵循下面的启动顺序。4.1BrokerNodecd$DRUID
_HOME/cprun_druid_server.shrun_broker.shvirun_broker.sh替换以下内容:
SERVER_TYPE=broker#startprocessJAVA_ARGS="${JAVA_ARGS}-Xmx10g
-Xms5g-XX:NewSize=2g-XX:MaxNewSize=2g-XX:MaxDirectMemorySize=
24g-XX:+UseConcMarkSweepGC-XX:+PrintGCDetails-XX:+PrintGCTimeS
tamps"JAVA_ARGS="${JAVA_ARGS}-Duser.timezone=GMT+8-Dfile.encodi
ng=UTF-8"JAVA_ARGS="${JAVA_ARGS}-Djava.util.logging.manager=org.
apache.logging.log4j.jul.LogManager-Djava.io.tmpdir=/tmp/druid"J
AVA_ARGS="${JAVA_ARGS}-Dcom.sun.management.jmxremote.port=17071
-Dcom.sun.management.jmxremote.authenticate=false-Dcom.sun.manag
ement.jmxremote.ssl=false-Ddruid.extensions.localRepository=${MA
VEN_DIR}"执行./run_broker.sh启动BrokerNode:4.2HistoricalNodecd$DR
UID_HOME/cprun_druid_server.shrun_historical.shvirun_historica
l.sh替换以下内容:SERVER_TYPE=historical#startprocessJAVA_ARGS="${JAV
A_ARGS}-Xmx10g-Xms10g-XX:NewSize=2g-XX:MaxNewSize=2g-XX:MaxD
irectMemorySize=16g-XX:+UseConcMarkSweepGC-XX:+PrintGCDetails-
XX:+PrintGCTimeStamps"JAVA_ARGS="${JAVA_ARGS}-Duser.timezone=GMT
+8-Dfile.encoding=UTF-8"JAVA_ARGS="${JAVA_ARGS}-Djava.util.logg
ing.manager=org.apache.logging.log4j.jul.LogManager-Djava.io.tmp
dir=/tmp/druid"JAVA_ARGS="${JAVA_ARGS}-Ddruid.extensions.localRe
pository=${MAVEN_DIR}"执行命令./run_historical.sh启动HistoricalNode:4.
3CoordinatorNodecd$DRUID_HOME/cprun_druid_server.shrun_coord
inator.shvirun_coordinator.sh替换以下内容:SERVER_TYPE=coordinator#st
artprocessJAVA_ARGS="${JAVA_ARGS}-Xmx10g-Xms10g-XX:NewSize=51
2m-XX:MaxNewSize=512m-XX:+UseG1GC-XX:+PrintGCDetails-XX:+Prin
tGCTimeStamps"JAVA_ARGS="${JAVA_ARGS}-Duser.timezone=GMT+8-Dfil
e.encoding=UTF-8"JAVA_ARGS="${JAVA_ARGS}-Djava.util.logging.mana
ger=org.apache.logging.log4j.jul.LogManager-Djava.io.tmpdir=/tmp
/druid"JAVA_ARGS="${JAVA_ARGS}-Ddruid.extensions.localRepository
=${MAVEN_DIR}"执行命令./run_coordinator.sh启动CoordinatorNode.4.4Midd
leManagercd$DRUID_HOME/cprun_druid_server.shrun_middleManager
.shvirun_middleManager.sh替换以下内容:SERVER_TYPE=middleManager#start
processJAVA_ARGS="${JAVA_ARGS}-Xmx64m-Xms64m-XX:+UseConcMarkS
weepGC-XX:+PrintGCDetails-XX:+PrintGCTimeStamps-Duser.timezone
=GMT+8-Dfile.encoding=UTF-8"JAVA_ARGS="${JAVA_ARGS}-Djava.util.
logging.manager=org.apache.logging.log4j.jul.LogManager-Djava.io
.tmpdir=/tmp/druid-Ddruid.extensions.localRepository=${MAVEN_DIR
}"执行命令./run_middleManager.sh启动MiddleManagerNode。4.5OverlordNod
ecd$DRUID_HOME/cprun_druid_server.shrun_overlord.shvirun_over
lord.sh替换以下内容:SERVER_TYPE=overlord#startprocessJAVA_ARGS="${JAV
A_ARGS}-Xmx4g-Xms4g-XX:NewSize=256m-XX:MaxNewSize=256m-XX:+U
seConcMarkSweepGC-XX:+PrintGCDetails-XX:+PrintGCTimeStamps"JAVA
_ARGS="${JAVA_ARGS}-Duser.timezone=GMT+8-Dfile.encoding=UTF-8"J
AVA_ARGS="${JAVA_ARGS}-Djava.util.logging.manager=org.apache.log
ging.log4j.jul.LogManager-Djava.io.tmpdir=/tmp/druid"JAVA_ARGS="
${JAVA_ARGS}-Ddruid.extensions.localRepository=${MAVEN_DIR}"执行命令
./run_overlord.sh启动OverlordNode:4.6Real-timeNodecd$DRUID_HOME
/cprun_druid_server.shrun_realtime.shvirun_realtime.sh替换以下内容:S
ERVER_TYPE=realtime#startprocessJAVA_ARGS="${JAVA_ARGS}-Xmx13
g-Xms13g-XX:NewSize=2g-XX:MaxNewSize=2g-XX:MaxDirectMemorySiz
e=9g-XX:+UseConcMarkSweepGC-XX:+PrintGCDetails-XX:+PrintGCTime
Stamps-XX:+HeapDumpOnOutOfMemoryError"JAVA_ARGS="${JAVA_ARGS}-D
user.timezone=GMT+8-Dfile.encoding=UTF-8"JAVA_ARGS="${JAVA_ARGS}
-Ddruid.realtime.specFile=/home/liuxiaowen/druid-0.8.1/examples/
wikipedia/wikipedia_realtime.spec"JAVA_ARGS="${JAVA_ARGS}-Djava.
util.logging.manager=org.apache.logging.log4j.jul.LogManager-Dja
va.io.tmpdir=/tmp/druid"JAVA_ARGS="${JAVA_ARGS}-Dcom.sun.managem
ent.jmxremote.port=17072-Dcom.sun.management.jmxremote.authentic
ate=false-Dcom.sun.management.jmxremote.ssl=false"JAVA_ARGS="${J
AVA_ARGS}-Ddruid.extensions.localRepository=${MAVEN_DIR}"##特别需要注
意参数:-Ddruid.realtime.specFile=/home/liuxiaowen/druid-0.8.1/exampl
es/wikipedia/wikipedia_realtime.spec启动RealTimeNode需要指定一个realtime
数据源的配置文件,本文中使用example提供的wikipedia_realtime.spec,启动后,该数据源从irc.wiki
media.org获取实时数据。关于RealTimeNode的配置,后续文章将会详细介绍。执行命令./run_realtime.
sh启动RealTimeNode。五、Druid查询第四部分中启动RealTimeNode时候使用了例子中自带的配置文件wik
ipedia_realtime.spec,启动后,该RealTimeNode会从irc.wikimedia.org获取实时数据,
本章将以该数据源为例,学习几种最常见的查询。5.1select查询首先编辑查询配置文件select_query.json{"q
ueryType":"select","dataSource":"wikipedia","dimensions":[],
"metrics":[],"granularity":"all","intervals":["2015-11-01/20
15-11-20"],"pagingSpec":{"pagingIdentifiers":{},"threshold":1
0}}该配置文件的含义是从数据源”wikipedia”进行select查询所有列,时间区间为2015-11-01/2015-11
-20,每10条记录一个分页。执行命令查询:curl-XPOST‘http://node2:8093/druid/v2/?p
retty’-H‘content-type:application/json’-d@select_query.json瞬
间返回结果:5.2基于时间序列的查询Timeseriesquery编辑查询配置文件timeseries.json{"quer
yType":"timeseries","dataSource":"wikipedia","intervals":["
2010-01-01/2020-01-01"],"granularity":"minute","aggregations"
:[{"type":"longSum","fieldName":"count","name":"edit_count
"},{"type":"doubleSum","fieldName":"added","name":"chars_ad
ded"}]}该配置文件的含义是:从数据源”wikipedia”中进行时间序列查询,区间为2010-01-01/2020-01
-01,按分钟汇总结果,汇总字段为count和added;执行查询命令:curl-XPOST‘http://node2:80
93/druid/v2/?pretty’-H‘content-type:application/json’-d@timeseries.json同样瞬间返回结果:5.3TopN查询编辑查询文件topn.json{"queryType":"topN","dataSource":"wikipedia","granularity":"all","dimension":"page","metric":"edit_count","threshold":10,"aggregations":[{"type":"longSum","fieldName":"count","name":"edit_count"}],"filter":{"type":"selector","dimension":"country","value":"UnitedStates"},"intervals":["2012-10-01T00:00/2020-01-01T00"]}该文件含义是:从数据源”wikipedia”进行TopN查询,其中N=10,维度为page,指标为edit_count,也就是,在page维度上将edit_count汇总后取Top10.执行查询命令:curl-XPOST‘http://node2:8093/druid/v2/?pretty’-H‘content-type:application/json’-d@topn.json结果为:六、后记Druid目前已经有很多公司用于实时计算和实时OLAP,而且效果很好。虽然它的配置和查询都比较复杂和繁琐,但如果是真正基于海量数据的实时OLAP,它的威力还是很强大的。我将持续学习和分享Druid的相关技术,验证它在海量数据实时OLAP上的效果
献花(0)
+1
(本文系关平个人图...首藏)