1, 什么时候druid realtime节点数据持久化到deep storage
SegmentGranularity and windowPeriod control when the segment is persisted in the deep storage and handed over to the historical node.
Realtime node collects data for an interval until the (segmentGranularity + windowPeriod) for that segment interval elapses. After this period metadata for the segment is added to the database and segment is pushed to deep storage.
{
"dataSources" : {
"metrics-kafka" : {
"spec" : {
"dataSchema" : {
"dataSource" : "pageviews-kafka",
"parser" : {
"type" : "string",
"parseSpec" : {
"timestampSpec" : {
"column" : "time",
"format" : "auto"
},
"dimensionsSpec" : {
"dimensions" : ["url", "user"],
"dimensionExclusions" : [
"timestamp",
"value"
]
},
"format" : "json"
}
},
"granularitySpec" : {
"type" : "uniform",
"segmentGranularity" : "hour",
"queryGranularity" : "none"
},
"metricsSpec" : [
{
"name": "views",
"type": "count"
},
{
"name": "latencyMs",
"type": "doubleSum",
"fieldName": "latencyMs"
}
]
},
"ioConfig" : {
"type" : "realtime"
},
"tuningConfig" : {
"type" : "realtime",
"maxRowsInMemory" : "100000",
"intermediatePersistPeriod" : "PT10M",
"windowPeriod" : "PT10M"
}
},
"properties" : {
"task.partitions" : "1",
"task.replicants" : "1",
"topicPattern" : "pageviews"
}
}
},
"properties" : {
"zookeeper.connect" : "localhost",
"druid.discovery.curator.path" : "/druid/discovery",
"druid.selectors.indexing.serviceName" : "druid/overlord",
"commit.periodMillis" : "15000",
"consumer.numThreads" : "2",
"kafka.zookeeper.connect" : "localhost",
"kafka.group.id" : "tranquility-kafka"
}
}
2 . 关于segment合并的问题.
对于realtime node, segment的持久化取决与两个条件:
(1). intermediatePersistPeriod
(2). maxRowsInMemory
以上任意的一个条件满足,就会生成一个segment文件持久化到磁盘;
若干segment granularity 设置为hour,那么如果当前时间>segment granularity + windowPeriod
就会合并当前小时内生成的所有segment文件,然后保存到deep storage.
3.Druid是否支持非结构化数据?
Druid不支持非结构化数据,数据的摄入依赖定义好的schema.
4.Druid支持什么的格式数据入库?
Druid支持json, cvs, tsv或者有明确分隔符的原始数据.
5.Druid数据写入失败的原有?
实时: 实时流的数据写入有一个以当前时间为基准的时间窗口(windowPeriod)设置,若待写入数据的时间不在该窗口内,则无法写入Druid.
离线:离线写入的数据时间需在指定的interval范围内.
6 . 实时写入方式的Segment没有落地的原因?
Druid更新Metadata Storage失败, 需要确保连接Metadata Storage正确.
历史节点没有足够的容量用于本地缓存Segment
Deep Storage连接配置不正确.
7 . 如何更新历史数据?
Druid中历史数据的更新基于Segment,新的Segment生成,就会替代旧的Segment.
8. 如何监控批量入Druid方式的任务?
以Hadoop导入数据方式为例:
(1) 首先离线ETL处理后把待写入Druid的数据放置在指定HDFS路径中.
(2) 然后通过inputSpec发送Http post给Overlord节点并获取返回的taskId
(3) 最后定期利用taskId向Overlord节点发送Http Get请求检查任务状态.
9.Druid是内存数据库吗?
早起的Druid的确被设计为内存数据库,所有数据都在内存中,后来由于应用需要支持更多数据,内存大小提升有限和SSD技术的发展, Druid采用了内存映射加使用配置管理的方式,就是将最需要被查询的数据放在内存中,超出部分和不常用的数据放在磁盘或SSD中.
10 . 什么是Druid的深度存储?
Druid依赖深度存储系统保存Segment文件, 如果历史节点挂掉, Druid可以从深度存储中加载Segment恢复数据支持查询.深度存储系统可以使用hdfs,s3等.
11 . Zookeeper 会不会因为单点失效影响Druid?
首先,Zookeeper 可以部署为多节点;
其次,即使全部失败了,Druid的查询部分也可以正常对外服务,但是新写入的数据将无法进入系统,因为Druid需要通过Zookeeper管理Segment.
12 . Coordinator会不会存在单点失效问题?
Coordinator的运行采用Master/Slave模式,每次只有一个Master工作, 多个slave节点处于预备状态, Coordinator和Zookeeper一样,如果全部失效,将影响Segment的分配和管理,但是对于已有的查询不影响.
13.查询是否会绕过Coordinator?
Coordinator只会参与和管理Segment,而不参与查询.
14 . Druid和Elasticsearch比较?
Druid是通过数据预聚合的方式压缩数据并提升访问速度,但是原始数据将丢失. Elasticsearch保存原始数据并通过建立倒排索引的方式对文档索引查询,因此适合检索的场景,Druid需要预先定义数据的Schema,Elasticsearch则Schema free,因此可以写入各种json数据.
15 . 如何设置Broker节点的内存?
Broker节点内存主要利用JVM堆内内存合并历史节点和实时节点的查询结果,而堆外内存则提供group by查询操作时处理线程使用, Broker节点内存设置注意事项如下:
JVM参数:-XX:MaxDirectMemorySize指定最大的堆外内存大小.
MaxDirectMemorySize >= (processing.numThreads + 1) * druid.processing.buffer.sizeBytes.
16 . 如何设置Historical节点的内存?
Historical节点利用堆外内存存储中间计算结果集,并通过内存映射的方式装载Segment, 因此可以综合两方面的数据获得推荐内存配置,Segment数据可用内存大小的计算公式如下:
memory_for_segments = total_memory-heap-direct_memory-jvm_overhead
Historical节点内存设置注意事项如下:
JVM参数-XX:MaxDirectMemorySize指定最大的堆外内存大小
MaxDirectMemorySize >= (processing.numThreads + 1) * druid.processing.buffer.sizeBytes.
17 . Historical节点配置的maxSize含义?
maxSize 用于设置一个节点的最大累计Segment大小(单位是字节).修改这个参数将影响内存和磁盘的使用比例.如果这个参数的值大于总的内存容量,则很容易引起系统过于频繁换页,导致查询过慢.
18 . 查询结果返回为空原因?
数据源不存在
查询的字段不存在
查询的数据时间范围不匹配.
19 . 查询实时写入的数据时,数据来源?
已完成切换(Hand off)的Segment数据将被加载至历史节点中供查询.
已完成切换(Hand off)的Segment数据由实时节点或中间管理者中的Peon提供查询.
20 . Druid的外部依赖
深度存储(HDFS)
元数据管理数据库(Mysql)
协调管理(Zookeeper)
21 . Druid如何配置Segment的保留时间
Druid中已生成的Segment会永久存储在Deep Storage中, 但是可以利用Coordinator的管理页面(http://coordinator_ip:port)配置指定DataSource的Segment在本地服务器上的保留时间.
22 . 如何做到Druid服务升级不停止对外服务?
升级顺序如下:
(1) 历史节点
(2)统治节点
(3)中间管理者节点
(4)查询节点
(5)协调节点
因为涉及正在处理的写入的任务,因此在中间管理者节点中有如下两种方式进行任务回复.
设置druid.index.task.restoreTasksOnRestart=true.服务重启后可以回复任务状态.
首先,停止MiddleManager服务状态, 通过HTTP POST 请求 http://middlemanager_ip:port/druid/worker/v1/disable .该服务将不在接收新任务,然后,确认该服务的所有任务已完成. 通过HTTP GET请求http://middlemanager_ip:port/druid/worker/v1/tasks 查询. 最后,重启升级后的MiddleManager服务并开启任务接收,通过HTTP POST请求http://middlemanager_ip:port/druid/worker/v1/enable
23 . 如何做基数统计
使用内置聚合器HyperUnique, 其基于HyperLogLog算法,支持并集操作,统计结果误差为2%左右.
使用扩展库DataSketch, 七基于ThetaSketch算法,支持交集,并集和差集运算,可配置最大去重精度.
24 . 如何做留存分析?
比如求满足留存条件"第一周网站浏览过商品A后,第二周又来该网站浏览购买了商品A"的独立用户数,可以利用ThetaSketch聚合器分别求出满足上诉两周条件的独立用户数,然后利用postAggregation对两个结果做交集运算,即为留存下来的独立用户数.
25 . 关于mmap参数
查看map文件句柄
cat /proc/$PID/maps | wc -l
cat /proc/sys/vm/max_map_count
增加map文件句柄数
临时增加: sudo sysctl -w vm.max_map_count=1024000
永久增加:
echo 'vm.max_map_count=1024000' > /etc/sysctl.conf
sudo sysctl -p
vim /etc/security/limits.conf
* soft nofile 1024000
* hard nofile 1024000
如果希望设置更大的值,需要重新编译内核才可以.
26 . segment 过期
https://groups.google.com/forum/#!topic/druid-development/SBLwuatv4TM