ES_預處理

1. 預處理的核心概念:什么是 Ingest Pipeline?

想象一下數據進入 Elasticsearch 的旅程。原始數據(Raw Data)往往并不完美:格式可能混亂,字段可能缺失,或者需要被豐富和轉換后才能發揮最大的價值。預處理就是在數據被索引(Indexed)到最終的數據存儲位置之前,對其進行清洗、轉換、豐富的一個中間加工環節。

這個加工環節在 Elasticsearch 中被稱為 Ingest Pipeline(攝取管道)。管道由一系列稱為 Processor(處理器) 的步驟組成,每個處理器執行一個特定的操作。數據像水一樣流經這個管道,被一個個處理器依次處理,最終變成我們想要的樣子存入 Elasticsearch。

架構位置:
在傳統的 ETL(Extract-Transform-Load)流程中,Transform 通常由外部工具(如 Logstash)完成。而 Ingest Pipeline 將 T 的環節下沉并內嵌到了 Elasticsearch 內部,由 Ingest Node 節點負責執行。

這樣做的主要優勢:

  1. 簡化架構:減少了對 Logstash 等外部處理組件的強依賴,降低了系統復雜度和維護成本。
  2. 高性能:處理過程在 ES 集群內部完成,避免了不必要的網絡傳輸開銷。
  3. 靈活性:可以動態創建、修改和復用管道,適應多變的數據處理需求。
  4. 原子性:預處理和索引操作是一個原子過程,保證一致性。

2. 核心組件:Processor(處理器)詳解

處理器是管道的肌肉和骨骼。Elasticsearch 提供了豐富的內置處理器,以下是一些最常用和強大的:

  • grok文本解析之王。使用基于正則表達式的模式將非結構化的文本解析成結構化的字段。常用于解析日志文件(如 Nginx、Apache 日志)。
  • date:解析日期字段,并將其轉換為標準的 ISO8601 時間戳,這對于基于時間序列的查詢和可視化至關重要。
  • dissect:另一種文本解析工具,使用分隔符模式,比 grok 性能更高,但靈活性稍差。
  • remove / rename:刪除不需要的字段或為字段重命名,保持數據整潔。
  • set / append:設置字段的值,或向數組字段追加值。
  • convert:改變字段的數據類型,如將字符串 "123" 轉換為整數 123
  • enrich數據豐富神器。允許你根據當前文檔的內容,去另一個索引中查詢匹配的數據,并將其內容合并到當前文檔中(例如,根據 IP 字段查詢 GeoIP 數據庫添加地理位置信息)。
  • script萬能處理器。當內置處理器無法滿足復雜需求時,可以使用 Painless 腳本編寫自定義邏輯,功能極其強大。
  • fail:在滿足特定條件時讓處理過程失敗,便于調試和錯誤處理。
  • foreach:對數組類型的字段中的每個元素執行相同的處理器操作。

3. 實戰實例:解析 Nginx 訪問日志

讓我們通過一個完整的、真實的例子來將上述概念串聯起來。

場景:我們需要將如下格式的 Nginx 訪問日志導入 Elasticsearch,并進行搜索和可視化。
raw_log 字段原始數據:

192.168.1.100 - - [30/Apr/2024:10:30:01 +0800] "GET /api/v1/products?page=2 HTTP/1.1" 200 1532 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64)"

目標:從中提取出客戶端IP、時間戳、HTTP方法、請求路徑、HTTP狀態碼、響應體大小等結構化字段。

步驟一:設計并創建 Ingest Pipeline

我們創建一個名為 nginx_log_processing 的管道。

PUT _ingest/pipeline/nginx_log_processing
{"description": "Parse and transform Nginx access logs","processors": [// 1. 使用 Grok 進行核心解析{"grok": {"field": "message", // 假設原始日志在 'message' 字段中"patterns": ["%{IP:client.ip} - - \\[%{HTTPDATE:timestamp}\\] \"%{WORD:http.method} %{URIPATHPARAM:http.request.path}(?:\\?%{URIPARAM:http.request.params})? HTTP/%{NUMBER:http.version}\" %{NUMBER:http.response.status_code:long} %{NUMBER:http.response.body.bytes:long}( \"%{DATA:http.referer}\")?( \"%{DATA:user.agent}\")?"],"ignore_missing": true,"on_failure": [{"set": {"field": "error","value": "{{ _ingest.on_failure_message }}"}}]}},// 2. 轉換時間戳{"date": {"field": "timestamp","formats": ["dd/MMM/yyyy:HH:mm:ss Z"],"timezone": "Asia/Shanghai","target_field": "@timestamp" // 轉換后放入標準的時間戳字段}},// 3. 移除臨時字段{"remove": {"field": ["timestamp", "message"],"ignore_missing": true}},// 4. (可選) 根據 IP 豐富地理信息 - 這里需要先有配置好的enrich policy// {//   "enrich": {//     "policy_name": "ip_geo_policy",//     "field": "client.ip",//     "target_field": "client.geo",//     "ignore_missing": true//   }// }]
}

架構師解讀

  • grok 處理器是這里的核心。我們使用預定義的模式(如 %{IP:client.ip})將文本匹配并提取到命名字段中。patterns 數組允許定義多個模式以備選。on_failure 子句是一個很好的錯誤處理實踐,它會在解析失敗時將錯誤信息記錄到一個新字段,而不是讓整個文檔索引失敗。
  • date 處理器將解析后的、人類可讀的 timestamp 轉換為 Elasticsearch 內部優化的 @timestamp 字段,這是管理時序數據的最佳實踐。
  • remove 處理器用于清理中間產物,保持文檔干凈,節省存儲空間。
  • enrich 處理器被注釋掉了,但它展示了如何實現更高級的數據豐富。你需要先創建一個 Enrich Policy,指向一個包含 IP 和地理位置映射的索引,才能啟用它。
步驟二:使用 Pipeline 索引數據

現在,當我們索引文檔時,只需在請求中指定 pipeline 參數即可。

PUT my-nginx-logs-2024.04.30/_doc/1?pipeline=nginx_log_processing
{"message": "192.168.1.100 - - [30/Apr/2024:10:30:01 +0800] \"GET /api/v1/products?page=2 HTTP/1.1\" 200 1532 \"-\" \"Mozilla/5.0 (Windows NT 10.0; Win64; x64)\""
}

Elasticsearch 在索引這個文檔前,會先將其通過 nginx_log_processing 管道進行處理。

步驟三:查看處理結果

索引成功后,查詢這條數據,你會看到最終存儲的文檔是結構化的:

{"client": {"ip": "192.168.1.100"},"@timestamp": "2024-04-30T02:30:01.000Z","http": {"method": "GET","request": {"path": "/api/v1/products"},"response": {"status_code": 200,"body_bytes": 1532},"version": "1.1"},"user_agent": {"original": "Mozilla/5.0 (Windows NT 10.0; Win64; x64)"}
}

原始雜亂的日志消息變成了一個完美的、嵌套結構的 JSON 文檔,非常適合進行聚合、篩選和可視化分析。


4. 架構建議與最佳實踐

  1. 規劃與測試:在投入生產前,使用 Simulate Pipeline API 對樣例數據進行測試和調試。這是避免線上問題的最重要工具。

    POST _ingest/pipeline/_simulate
    {"pipeline": { ... }, // 你的pipeline定義"docs": [ ... ]      // 你的樣例文檔
    }
    
  2. 性能考量

    • Ingest Node 角色:在生產集群中,最好部署專用的 Ingest Node,將其與 Master/Data Node 角色分離,避免資源競爭。
    • 處理器順序:將最可能過濾掉數據的處理器(如drop)或計算量小的處理器放在前面,減少后續不必要的處理開銷。
    • grok 性能grok 是 CPU 密集型操作,模式復雜度過高或數據量巨大時可能成為瓶頸。考慮使用 dissect 或預處理在數據源端完成。
  3. 錯誤處理:始終在管道中定義 on_failure 策略。可以將處理失敗的文檔路由到另一個索引(使用 set 處理器修改 _index),以便后續檢查和重新處理,而不是直接丟棄。

  4. 復用與維護:將通用的處理邏輯(如基礎的時間戳處理、通用字段清理)抽象成獨立的管道,然后使用 pipeline 處理器在管道中調用其他管道,實現模塊化和復用。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/919969.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/919969.shtml
英文地址,請注明出處:http://en.pswp.cn/news/919969.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

我從零開始學習C語言(15)- 基本類型 PART2

開始學習第七章其余部分。7.3.4 轉義序列正如在前面示例中見到的那樣,字符常量通常是用單引號括起來的單個字符。然而,一些特殊符號(比如換行符)是無法采用上述方式書寫的,因為它們不可見(非打印字符&#…

K8S的部署與常用管理

一、k8s的部署 1.1.集群環境初始化 1.1.1.所有主機禁用swap [rootk8s- ~]# systemctl mask dev-nvme0n1p3.swap [rootk8s- ~]# swapoff -a [rootk8s- ~]# systemctl status dev-nvme0n1p3.swap [rootk8s- ~]# vim /etc/fstab 內容: 注釋swap 1.1.2.安裝k8s部署工…

2025年機械工程與自動化技術國際會議(ICMEAT 2025)

2025年機械工程與自動化技術國際會議(ICMEAT 2025) 2025 International Conference on Mechanical Engineering and Automation Technology一、大會信息會議簡稱:ICMEAT 2025 大會地點:中國杭州 審稿通知:投稿后2-3日內…

高數 不定積分(4-3):分部積分法

文章目錄寫在前面分部積分法😕 一個小問題? 分部積分法是怎么來的?🌰 幾個小例子? 最終總結!后話寫在前面 文章傳送門:高數 不定積分(4-2):換元積分法 今天再更一篇:) 上篇文章&…

Chrome/360 瀏覽器 WebUI 資源底層機制解析:共享資源與專屬資源的奧秘

在 Chromium 和 360 瀏覽器源碼中,我們會發現 WebUI 頁面不僅有 C 邏輯處理(如 WebUIMessageHandler),還伴隨著大量 HTML、CSS 和 JS 文件。尤其是 src/ui/webui/resources 和 src/chrome/browser/360/webui 這兩個目錄&#xff0…

基于springboot的高校后勤保修服務系統/基于android的高校后勤保修服務系統app

基于springboot的高校后勤保修服務系統/基于android的高校后勤保修服務系統app

Qt QML 用Q_PROPERTY快捷訪問c++屬性

在之前我寫過如何調用函數,當時的屬性都是手搓的,也就是自己寫成員變量、變化信號和讀寫函數,但其實有一個很便捷的方法,即使用Q_PROPERTY,下面給出標準結構:Q_PROPERTY(數據類型 變量名 READ 變量名 WRITE…

ubuntu中網卡的 IP 及網關配置設置為永久生效

要將 Ubuntu 中 ens33 和 ens36 網卡的 IP 及網關配置設置為永久生效(重啟后不丟失),需通過 netplan 配置并禁用 cloud-init 對網絡的干擾(避免重啟后配置被覆蓋),具體步驟如下:一、最終的永久生…

不再讓Windows更新!Edge游戲助手卸載及關閉自動更新

文章目錄Windows系統更新問題方法一:通過注冊表手動設置1. 打開注冊表編輯器2. 定位到目標路徑3. 創建新的DWORD值4. 修改數值方法二:命令行設置1. 打開命令提示符2. 輸入命令驗證設置是否生效恢復更新Edge關閉游戲助手Edge關閉后臺運行Edge關閉自動更新…

css3之flex布局

flex布局要牢記的兩個知識點: 開啟了flex布局的元素叫flex containerflex container里面的直接子元素叫flex items 這兩點要記牢,設置屬性的時候才不會搞混這個是flex布局的整體圖 一、flex container上的屬性 1.flex-direction 修改主軸方向的屬性&…

vscode 搭建C/C++開發環境搭建(linux)

1.編譯器/調試器安裝首先,需要安裝編譯器(GCC/G)和調試器(GDB),用于編譯和調試代碼。1.打開終端(Ctrl Alt T)2.更新軟件包獲取新版本信息sudo apt update3.安裝build-essential包,它包含gcc,g等必要庫sudo apt install…

vue-pure-admin頁面引入和功能添加流程解析

vue-pure-admin (opens new window)是一款開源完全免費且開箱即用的中后臺管理系統模版。完全采用 ECMAScript 模塊(ESM)規范來編寫和組織代碼,使用了最新的 Vue3、Vite、Element-Plus、TypeScript、Pinia、Tailwindcss 等主流技術開發 以下是…

vlc-android: 編譯自己的libvlc

概述 VLC 媒體播放器作為一款由志愿者開發團隊精心維護的自由、開源且跨平臺的多媒體播放器,能輕松駕馭絕大多數多媒體文件,無論是本地磁盤中的視頻、音頻,還是來自網絡的流媒體協議. VLC for Android 支持網絡串流,無論是基于 H…

并聯諧振與串聯諧振

在LC電路中,感抗和容抗相等時對應的頻率值稱為諧振頻率,在接收廣播電視信號或無線通信信號時,使接收電路的頻率與所選擇的發射的信號頻率相同就叫做調諧。并聯諧振LC并聯諧振電路是指將電感器和電容器并聯形成,如圖所示。在并聯諧…

打印機怎么連接電腦?打印機驅動?【圖文詳解】USB連接打印機?wifi連接打印機?

一、問題背景 在日常辦公與生活里,把電腦和打印機連接起來,是實現文檔、照片等打印的基礎操作。但很多人初次嘗試時,會因不熟悉流程而感到無從下手。 無論是辦公場景下急需打印重要文件,還是日常生活中想要打印照片留念&#xff0…

CVPR 2025 | 醫學影像加速進化:深度學習×多模態,精準診斷再升級

關注gongzhonghao【CVPR頂會精選】今天聊一個醫學圖像領域的前沿探索:結合空間感知卷積、擴散模型與視覺語言模型,從圖像配準到合成分割,再到跨模態理解,打造了一個更加智能、魯棒且可泛化的醫學影像工具鏈。無論是SACB-Net帶來的…

[每周一更]-(第157期):深入理解Go語言的垃圾回收機制:調優與監控

Go語言以其簡潔的語法和強大的并發能力而聞名,而它的垃圾回收(GC)機制則是支撐其高性能的關鍵組件之一。本文將深入探討Go語言的垃圾回收原理,并介紹如何對其進行調優與監控,以提升應用程序的性能。 Go語言垃圾回收機制…

Java 學習筆記(基礎篇9)

1. 綜合練習題目 1 :金額轉換為中文大寫格式請編寫一個 Java 程序,實現將數字金額轉換為中文大寫格式(帶單位)的功能,具體要求如下:(1) 程序接收用戶輸入的一個整數金額(范圍:0-9999…

云原生俱樂部-k8s知識點歸納(5)

寫到這里,k8s的內容已經到一半了,雖然后面的內容我覺得更加玄學一點。控制器真的是個神奇的東西,雖然后面的CRD會帶著大家一起做一個控制器,但是還是覺得很奇妙。控制器大概就是k8s中的精華了,通過控制器去監聽k8s中ap…

C++復習2

C繼承 繼承的概念 繼承(inheritance)機制是面向對象程序設計使代碼可以復用的重要的手段,它允許程序員在保持原有類特性的基礎上進行擴展,增加功能,這樣產生新的類,稱為派生類。 繼承呈現了面向對象程序設計…