@
Apache Druid 官網地址 https://druid.apache.org/
Apache Druid 官網最新檔案地址 https://druid.apache.org/docs/latest/design/
Apache Druid原始碼地址 https://github.com/apache/druid
Apache Druid是一個集時間序列資料庫(timeseries databases)、資料倉儲(data warehouses)和全文檢索紀錄檔分析系統系統(logsearch systems)特點於一體的分析性資料平臺,由MetaMarket公司研發的⼀款針對海量資料進⾏⾼效能實時分析的OLAP引擎的實時分析型資料庫(包含儲存引擎和分析引擎),捐獻給Apache基⾦會。最新版本為25.0.0
注意:此Apache Druid非阿里巴巴開源專案資料庫連線池Druid,不要混為一談。
Apache Druid是一個分散式的、支援實時多維 OLAP 分析、列式儲存的資料處理系統,支援高速的實時資料讀取處理、支援實時靈活的多維資料分析查詢;最常被當作資料庫用以支援攝取、高效能查詢、高聚和高並行API 、高穩定執行的應用場景。Druid支援根據時間戳對資料進行預聚合攝入和聚合分析,在時序資料處理分析場景中也可以使用Druid。Druid有對應的GUI頁面,適用於面向事件型別的資料、實時資料提取、高效能查詢場景。
其中OLAP分析分為關係型聯機分析處理(ROLAP)和多維聯機分析處理(MOLAP),MOLAP需要資料預計算好為一個多維陣列,典型方式就是Cube,而ROLAP就是資料本身什麼樣就是什麼樣,查詢時通過MPP提高分散式計算能力。Druid是ROLAP路線,實時攝取資料,實時出結果,不像Kylin一樣,有一個顯式的預計算過程。
Druid主要的優點在於支援流式和批次資料的匯入、高並行亞秒級查詢、儲存索引優化。
低延遲互動式查詢:Druid提供低延遲實時資料攝取(⼊庫),並採⽤預聚合、列式儲存、點陣圖索引等⼿段使得海量資料分析能夠亞秒級響應。
⾼可⽤性( High Available ):Druid 使⽤ HDFS/S3 作為 Deep Storage,Segment 會在多個Historical 節點上進⾏載入;攝取資料時也可以多副本攝取,保證資料可⽤性和容錯性。
可伸縮( Horizontal Scalable ):Druid 部署架構都可以⽔平擴充套件,增加⼤量伺服器來加快資料攝取,在生產環境中可以部署到數十臺多數百臺伺服器組成的叢集中,可以提供每秒百萬條資料的寫入,針對萬億條記錄保證亞秒級的查詢。
大規模並⾏處理( Parallel Processing ): Druid 可以在整個叢集中並⾏處理查詢。
豐富的查詢能⼒( Rich Query ):Druid⽀持時間序列、 TopN、GroupBy等查詢,同時提供了2種查詢⽅式:API 和 SQL。除了原生的基於 JSON 的查詢外,Druid 還支援基於 HTTP 和 JDBC 的 SQL。
列式儲存:Druid使用面相列的儲存,對於OLAP分析需要讀取列分析的場景加快了速度,同時一列資料中有很多共性的資料,資料的壓縮效果好,佔用空間小,支援快速掃描及聚合查詢。
支援實時或者批次讀取資料:Druid支援實時獲取資料,實時獲取的資料可以實時查詢,也支援批次讀取資料。
叢集自動平衡,方便運維:Druid叢集擴大或者縮小時,只需要增加或者減少對應的機器數,Druid叢集自動會平衡各個節點,不需要停機。
對資料進行預聚合或預計算:Druid可以人為指定按照某些時間粒度對相同維度的資料進行在資料攝取階段預聚合計算,既加快了查詢速度,也減少了資料儲存空間。
近似演演算法:Druid 應用了近似 count-distinct、近似排序以及近似直方圖和分位數計算的演演算法,這些演算法佔用有限的記憶體使用量,通常比精確計算要快得多;對於精度要求比速度更重要的場景,Druid還提供了精確 count-distint 和精確排序。
bitmap索引快速過濾:Druid中可以通過bitmap構建索引,對資料進行壓縮,加快查詢過濾速度。
基於時間的分割區:Druid 首先按時間對資料進行分割區,另外同時可以根據其他欄位進行分割區,這意味著基於時間的查詢將僅存取與查詢時間範圍匹配的分割區,這將大大提高基於時間的資料的效能。
不會丟失資料的雲原生容錯架構:一旦 Druid 攝取了資料,副本就安全地儲存在深度儲存媒介 (通常是雲端儲存、HDFS 或共用檔案系統)中。即使某個 Druid 服務發生故障,也可以以從深度儲存中恢復效據,對於僅影響的少數 Druid 服務的有限故障,副本可確保在系統恢復時仍然可以進行查詢。
靈活的資料模式:Druid 優雅地適應不斷變化的資料模式和巢狀資料型別。
此外Druid也有不足之處,比如:
如果使用場景符合下面的一些特性,那麼Druid 將會是一個非常不錯的選擇:
如果使用場景是下面的一些情況的話,Druid 不是一個較好的選擇:
框架選型:從超巨量資料的查詢效率來看 Druid > Kylin > Presto > Spark SQL,從支援的資料來源種類來講 Presto > Spark SQL > Kylin > Druid。
# 下載apache-druid最新版本25.0.0
wget https://dlcdn.apache.org/druid/25.0.0/apache-druid-25.0.0-bin.tar.gz
# 下載相容hadoop3的apache-druid最新版本25.0.0
wget https://dlcdn.apache.org/druid/25.0.0/apache-druid-25.0.0-hadoop3-bin.tar.gz
# 解壓檔案
tar -xvf apache-druid-25.0.0-bin.tar.gz
# 進入目錄
cd apache-druid-25.0.0
# 單機啟動druid
./bin/start-druid -m 16g
啟動後在druid的根目錄下產生兩個目錄,一個log和一個var。所有持久狀態如叢集後設資料儲存和服務段都儲存在Druid根目錄下的var目錄中;每個服務寫入var/sv下的紀錄檔檔案,可以通過刪除整個var目錄將Druid恢復到安裝後的原始狀態。
存取Druid的控制檯頁面:http://192.168.5.52:8888/
拿官方提供quickstart的範例資料檔案來演示
在「查詢」檢視中,單擊「連線外部資料」。選擇「本地磁碟」,輸入值(分別輸入基本目錄和萬用字元檔案過濾器(由UI提供),允許您一次指定要攝入的多個檔案)後單擊連線資料。
在Parse頁面上在將資料載入到Druid之前可以檢查原始資料和執行操作
單擊Done返回到Query檢視,該檢視顯示新生成的查詢,查詢將樣例資料插入到名為wikipedia(原來為wikiticker-2015-09-12-sampled,修改表名)的表中。
生成SQL如下
REPLACE INTO "wikipedia" OVERWRITE ALL
WITH "ext" AS (SELECT *
FROM TABLE(
EXTERN(
'{"type":"local","baseDir":"quickstart/tutorial/","filter":"wikiticker-2015-09-12-sampled.json.gz"}',
'{"type":"json"}',
'[{"name":"time","type":"string"},{"name":"channel","type":"string"},{"name":"cityName","type":"string"},{"name":"comment","type":"string"},{"name":"countryIsoCode","type":"string"},{"name":"countryName","type":"string"},{"name":"isAnonymous","type":"string"},{"name":"isMinor","type":"string"},{"name":"isNew","type":"string"},{"name":"isRobot","type":"string"},{"name":"isUnpatrolled","type":"string"},{"name":"metroCode","type":"long"},{"name":"namespace","type":"string"},{"name":"page","type":"string"},{"name":"regionIsoCode","type":"string"},{"name":"regionName","type":"string"},{"name":"user","type":"string"},{"name":"delta","type":"long"},{"name":"added","type":"long"},{"name":"deleted","type":"long"}]'
)
))
SELECT
TIME_PARSE("time") AS "__time",
"channel",
"cityName",
"comment",
"countryIsoCode",
"countryName",
"isAnonymous",
"isMinor",
"isNew",
"isRobot",
"isUnpatrolled",
"metroCode",
"namespace",
"page",
"regionIsoCode",
"regionName",
"user",
"delta",
"added",
"deleted"
FROM "ext"
PARTITIONED BY DAY
單擊Run執行查詢。這個任務可能需要一兩分鐘才能完成。完成後,任務將顯示其持續時間和插入到表中的行數。檢視被設定為自動重新整理,因此不需要重新整理瀏覽器就能看到狀態變化。
輸入SQL,點選執行查詢資料
SELECT
channel,
COUNT(*)
FROM "wikipedia"
GROUP BY channel
ORDER BY COUNT(*) DESC
也可以使用Druid SQL API提交和取消Druid SQL查詢。Druid SQL API可以在https://ROUTER:8888/druid/v2/sql上找到,其中ROUTER是Druid ROUTER的IP地址.
curl -XPOST -H'Content-Type: application/json' http://localhost:8888/druid/v2/sql/ -d @wikipedia-top-pages-sql.json
Druid的原生查詢語言是基於HTTP的JSON,可以檢視wikipedia-top-pages.json的內容
{
"queryType" : "topN",
"dataSource" : "wikipedia",
"intervals" : ["2015-09-12/2015-09-13"],
"granularity" : "all",
"dimension" : "page",
"metric" : "count",
"threshold" : 10,
"aggregations" : [
{
"type" : "count",
"name" : "count"
}
]
}
可以通過http請求也可以通過druid控制檯查詢
curl -X POST 'http://localhost:8888/druid/v2/?pretty' -H 'Content-Type:application/json' -H 'Accept:application/x-jackson-smile' -d @wikipedia-top-pages.json