成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

Apache中Druid多進(jìn)程架構(gòu)介紹

今天小編給大家分享的是Apache中Druid多進(jìn)程架構(gòu)的詳細(xì)介紹,相信大部分人都不太了解,為了讓大家更加了解,小編給大家總結(jié)了以下內(nèi)容,話不多說,一起往下看吧。

成都創(chuàng)新互聯(lián)是一家專注于做網(wǎng)站、成都網(wǎng)站制作與策劃設(shè)計(jì),扎賚特網(wǎng)站建設(shè)哪家好?成都創(chuàng)新互聯(lián)做網(wǎng)站,專注于網(wǎng)站建設(shè)十年,網(wǎng)設(shè)計(jì)領(lǐng)域的專業(yè)建站公司;建站業(yè)務(wù)涵蓋:扎賚特等地區(qū)。扎賚特做網(wǎng)站價(jià)格咨詢:13518219792

Druid 是多進(jìn)程架構(gòu),每種進(jìn)程類型都可以獨(dú)立配置,獨(dú)立擴(kuò)展。這樣可以為集群提供最大的靈活度。這種設(shè)計(jì)還提供了強(qiáng)失效容忍:一個(gè)失效的組件不會(huì)立即影響另外的組件。

下面我們來深入了解 Druid 有哪些進(jìn)程類型,每種進(jìn)程又在整個(gè)集群中扮演什么角色。

進(jìn)程和服務(wù)(Process and Servers)

Druid 有多種進(jìn)程類型,如下:

  • Coordinator進(jìn)程在集群中負(fù)責(zé)管理數(shù)據(jù)可用。
  • Overlord進(jìn)程控制數(shù)據(jù)攝入的資源負(fù)載分配。
  • Broker進(jìn)程處理外部客戶端的查詢。
  • Router進(jìn)程是可選的,它可以路由請求到 Brokers,Coordinator,和 Overlord。
  • Historical進(jìn)程存儲可查詢的數(shù)據(jù)。
  • MiddleManager進(jìn)程負(fù)責(zé)數(shù)據(jù)攝入。

你可以以任何方式來部署上面的進(jìn)程。但是為了易于運(yùn)維,官方建議以下面三種服務(wù)類型來組織進(jìn)程:Master、Query 和 Data。

  • Master:運(yùn)行 Coordinator 和 Overlord 進(jìn)程,管理數(shù)據(jù)可用和數(shù)據(jù)寫入。
  • Query: 運(yùn)行 Broker 和可選的 Router 進(jìn)程,負(fù)責(zé)處理外部查詢請求。
  • Data:運(yùn)行 Historical 和 MiddleManager 進(jìn)程,負(fù)責(zé)執(zhí)行數(shù)據(jù)寫入任務(wù)并存儲可查詢的數(shù)據(jù)。

外部依賴(External dependencies)

除了內(nèi)置的進(jìn)程類型,Druid 還有三個(gè)外部依賴項(xiàng)。

Deep storage

共享文件存儲,只要配置成允許 Druid 訪問即可。在集群部署中,通常使用分布式存儲(如 S3 或 HDFS)或掛載網(wǎng)絡(luò)文件系統(tǒng)。在單機(jī)部署中,通常使用本地磁盤。Druid 使用 Deep Storage 存儲寫入集群的數(shù)據(jù)。

Druid 僅將 Deep Storage 用作數(shù)據(jù)的備份,并作為 Druid進(jìn)程間在后臺的數(shù)據(jù)傳輸方式。要響應(yīng)查詢,Historical 進(jìn)程并不從 Deep Storage 上讀取數(shù)據(jù),在任何查詢之前,先從本地磁盤查詢已經(jīng)存在的數(shù)據(jù)。這意味著,Druid 在查詢時(shí)并不需要訪問 Deep Storage,這樣就可以得到最優(yōu)的查詢延遲。這也意味著,在 Deep Storage 和 Historical 進(jìn)程間你必須有足夠的磁盤空間來存儲你計(jì)劃加載的數(shù)據(jù)。

Deep Storage 是 Druid 彈性、容錯(cuò)設(shè)計(jì)的重要組成部分。如果 Druid 單機(jī)進(jìn)程本地?cái)?shù)據(jù)丟失,可以從 Deep Storage 恢復(fù)數(shù)據(jù)。

Metadata storage

元數(shù)據(jù)存儲,存儲各種共享的系統(tǒng)元數(shù)據(jù),如 segment 可用性信息和 task 信息。在集群部署中,通常使用傳統(tǒng)的 RDBMS,如 PostgreSQL 或 MySQL。在單機(jī)部署中,通常使用本地存儲,如 Apache Derby 數(shù)據(jù)庫。

Zookeeper

用來進(jìn)行內(nèi)部服務(wù)發(fā)現(xiàn),協(xié)調(diào),和主選舉。

架構(gòu)圖(Architecture diagram)

下圖可以看出使用官方建議的 Master/Query/Data 服務(wù)部署方式,查詢和寫入數(shù)據(jù)是如何進(jìn)行的:

Apache中Druid多進(jìn)程架構(gòu)介紹

存儲設(shè)計(jì)(Storage design)

Datasources and segments

Druid 數(shù)據(jù)存儲在"datasources"中,它就像 RDBMS 中的 table。每一個(gè) datasources 通過時(shí)間分區(qū),或通過其他屬性進(jìn)行分區(qū)。每一個(gè)時(shí)間范圍稱之為"chunk"(比如,一天一個(gè),如果你的 datasource 使用 day 分區(qū))。在 chunk 中,數(shù)據(jù)被分區(qū)進(jìn)一個(gè)或多個(gè)"segments"中。每一個(gè) segment 是一個(gè)單獨(dú)的文件,通常包含數(shù)百萬行數(shù)據(jù)。一旦 segment 被存儲進(jìn) chunks,其組織方式將如以下時(shí)間線所示:

Apache中Druid多進(jìn)程架構(gòu)介紹

一個(gè) datasource 也許只有一個(gè),也可能有數(shù)十萬甚至上百萬個(gè) segment。每個(gè) segment 生命周期開始于 MiddleManager 創(chuàng)建時(shí),剛被創(chuàng)建時(shí),segment 是可變和未提交的。segment 構(gòu)建過程包含以下幾步,旨在生成結(jié)構(gòu)緊湊并支持快速查詢的數(shù)據(jù)文件。

  • 轉(zhuǎn)換成列格式
  • 使用 bitmap 創(chuàng)建索引
  • 使用各種算法壓縮數(shù)據(jù)
    • 為 String 列做字典編碼,用最小化 id 存儲
    • 對 bitmap 索引做 bitmap 壓縮
    • 對所有列做類型感知壓縮

segment 定時(shí)提交和發(fā)布。此時(shí),數(shù)據(jù)被寫入 Deep Storage,并且再不可變,并從 MiddleManagers 進(jìn)程遷移至 Historical 進(jìn)程中。一個(gè)關(guān)于 segment 的 entry 將寫入 metadata storage。這個(gè) entry 是關(guān)于 segment 的元數(shù)據(jù)的自描述信息,包含如 segment 的數(shù)據(jù)模式,大小,Deep Storage 地址等信息。這些信息讓 Coordinator 知道集群中哪些數(shù)據(jù)是可用的。

索引和移交(Indexing and handoff)

indexing 是每個(gè) segment 創(chuàng)建的機(jī)制。handoff 是數(shù)據(jù)被發(fā)布并開始可以被 Historical 進(jìn)程處理的機(jī)制。這機(jī)制在 indexing 側(cè)的工作順序如下:

  1. 啟動(dòng)一個(gè) indexing task 并構(gòu)建一個(gè)新的 segment。在構(gòu)建之前必須先確定其標(biāo)識。對于一個(gè)追加任務(wù)(如 kafka 任務(wù),或 append 模式任務(wù))可以調(diào)用 Overlord 的"allocate"API 來將一個(gè)潛在的新分區(qū)加入到一個(gè)已經(jīng)存在的 segment 中。對于一個(gè)覆寫任務(wù)(如 Hadoop 任務(wù),或非 append 模式 index 任務(wù)) 將為 interval 創(chuàng)建新版本號和新 segment。
  2. 如果 indexing 任務(wù)是實(shí)時(shí)任務(wù)(如 Kafka 任務(wù)),此時(shí) segment 可以立即被查詢。數(shù)據(jù)是可用的,但還是未發(fā)布狀態(tài)。
  3. 當(dāng) indexing 任務(wù)完成讀取 segment 數(shù)據(jù)時(shí),它將數(shù)據(jù)推送到 Deep Storage 上,并通過向 metadata store 寫一個(gè)記錄來發(fā)布數(shù)據(jù)。
  4. 如果 indexing 任務(wù)是實(shí)時(shí)任務(wù),此時(shí),它將等待 Historical 進(jìn)程加載這個(gè) segment。如果 indexing 任務(wù)不是實(shí)時(shí)任務(wù),就立即退出。

這機(jī)制在 Coordinator/Historical 側(cè)的工作如下:

  1. Coordinator 定期從 metadata storage 拉取已經(jīng)發(fā)布的 segments(默認(rèn),每分鐘執(zhí)行)。
  2. 當(dāng) Coordinate 發(fā)現(xiàn)已發(fā)布但不可用的 segment 時(shí),它將選擇一個(gè) Historical 進(jìn)程去加載 segment,并指示 Historical 該做什么。
  3. Historical 加載 segment 并為其提供服務(wù)。
  4. 此時(shí),如果 indexing 任務(wù)還在等待數(shù)據(jù)移交,就可以退出。

數(shù)據(jù)寫入(indexing)和移交(handoff):

Apache中Druid多進(jìn)程架構(gòu)介紹

段標(biāo)識(Segment identifiers)

Segment 標(biāo)識由下面四部分組成:

  • Datasource 名稱。
  • 時(shí)間間隔(segment 包含的時(shí)間間隔,對應(yīng)數(shù)據(jù)攝入時(shí)segmentGranularity指定參數(shù))。
  • 版本號(通常是 ISO8601 時(shí)間戳,對應(yīng) segment 首次生成時(shí)的時(shí)間)。
  • 分區(qū)號(整數(shù),在 datasource+interval+version 中唯一,不一定是連續(xù)的)。

例如,這是 datasource 為clarity-cloud0,時(shí)間段為2018-05-21T16:00:00.000Z/2018-05-21T17:00:00.000Z,版本號為2018-05-21T15:56:09.909Z,分區(qū)號為 1 的標(biāo)識符:

clarity-cloud0_2018-05-21T16:00:00.000Z_2018-05-21T17:00:00.000Z_2018-05-21T15:56:09.909Z_1

分區(qū)號為 0(塊中的第一個(gè)分區(qū))的 segment 省略了分區(qū)號,如以下示例所示,它是與前一個(gè)分區(qū)在同一時(shí)間塊中的 segment,但分區(qū)號為 0 而不是 1:

clarity-cloud0_2018-05-21T16:00:00.000Z_2018-05-21T17:00:00.000Z_2018-05-21T15:56:09.909Z

段版本控制(segment versioning)

你可能想知道上一節(jié)中描述的“版本號”是什么。

Druid 支持批處理模式覆寫。在 Driud 中,如果你要做的只是追加數(shù)據(jù),那么每個(gè)時(shí)間塊只有一個(gè)版本。但是,當(dāng)你覆蓋數(shù)據(jù)時(shí),在幕后發(fā)生的事情是使用相同的數(shù)據(jù)源,相同的時(shí)間間隔,但版本號更高的方式創(chuàng)建了一組新的 segment。這向 Druid 系統(tǒng)的其余部分發(fā)出信號,表明應(yīng)從群集中刪除較舊的版本,而應(yīng)使用新版本替換它。

對于用戶而言,切換似乎是瞬間發(fā)生的,因?yàn)?Druid 通過先加載新數(shù)據(jù)(但不允許對其進(jìn)行查詢)來處理此問題,然后在所有新數(shù)據(jù)加載完畢后,立即將新查詢切換到新 segment。然后,它在幾分鐘后刪除舊 segment。

段(segment)生命周期

每個(gè) segment 的生命周期都涉及以下三個(gè)主要領(lǐng)域:

  1. 元數(shù)據(jù)存儲區(qū):一旦構(gòu)建完 segment,就將 segment 元數(shù)據(jù)(小的 JSON 數(shù)據(jù),通常不超過幾個(gè) KB)存儲在 元數(shù)據(jù)存儲區(qū)中。將 segmnet 的記錄插入元數(shù)據(jù)存儲的操作稱為發(fā)布。然后將元數(shù)據(jù)中的use布爾值設(shè)置成可用。由實(shí)時(shí)任務(wù)創(chuàng)建的 segment 將在發(fā)布之前可用,因?yàn)樗鼈儍H在 segment 完成時(shí)才發(fā)布,并且不接受任何其他數(shù)據(jù)。
  2. 深度存儲:segment 數(shù)據(jù)構(gòu)建完成后,并在將元數(shù)據(jù)發(fā)布到元數(shù)據(jù)存儲之前,立即將 segment 數(shù)據(jù)文件推送到深度存儲。
  3. 查詢的可用性:segment 可用于在某些 Druid 數(shù)據(jù)服務(wù)器上進(jìn)行查詢,例如實(shí)時(shí)任務(wù)或Historical進(jìn)程。

你可以使用 Druid SQL sys.segments表檢查當(dāng)前 segment 的狀態(tài) 。它包括以下標(biāo)志:

  • is_published:如果 segment 元數(shù)據(jù)已發(fā)布到存儲的元數(shù)據(jù)中,used則為 true,此值也為 true。
  • is_available:如果該 segment 當(dāng)前可用于實(shí)時(shí)任務(wù)或Historical查詢,則為 True。
  • is_realtime:如果 segment 在實(shí)時(shí)任務(wù)上可用,則為 true 。對于使用實(shí)時(shí)寫入的數(shù)據(jù)源,通常會(huì)先設(shè)置成true,然后隨著 segment 的發(fā)布和移交而變成false。
  • is_overshadowed:如果該 segment 已發(fā)布(used設(shè)置為 true)并且被其他一些已發(fā)布的 segment 完全覆蓋,則為 true。通常,這是一個(gè)過渡狀態(tài),處于此狀態(tài)的 segment 很快就會(huì)將其used標(biāo)志自動(dòng)設(shè)置為 false。

查詢處理

查詢首先進(jìn)入Broker進(jìn)程,Broker將得出哪些 segment 具有與該查詢有關(guān)的數(shù)據(jù)(segment 列表始終按時(shí)間規(guī)劃,也可以根據(jù)其他屬性來規(guī)劃,這取決于數(shù)據(jù)源的分區(qū)方式),然后,Broker將確定哪些 Historical 和 MiddleManager 正在為這些 segment 提供服務(wù),并將重寫的子查詢發(fā)送給每個(gè)進(jìn)程。Historical / MiddleManager 進(jìn)程將接受查詢,對其進(jìn)行處理并返回結(jié)果。Broker接收結(jié)果并將它們合并在一起以得到最終答案,并將其返回給客戶端。

Broker會(huì)分析每個(gè)請求,優(yōu)化查詢,盡可能的減少每個(gè)查詢必須掃描的數(shù)據(jù)量。相比于 Broker 過濾器做的優(yōu)化,每個(gè) segment 內(nèi)的索引結(jié)構(gòu)允許 Druid 在查看任何數(shù)據(jù)行之前先找出哪些行(如果有)與過濾器集匹配。一旦 Druid 知道哪些行與特定查詢匹配,它就只會(huì)訪問該查詢所需的特定列。在這些列中,Druid 可以在行與行之間跳過,從而避免讀取與查詢過濾器不匹配的數(shù)據(jù)。

因此,Druid 使用三種不同的技術(shù)來優(yōu)化查詢性能:

  1. 檢索每個(gè)查詢需訪問的 segment。

  2. 在每個(gè) segment 中,使用索引來標(biāo)識查詢的行。

  3. 在每個(gè) segment 中,僅讀取與特定查詢相關(guān)的行和列。

關(guān)于Apache中Druid多進(jìn)程架構(gòu)就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學(xué)到更多知識。如果喜歡這篇文章,不如把它分享出去讓更多的人看到。

文章題目:Apache中Druid多進(jìn)程架構(gòu)介紹
標(biāo)題來源:http://jinyejixie.com/article32/jjhssc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供自適應(yīng)網(wǎng)站品牌網(wǎng)站制作、電子商務(wù)、網(wǎng)站設(shè)計(jì)、云服務(wù)器網(wǎng)站建設(shè)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

小程序開發(fā)
蕉岭县| 和政县| 辽中县| 徐汇区| 张家川| 太康县| 息烽县| 马公市| 南郑县| 靖远县| 星座| 黄大仙区| 宁武县| 元江| 青海省| 织金县| 天峨县| 长垣县| 洛宁县| 五大连池市| 汪清县| 余庆县| 定远县| 屏山县| 武平县| 张家川| 星子县| 碌曲县| 奉化市| 万源市| 共和县| 正定县| 黄浦区| 莒南县| 花垣县| 墨竹工卡县| 镶黄旗| 青浦区| 霍林郭勒市| 唐河县| 无为县|