Elasticsearch 8.X Rollup 功能詳解及避坑指南

大資料技術前線發表於2023-03-27

來源:銘毅天下Elasticsearch

摘要:本文將詳細介紹 Elasticsearch Rollup 功能,包括其產生背景、應用場景、應用例項以及實戰中的注意事項。透過本文,你將對 Elasticsearch Rollup 功能有一個全面的瞭解,從而提高你的資料處理能力。

一、Elasticsearch Rollup 產生背景

1.1 認知前提

  1. Elasticsearch 是一個分散式的搜尋和分析引擎,能夠處理大量的資料並提供實時查詢功能。

  2. Elasticsearch 傳統的聚合操作都是實時聚合,就是執行聚合的那一刻,實時根據檢索+聚合語句進行聚合操作。

傳統的聚合,當文件資料量非常大時進行多重聚合、巢狀聚合的效能會受到很大影響。因為聚合操作需要搜尋整個索引,並處理大量資料,這會導致查詢變慢,甚至可能使 Elasticsearch 叢集崩潰。

1.2 那麼能不能離線聚合呢?

為了解決這個問題,Elasticsearch Rollup 提供了一種有效的方式來處理大規模資料。

Rollup 允許使用者在實時執行時間之外預先定義聚合任務,這些任務將執行後的聚合結果資料寫入到新建立的特定索引中。在這個新的索引中,資料已經被預先聚合,這使得查詢和分析操作更加快速和高效。

在早期的產品開發中,我們還真構思過離線非實時聚合功能,由於當時ES (5.X版本)尚未釋出 Rollup 功能,只能寫定時任務實現。

1.3 一句話小結

Elasticsearch Rollup是為了解決Elasticsearch在處理海量資料時效能和資源消耗的問題而產生的,Rollup 功能允許將原始資料聚合為更小的、摘要形式的資料,從而減少儲存空間和計算資源的消耗。Rollup 提供了不降低查詢速度的情況下處理海量資料的解決方案。

二、Elasticsearch Rollup 最早釋出版本

自 Elasticsearch 6.3 版本釋出以來,Rollup 已經成為 Elasticsearch 的核心功能之一。在隨後的版本中,Elasticsearch不斷增強和完善了 Rollup 的功能,如支援更多的聚合函式、更靈活的 Rollup 配置選項等。

Rollup 是一種輕量級的聚合工具,可以將原始資料聚合成摘要資料,並將其儲存在新的 Rollup 索引中。這個過程類似於資料倉儲的聚合操作,可以大大減少 Elasticsearch 在處理大量資料時的資源消耗,提高查詢速度和響應時間。

三、Elasticsearch Rollup 功能應用場景

Elasticsearch 的 rollup 功能可以將原始資料按照一定的規則進行聚合,生成預先計算的摘要資料(即 rollup 資料)。這種摘要資料可以用於各種場景,例如:

  • 場景1:大量歷史資料的儲存與查詢。

當資料量龐大且增長迅速時,透過 Rollup 功能可以降低儲存成本和查詢延遲。

  • 場景2:時間序列資料分析。

Rollup 功能特別適用於時間序列資料,可以將資料聚合成不同的時間粒度,方便進行各種時間範圍的分析。

  • 場景3:資料歸檔。

透過 Rollup 功能,可以將不再需要實時查詢的資料歸檔,從而降低儲存和計算資源的消耗。

在電商場景下,可以使用Rollup API來進行如下操作:

  • 電商場景1:統計銷售資料

電商網站可以使用Rollup API來聚合銷售資料,如訂單量、銷售額、商品銷售量等,以便於分析和報告。

  • 電商場景2:聚合使用者資料

透過Rollup API可以統計使用者行為資料,如使用者瀏覽商品數量、購買行為、退貨情況等,以便於進行使用者畫像、使用者行為分析等。

  • 電商場景3:聚合庫存資料

透過Rollup API可以聚合庫存資料,如庫存量、商品入庫量、出庫量等,以便於管理庫存、最佳化進銷存等。

  • 電商場景4:聚合搜尋資料

透過Rollup API可以聚合搜尋資料,如使用者搜尋關鍵字、搜尋次數等,以便於進行搜尋引擎最佳化、推薦演算法最佳化等。

四、Elasticsearch Rollup 應用舉例

4.1 步驟1:建立 Rollup 任務

PUT _rollup/job/ecommerce_rollup
{
  "index_pattern""kibana_sample_data_ecommerce",
  "rollup_index""kibana_sample_data_ecommerce_rollup",
  "cron""* */2 * * * ?",
  "page_size": 1000,
  "groups": {
    "date_histogram": {
      "field""order_date",
      "fixed_interval""1d",
      "delay""1m",
      "time_zone""UTC"
    },
    "terms": {
      "fields": [
        "products.product_name.keyword"
      ]
    }
  },
  "metrics": [
    {
      "field""taxless_total_price",
      "metrics": [
        "min",
        "max",
        "sum"
      ]
    },
    {
      "field""products.price",
      "metrics": [
        "sum"
      ]
    },
    {
      "field""products.quantity",
      "metrics": [
        "sum"
      ]
    }
  ]
}

以下是核心引數的簡明扼要解釋:

  • index_pattern:指定要對哪個原始資料索引進行彙總。
  • rollup_index:儲存彙總資料的新索引名稱。
  • cron:定義 Rollup 作業執行的時間表,本例中表示每兩小時執行一次。
  • page_size:定義每次處理的文件數量,用於控制記憶體佔用和批處理速度。
  • groups:定義聚合和分組設定。
  • date_histogram:基於時間欄位的固定間隔分組設定。
  • field:要進行時間分組的欄位。
  • fixed_interval:時間分組的固定間隔,本例中為 1 天。
  • delay:允許一定的延遲以處理潛在的延遲資料,本例中為 1 分鐘。
  • time_zone:時間欄位的時區。
  • terms:基於詞條的分組設定。
  • -fields:要進行詞條分組的欄位列表。
  • metrics:定義要計算的度量。
  • field:要進行度量計算的欄位。
  • metrics:應用於該欄位的聚合操作列表,如最小值(min)、最大值(max)和求和(sum)等。
Elasticsearch 8.X Rollup 功能詳解及避坑指南

建立完畢後,Kibana 呈現如下圖所示,我想說明的是,建立了不代表啟動了,所以上面的 status 是 stopped 狀態。

Elasticsearch 8.X Rollup 功能詳解及避坑指南

需要我們們手動啟動才可以。

4.2 啟動 Rollup job。

POST _rollup/job/ecommerce_rollup/_start
Elasticsearch 8.X Rollup 功能詳解及避坑指南
Elasticsearch 8.X Rollup 功能詳解及避坑指南

4.3 查詢 Rollup 檢索和聚合資料

GET kibana_sample_data_ecommerce_rollup/_search
{
  "size":0,
  "aggs": {
    "max_aggs": {
      "max": {
        "field""taxless_total_price.max.value"
      }
    },
    "sum_aggs":{
      "sum": {
        "field""products.price.sum.value"
      }
    }
  }
}

上述聚合的結果如下圖所示。

Elasticsearch 8.X Rollup 功能詳解及避坑指南

ps:關於聚合欄位的寫法,建議先query 查一下,我第一次寫的時候,還不大適應這麼長的“連環”欄位名

五、Elasticsearch rollup 常見API

常用的 Rollup API包括:

  • job 層面

PUT /_rollup/job/<job_id>:建立一個 rollup 作業
GET /_rollup/job:列出所有 rollup 作業
GET /_rollup/job/<job_id>:獲取 rollup 作業詳情
POST /_rollup/job/<job_id>/_start:啟動一個 rollup 作業
POST /_rollup/job/<job_id>/_stop:停止一個 rollup 作業
DELETE /_rollup/job/<job_id>:刪除一個 rollup 作業

  • data 層面
GET /_rollup/data/<index_pattern>/_rollup_caps:獲取 Rollup 功能資訊
GET /<index_name>/_rollup/data/:獲取 Rollup 索引功能資訊
Elasticsearch 8.X Rollup 功能詳解及避坑指南

index_name 層面

GET /<index_name>/_rollup_search:搜尋 rollup 資料

六、Elasticsearch rollup 實戰避坑

    • 避免過度聚合。

在建立 Rollup 任務時,要確保聚合的粒度適中,以免丟失過多的原始資料資訊。選擇合適的聚合欄位和時間間隔,以滿足業務需求。

    • 留意資料延遲

Rollup 任務通常會配置一定的延遲時間,以防止正在寫入的資料被立即聚合。因此,在查詢 Rollup 資料時,請注意可能存在的資料延遲。

    • 指標型別相容性

在 Rollup 任務中,不同型別的指標(如 count、sum、avg、max、min 等)可以應用於相應的欄位。在查詢 Rollup 資料時,務必確保使用相容的指標型別。注意許可權控制。

    • 建立和管理 Rollup 任務需要特定的許可權

請確保您的使用者具有足夠的許可權來建立、修改、刪除和執行 Rollup 任務。

    • 監控 Rollup 任務。

建立 Rollup 任務後,需要定期監控其執行狀態,確保資料正常聚合。可以使用 Elasticsearch 監控功能來檢視任務的執行狀況。

七、總結

Elasticsearch Rollup 功能為大資料處理提供了有效的解決方案,降低了儲存和計算資源的消耗。

本文詳細介紹了 Rollup 功能的產生背景、應用場景、應用例項以及實戰中的注意事項。希望本文能幫助你更好地理解和使用 Elasticsearch Rollup 功能,為你的資料處理帶來更多便利。

ps:本文內容基於Elasticsearch 8.6 驗證,樣例資料來自Kibana自帶的sample資料。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70027827/viewspace-2941792/,如需轉載,請註明出處,否則將追究法律責任。

相關文章