1. 概述
Druid的数据摄入主要包括两大类,流式数据摄入和静态数据摄入
1.1 对于流式数据的摄入,Druid提供了两种方式,分别是push和pull,
采用pull方式摄取数据,需要启动一个实时节点,通过不同的firehose摄入不同的流式数据,firehose可以被认为Druid接入不同数据源的适配器。例如从kafka摄入数据,就用kafkaFirehose,从RabbitMQ摄入数据,就用RabbitMQFirehose
采用push摄入数据,需要使用Druid索引服务(indexing Service),索引服务会启动一个Http服务,数据通过调用这个HTTP服务推送到Druid系统
1.2 静态数据源
静态数据可以通过实时节点摄入,也可以通过索引服务启动一个任务来进行摄入。
2.实时数据摄入_以pull的方式
以pull方式摄入数据,需要启动一个实时节点,需要一个配置文件去指定数据输入的相关参数,这个配置文件是Ingestion Spec,是一个json格式文件,有三部分组成
{
"dataSchema" 说明数据源的格式,数据解析 维度等信息
"ioConfig" 说明数据如何在Druid存储
"tuningConfig" 说明数据优化的配置
}
2.1 dataSchema是数据源的描述
具体格式如下
{
"datasource": " " String类型,数据源的名字
"parser" :{...} JSON对象,包含如何解析数据的内容
"metricsSpec":[...] list 包含所有指标列的信息
"granularitySpec":{...} json对象,指明数据的存储和查询力度
}
2.1.1 parser 声明了如何解析一条数据,parser支持string protebuffer格式,社区中也贡献了一些插件可以支持其他的格式
parser :{
“type” : "..." string数据类型
“parseSpec”{....} json对象 指明了数据源格式,比如维度列表,指标列表,时间戳列名 常用的有三种格式 JSON CSV TSV
}
JSON parseSpec
parseSpec :{
"format":"json"
"timestampSpec":{...} json对象,指明时间戳列名和格式
"dimensionsSpec":{...} json对象,指明维度的设置
"flattenSpec":{...} json对象,若有json有嵌套层级,则需要指定
}
其中timestampSpec如下:
dimensionsSpec :{
"dimensions : [....]" List[String] 维度名列表
"dimensionExclusions":[...] List[String] 剔除的维度名列表,可选
"spatialDimensions":[...] List[String] 空间维度名列表,主要用于地理几何运算,可选
}
CSV parseSpec
parseSpec : {
format : csv
timestampSpec : {....} json对象,时间戳列名和格式
dimensionsSpec: {...} json对象,指明维度的设置
columns : [....] List[String] CSV数据列名
listDelimiter : "..." String 多值维度列,数据分隔符,可选
}
TSV ParseSpec
parseSpec : {
format : tsv
timestampSpec : {....} json对象,时间戳列名和格式
dimensionsSpec : {...} json对象,维度的设置
colums : [....] list[String] TSV数据列名
listDelimiter : "..." string,多值维度列,数据分隔符,可选
delimiter : "...." string 数据分隔符 ,默认值为 \t ,可选
}
2.1.2 metricsSpec
metricsSpec是一个json数组,指明所有的指标列和所用的聚合函数,数据格式
metricsSpec : [
{
type : "....." count | longSum等聚合函数类型
fieldName : ...... string 聚合函数运用的列名,可选
name : ..... string 聚合后指标列名
}
]
一些简单的聚合函数:
• count : 统计满足查询过滤条件的数据行数,这个行数跟原始输入的行数不一样,因为druid会对原始数据进行聚合,这是聚合后的行数
• longSum 做求和
• longMin 求最小
• longMax 求最大
• doubleSum
• doubleMin
• doubleMax
2.1.3 GranularitySpec 指定segment的存储粒度和查询粒度
granularitySpec : {
type : uniform
segmentGranularity : .... string segment的存储粒度,HOUR DAY
queryGranularity : .... string 最小查询粒度 MINUTE HOUR
intervals : .... 输入数据的时间段,可选,对于流式数据pull方式而言可以忽略
}
2.2 ioConfig 指明了真正具体的数据源
ioConfig : {
type : realtime
firehose : {.....} 指明数据源,例如本地文件 kafka
plumber : realtime
}
不同的firehose的格式不太一致,以kafka为例
{
firehose : {
consumerProps : {
auto.commit.enable : false
auto.offset.reset : largest
fetch.message.max.bytes : 1048586
group.id : druid-example
zookeeper.connect : localhost:2181
zookeeper.connect.timeout.ms : 15000
zookeeper.session.timeout.ms : 15000
zookeeper.sync.time.ms : 5000
},
feed : wikipedia
type : kafka-0.8
}
}
2.3 tuningConfig 这部分配置是优化数据输入的过程
tuningConfig : {
type : realtime
maxRowsInMemory : 在存盘之前内存中最大的存储行数,指的是聚合后的行数
windowPeriod : 最大可容忍时间窗口,超过窗口,数据丢弃
intermediatePersistPeriod 多长时间数据临时存盘一次
basePersistDirectory 临时存盘目录
versioningPolicy : .... 如何为segment设置版本号
rejectionPolicy : .... 数据丢弃策略
maxPendingPersits 最大同时存盘请求数,达到上限,输入将会暂停
shardSpec 分片设置
buildV9Directly 是否直接构建V9版本的索引
persistThreadPriority 存盘线程优先级
mergeThreadPriority 存盘归并线程优先级
reportParseExceptions 是否汇报数据解析错误
}
3.实时数据摄入_以push的方式
采用push摄入数据,需要使用Druid索引服务(indexing Service),索引服务会启动一个Http服务,数据通过调用这个HTTP服务推送到Druid系统。
具体的Ingestion Spec 配置和上面pull方式类似,在此不在详解。
4. 离线数据摄入
4.1 静态文件摄入
使用自带的摄入机制,可以在数据节点摄入本地文件,方法如下:
bin/post-index-task --file quickstart/wikiticker-index.json
wikiticker-index.json 文件中既包括datasource的定义,也包括数据文件位置的配置
4.2 HDFS文件摄入
配置过程可参考:http://druid.io/docs/0.12.1/ingestion/batch-ingestion.html
5. 配置参考
通用配置:https://github.com/druid-io/tranquility/blob/master/docs/configuration.md
数据摄入通用配置:http://druid.io/docs/latest/ingestion/index.html
Tranquility Kafka:https://github.com/druid-io/tranquility/blob/master/docs/kafka.md