1, 什么時候druid realtime節(jié)點數(shù)據(jù)持久化到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 . 關(guān)于segment合并的問題.
對于realtime node, segment的持久化取決與兩個條件:
(1). intermediatePersistPeriod
(2). maxRowsInMemory
以上任意的一個條件滿足,就會生成一個segment文件持久化到磁盤;
若干segment granularity 設(shè)置為hour,那么如果當(dāng)前時間>segment granularity + windowPeriod
就會合并當(dāng)前小時內(nèi)生成的所有segment文件痴脾,然后保存到deep storage.
3.Druid是否支持非結(jié)構(gòu)化數(shù)據(jù)?
Druid不支持非結(jié)構(gòu)化數(shù)據(jù),數(shù)據(jù)的攝入依賴定義好的schema.
4.Druid支持什么的格式數(shù)據(jù)入庫?
Druid支持json, cvs, tsv或者有明確分隔符的原始數(shù)據(jù).
5.Druid數(shù)據(jù)寫入失敗的原有?
實時: 實時流的數(shù)據(jù)寫入有一個以當(dāng)前時間為基準(zhǔn)的時間窗口(windowPeriod)設(shè)置,若待寫入數(shù)據(jù)的時間不在該窗口內(nèi)艘儒,則無法寫入Druid.
離線:離線寫入的數(shù)據(jù)時間需在指定的interval范圍內(nèi).
6 . 實時寫入方式的Segment沒有落地的原因?
Druid更新Metadata Storage失敗, 需要確保連接Metadata Storage正確.
歷史節(jié)點沒有足夠的容量用于本地緩存Segment
Deep Storage連接配置不正確.
7 . 如何更新歷史數(shù)據(jù)?
Druid中歷史數(shù)據(jù)的更新基于Segment,新的Segment生成夫偶,就會替代舊的Segment.
8. 如何監(jiān)控批量入Druid方式的任務(wù)?
以Hadoop導(dǎo)入數(shù)據(jù)方式為例:
(1) 首先離線ETL處理后把待寫入Druid的數(shù)據(jù)放置在指定HDFS路徑中.
(2) 然后通過inputSpec發(fā)送Http post給Overlord節(jié)點并獲取返回的taskId
(3) 最后定期利用taskId向Overlord節(jié)點發(fā)送Http Get請求檢查任務(wù)狀態(tài).
9.Druid是內(nèi)存數(shù)據(jù)庫嗎?
早起的Druid的確被設(shè)計為內(nèi)存數(shù)據(jù)庫界睁,所有數(shù)據(jù)都在內(nèi)存中,后來由于應(yīng)用需要支持更多數(shù)據(jù)兵拢,內(nèi)存大小提升有限和SSD技術(shù)的發(fā)展, Druid采用了內(nèi)存映射加使用配置管理的方式翻斟,就是將最需要被查詢的數(shù)據(jù)放在內(nèi)存中,超出部分和不常用的數(shù)據(jù)放在磁盤或SSD中.
10 . 什么是Druid的深度存儲?
Druid依賴深度存儲系統(tǒng)保存Segment文件, 如果歷史節(jié)點掛掉, Druid可以從深度存儲中加載Segment恢復(fù)數(shù)據(jù)支持查詢.深度存儲系統(tǒng)可以使用hdfs,s3等.
11 . Zookeeper 會不會因為單點失效影響Druid说铃?
首先访惜,Zookeeper 可以部署為多節(jié)點;
其次腻扇,即使全部失敗了疾牲,Druid的查詢部分也可以正常對外服務(wù),但是新寫入的數(shù)據(jù)將無法進入系統(tǒng)衙解,因為Druid需要通過Zookeeper管理Segment.
12 . Coordinator會不會存在單點失效問題阳柔?
Coordinator的運行采用Master/Slave模式,每次只有一個Master工作, 多個slave節(jié)點處于預(yù)備狀態(tài), Coordinator和Zookeeper一樣,如果全部失效蚓峦,將影響Segment的分配和管理舌剂,但是對于已有的查詢不影響.
13.查詢是否會繞過Coordinator?
Coordinator只會參與和管理Segment,而不參與查詢.
14 . Druid和Elasticsearch比較?
Druid是通過數(shù)據(jù)預(yù)聚合的方式壓縮數(shù)據(jù)并提升訪問速度暑椰,但是原始數(shù)據(jù)將丟失. Elasticsearch保存原始數(shù)據(jù)并通過建立倒排索引的方式對文檔索引查詢霍转,因此適合檢索的場景,Druid需要預(yù)先定義數(shù)據(jù)的Schema一汽,Elasticsearch則Schema free,因此可以寫入各種json數(shù)據(jù).
15 . 如何設(shè)置Broker節(jié)點的內(nèi)存?
Broker節(jié)點內(nèi)存主要利用JVM堆內(nèi)內(nèi)存合并歷史節(jié)點和實時節(jié)點的查詢結(jié)果避消,而堆外內(nèi)存則提供group by查詢操作時處理線程使用, Broker節(jié)點內(nèi)存設(shè)置注意事項如下:
JVM參數(shù):-XX:MaxDirectMemorySize指定最大的堆外內(nèi)存大小.
MaxDirectMemorySize >= (processing.numThreads + 1) * druid.processing.buffer.sizeBytes.
16 . 如何設(shè)置Historical節(jié)點的內(nèi)存?
Historical節(jié)點利用堆外內(nèi)存存儲中間計算結(jié)果集,并通過內(nèi)存映射的方式裝載Segment召夹, 因此可以綜合兩方面的數(shù)據(jù)獲得推薦內(nèi)存配置岩喷,Segment數(shù)據(jù)可用內(nèi)存大小的計算公式如下:
memory_for_segments = total_memory-heap-direct_memory-jvm_overhead
Historical節(jié)點內(nèi)存設(shè)置注意事項如下:
JVM參數(shù)-XX:MaxDirectMemorySize指定最大的堆外內(nèi)存大小
MaxDirectMemorySize >= (processing.numThreads + 1) * druid.processing.buffer.sizeBytes.
17 . Historical節(jié)點配置的maxSize含義?
maxSize 用于設(shè)置一個節(jié)點的最大累計Segment大小(單位是字節(jié)).修改這個參數(shù)將影響內(nèi)存和磁盤的使用比例.如果這個參數(shù)的值大于總的內(nèi)存容量,則很容易引起系統(tǒng)過于頻繁換頁监憎,導(dǎo)致查詢過慢.
18 . 查詢結(jié)果返回為空原因?
數(shù)據(jù)源不存在
查詢的字段不存在
查詢的數(shù)據(jù)時間范圍不匹配.
19 . 查詢實時寫入的數(shù)據(jù)時纱意,數(shù)據(jù)來源?
已完成切換(Hand off)的Segment數(shù)據(jù)將被加載至歷史節(jié)點中供查詢.
已完成切換(Hand off)的Segment數(shù)據(jù)由實時節(jié)點或中間管理者中的Peon提供查詢.
20 . Druid的外部依賴
深度存儲(HDFS)
元數(shù)據(jù)管理數(shù)據(jù)庫(Mysql)
協(xié)調(diào)管理(Zookeeper)
21 . Druid如何配置Segment的保留時間
Druid中已生成的Segment會永久存儲在Deep Storage中, 但是可以利用Coordinator的管理頁面(http://coordinator_ip:port)配置指定DataSource的Segment在本地服務(wù)器上的保留時間.
22 . 如何做到Druid服務(wù)升級不停止對外服務(wù)?
升級順序如下:
(1) 歷史節(jié)點
(2)統(tǒng)治節(jié)點
(3)中間管理者節(jié)點
(4)查詢節(jié)點
(5)協(xié)調(diào)節(jié)點
因為涉及正在處理的寫入的任務(wù),因此在中間管理者節(jié)點中有如下兩種方式進行任務(wù)回復(fù).
設(shè)置druid.index.task.restoreTasksOnRestart=true.服務(wù)重啟后可以回復(fù)任務(wù)狀態(tài).
首先鲸阔,停止MiddleManager服務(wù)狀態(tài), 通過HTTP POST 請求 http://middlemanager_ip:port/druid/worker/v1/disable .該服務(wù)將不在接收新任務(wù)偷霉,然后迄委,確認該服務(wù)的所有任務(wù)已完成. 通過HTTP GET請求http://middlemanager_ip:port/druid/worker/v1/tasks 查詢. 最后,重啟升級后的MiddleManager服務(wù)并開啟任務(wù)接收类少,通過HTTP POST請求http://middlemanager_ip:port/druid/worker/v1/enable
23 . 如何做基數(shù)統(tǒng)計
使用內(nèi)置聚合器HyperUnique叙身, 其基于HyperLogLog算法,支持并集操作,統(tǒng)計結(jié)果誤差為2%左右.
使用擴展庫DataSketch, 七基于ThetaSketch算法硫狞,支持交集曲梗,并集和差集運算,可配置最大去重精度.
24 . 如何做留存分析?
比如求滿足留存條件"第一周網(wǎng)站瀏覽過商品A后妓忍,第二周又來該網(wǎng)站瀏覽購買了商品A"的獨立用戶數(shù),可以利用ThetaSketch聚合器分別求出滿足上訴兩周條件的獨立用戶數(shù)愧旦,然后利用postAggregation對兩個結(jié)果做交集運算世剖,即為留存下來的獨立用戶數(shù).
25 . 關(guān)于mmap參數(shù)
查看map文件句柄
cat /proc/$PID/maps | wc -l
cat /proc/sys/vm/max_map_count
增加map文件句柄數(shù)
臨時增加: 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
如果希望設(shè)置更大的值,需要重新編譯內(nèi)核才可以.
26 . segment 過期
https://groups.google.com/forum/#!topic/druid-development/SBLwuatv4TM