Apache Druid本質就是一個分布式支持實時數據分析的數據存儲系統。
能夠快速的實現查詢與數據分析,高可用,高擴展能力。
距離上一次更新剛過了二十多天,距離0.17版本剛過了三個多月,Druid再次迎來重大更新,Druid也越來越強大了。
Apache Druid 0.18.0 本次更新了 42位貢獻者的200多個新功能,性能增強,BUG修復以及文檔改進。
新功能
Join支持
Join是數據分析中的關鍵操作。在0.18.0之前,Druid支持一些與Join有關的功能,例如SQL中的Lookups或半聯接。但是,這些功能的用例非常有限,對於其他聯接用例,用戶在攝取數據時必須對數據源進行規范化,而不是在查詢時將其加入,這可能導致數據量激增和攝取時間延長。
Druid 0.18.0有史以來第一次支持真正的Join,Druid 目前支持INNER,LEFT和CROSS的join。對於原生查詢,join
作為新的數據源被引入,以表示兩個數據源的Join。
當前,僅允許 left-deep join。這意味着左側數據源僅允許一個table
或另一個join
數據源。對於右側的數據源,lookup
,inline
,或者query
數據源是允許的。
Druid SQL也支持Join了!其實本質上是SQL JOIN查詢被轉換為一個或幾個包含原生查詢。
Join會影響查詢的性能,我們需要注意:
- LOOKUP函數性能更好,
LOOKUP
如果適合需求,請考慮使用該功能。 - 在Druid SQL中使用Join時,請記住,它會生成未明確包含在查詢中的子查詢。
- 式子查詢生成的一個常見原因是相等的兩半的類型是否不匹配。例如,由於查找鍵始終是字符串,因此
druid.d JOIN lookup.l ON d.field = l.field
如果d.field
為字符串,則性能最好。 - 從Druid 0.18.0開始,join運算符必須評估每一行的條件。將來,我們希望同時進行早期條件評估和延遲條件評估,並希望在常規情況下可以大大提高性能。
未來的工作:
RIGHT OUTER 和 FULL OUTER JOIN
改善性能
內聯查詢
Druid現在可以通過內聯子查詢來執行嵌套查詢。任何類型的子查詢都可以位於另一個類型的子查詢之上,例如以下示例:
topN
|
(join datasource)
/ \
(table datasource) groupBy
為了執行此查詢,Broker首先評估groupBy子查詢;它將子查詢發送到數據節點並收集結果。收集的結果將在Broker存儲中實現。Broker收集了groupBy查詢的所有結果后,它將通過使用具有groupBy查詢結果的內聯數據源替換groupBy來重寫topN查詢。最后,將重寫的查詢發送到數據節點以執行topN查詢。
查詢通道和優先級
當一次運行多個查詢時,有時您可能希望根據查詢的優先級來控制查詢的資源分配。例如,可能希望限制分配給不太重要的查詢的資源,以便重要的查詢可以及時執行,而不會因為不太重要的查詢而中斷。
使用查詢通道,就可以控制查詢工作負載的利用率。具體設置如下:
Property | Description | Default |
---|---|---|
druid.query.scheduler.numThreads |
Maximum number of HTTP threads to dedicate to query processing. To save HTTP thread capacity, this should be lower than druid.server.http.numThreads , but it is worth noting that like druid.server.http.enableRequestLimit is set that query requests over this limit will be denied instead of waiting in the Jetty HTTP request queue. |
Unbounded |
druid.query.scheduler.laning.strategy |
通道策略 | none |
druid.query.scheduler.prioritization.strategy |
優先級策略 | manual |
查詢指標的新維度
subQueryId 每個子查詢具有不同subQueryId
的,但有相同的 queryId
新配置
druid.server.http.maxSubqueryRows Broker內存中實現的最大行數
SQL分組
現在支持GROUPING SETS,允許您將多個GROUP BY子句組合為一個GROUP BY子句。
SQL動態參數
Druid現在支持SQL的動態參數。要使用動態參數,請用問號(?
)字符替換查詢中的所有文字。
重要變化
applyLimitPushDownToSegments
默認禁用
applyLimitPushDownToSegments
已在0.17.0中添加,但是如果查詢處理涉及許多段,則可能導致性能下降。這是因為“限制下推到分段掃描”會為每個分段初始化一個聚合緩沖區,其開銷不可忽略。僅以后當查詢涉及每個歷史或實時任務的段數相對較少時,才啟用此配置。
Kinesis的新滯后指標
Kinesis索引服務現在提供下面列出的新滯后指標:
-
ingest/{supervisor type}/lag/time
:流中最新偏移量的總時間(以毫秒為單位) -
ingest/{supervisor type}/maxLag/time
:流的最新偏移量之后的最長時間(以毫秒為單位) -
ingest/{supervisor type}/avgLag/time
:流的最新偏移量之后的平均時間(以毫秒為單位)
默認Roaring bitmaps
Druid 支持兩種 bitmap, Roaring 和 CONCISE,由於性能原因,默認切換為 Roaring
數組表達式語法更改
Druid表達式現在支持用於創建數組的類型化構造函數。可以使用顯式類型定義數組。例如,<LONG>[1, 2, null]
創建的陣列LONG
型含1
,2
,和null
。請注意,您仍然可以創建沒有顯式類型的數組。例如,[1, 2, null]
仍然是創建等效數組的有效語法。在這種情況下,Druid將根據其元素推斷數組的類型。此新語法也適用於空數組。<STRING>[]
,<DOUBLE>[]
以及<LONG>[]
將創建的空數組STRING
,DOUBLE
和LONG
類型。
自定義Transform
為開發人員公開了transform的擴展接口 詳情:https://druid.apache.org/docs/0.18.0/development/modules.html#writing-your-own-extensions
chunkPeriod
已刪除
chunkPeriod
從0.14.0開始不推薦使用,因為它的用法有限,現在,此查詢已從0.18.0中刪除。
支持Java 11
Druid現在支持Java11。您可以使用Java 11運行與Java 8相同的Druid二進制包。我們在Travis上進行的測試包括:
- 使用Java 11編譯和運行單元測試
- 使用Java 8進行編譯並使用Java 11運行集成測試
從Java 9開始,當發現某些庫使用反射非法訪問JDK的內部API時,它將發出警告。這些警告將通過在以后的版本中修改Druid代碼或升級庫版本來解決。目前,可以通過添加JVM選項(例如--add-opens
或)來抑制這些警告--add-exports
。
2020-01-22T21:30:08,893 WARN [main] org.apache.druid.java.util.metrics.AllocationMetricCollectors - Cannot initialize org.apache.druid.java.util.metrics.AllocationMetricCollector
java.lang.reflect.InaccessibleObjectException: Unable to make public long[] com.sun.management.internal.HotSpotThreadImpl.getThreadAllocatedBytes(long[]) accessible: module jdk.management does not "exports com.sun.management.internal" to unnamed module @6955cb39
可以通過添加禁止顯示此警告--add-exports java.base/jdk.internal.perf=ALL-UNNAMED
WARNING: An illegal reflective access operation has occurred
WARNING: Illegal reflective access by com.google.inject.internal.cglib.core.$ReflectUtils$1 to method java.lang.ClassLoader.defineClass(java.lang.String,byte[],int,int,java.security.ProtectionDomain)
WARNING: Please consider reporting this to the maintainers of com.google.inject.internal.cglib.core.$ReflectUtils$1
WARNING: Use --illegal-access=warn to enable warnings of further illegal reflective access operations
WARNING: All illegal access operations will be denied in a future release
可以通過添加禁止顯示此警告--add-opens java.base/java.lang=ALL-UNNAMED
2020-01-22T21:30:08,902 WARN [main] org.apache.druid.java.util.metrics.JvmMonitor - Cannot initialize GC counters. If running JDK11 and above, add --add-exports java.base/jdk.internal.perf=ALL-UNNAMED to the JVM arguments to enable GC counters.
可以通過添加禁止顯示此警告--add-exports java.base/jdk.internal.perf=ALL-UNNAMED
將Kafka客戶端更新到2.2.2
Kafka客戶端庫已更新至2.2.2
Bug修復
德魯伊0.18.0包括40個錯誤修復。有關錯誤修復的完整列表,請參見https://github.com/apache/druid/pulls?page=1&q=is%3Apr+milestone%3A0.18.0+is%3Aclosed+label%3ABug
- 修復superbatch合並最后一個分區邊界(#9448)
- 在流索引中重用轉換器(#9625)
- 保留壓縮后的數值類型尺寸的空值(#9622)
- DruidInputSource可以在重新攝取期間添加新尺寸(#9590)
- 價值計數器溢出錯誤,而不是寫入錯誤的段(#9559)
- 修復了帶有空值的數字列上的過濾器的一些問題(#9251)
- 在UTC時區之外修復timestamp_format expr(#9282)
- 設置帶有時區的segmentGranularity(#8690)時,KIS任務失敗
- 通過提取Fn,表達式,聯接等的限制下推來解決分組問題(#9662)
大數據流動 專注於大數據實時計算,數據治理,數據可視化等技術分享與實踐。
請在后台回復關鍵字下載相關資料。相關學習交流群已經成立,歡迎加入~