全面、可落地的Elasticsearch 数据管道(Ingest Pipeline) 详解

Elasticsearch 数据管道(Ingest Pipeline) 是实现 数据预处理、清洗、转换 的核心功能。它允许你在文档写入 Lucene 之前,对数据进行一系列处理,无需依赖外部系统。

结合 Logstash,可构建完整的 ETL(Extract-Transform-Load)流程,适用于日志分析、数据集成、数据标准化等场景。

本文将为你提供一份 全面、可落地的 Ingest Pipeline 详解,涵盖内置处理器、Grok 解析、与 Logstash 集成等核心内容。


一、什么是 Ingest Pipeline?

Ingest Pipeline 是 Elasticsearch 内置的轻量级数据处理引擎,由多个 处理器(Processor) 组成,按顺序执行。

  • 执行时机:文档写入前(indexcreatebulk 操作);
  • 执行节点:Ingest Node(可与 Data Node 共存);
  • 优势:无需外部处理,低延迟,与索引操作原子化。

✅ 适用于:字段重命名、类型转换、日志解析、敏感字段脱敏等。


二、Ingest Pipeline 核心概念

1. 基本结构

{
  "description": "Parse web server logs",
  "processors": [
    { "grok": { ... } },
    { "date": { ... } },
    { "remove": { ... } }
  ]
}

2. 处理器(Processor)类型

处理器用途
grok正则解析日志(如 Nginx、Syslog)
date解析时间字符串为 date 类型
rename字段重命名
convert类型转换(string → integer)
remove删除字段
set设置字段值
script执行 Painless 脚本
append追加数组元素
split / join字符串分割与合并

三、常用处理器详解

1. grok:日志解析(最常用)

用于解析非结构化日志,如 Nginx 访问日志。

示例:Nginx 日志
192.168.1.1 - - [01/Jun/2024:10:00:00 +0800] "GET /api/user HTTP/1.1" 200 1024 "Mozilla/5.0" "127.0.0.1"
Pipeline 配置
PUT /_ingest/pipeline/nginx-access-pipeline
{
  "description": "Parse Nginx access logs",
  "processors": [
    {
      "grok": {
        "field": "message",
        "patterns": [
          "%{IPORHOST:clientip} %{USER:ident} %{USER:auth} \\[%{HTTPDATE:timestamp}\\] \"%{WORD:method} %{URIPATHPARAM:request} HTTP/%{NUMBER:httpversion}\" %{NUMBER:response:int} %{NUMBER:bytes:int} \"%{DATA:agent}\" \"%{IPORHOST:forwarded_for}\""
        ]
      }
    },
    {
      "date": {
        "field": "timestamp",
        "formats": ["dd/MMM/yyyy:HH:mm:ss Z"],
        "target_field": "@timestamp"
      }
    },
    {
      "rename": {
        "field": "message",
        "target_field": "raw_message"
      }
    },
    {
      "remove": {
        "field": "timestamp"
      }
    }
  ]
}

patterns 可使用内置变量(如 %{IP}%{WORD})。


2. date:时间解析

将字符串转换为 date 类型,用于搜索和聚合。

{
  "date": {
    "field": "log_timestamp",
    "formats": ["yyyy-MM-dd HH:mm:ss", "ISO8601"],
    "target_field": "@timestamp"
  }
}

3. rename:字段重命名

{
  "rename": {
    "field": "old_field_name",
    "target_field": "new_field_name"
  }
}

4. convert:类型转换

{
  "convert": {
    "field": "status_code",
    "type": "integer"
  }
}

支持:integer, long, double, boolean, string


5. remove:删除字段

{
  "remove": {
    "field": ["temp_field", "debug_info"]
  }
}

6. script:Painless 脚本(高级)

执行自定义逻辑。

{
  "script": {
    "lang": "painless",
    "source": """
      ctx.level = ctx.status >= 500 ? 'error' : 
                 ctx.status >= 400 ? 'warn' : 'info';
    """
  }
}

⚠️ 脚本性能较低,慎用。


四、使用 Ingest Pipeline

1. 写入时指定 pipeline

PUT /logs-2024/_doc/1?pipeline=nginx-access-pipeline
{
  "message": "192.168.1.1 - - [01/Jun/2024:10:00:00 +0800] \"GET /api/user HTTP/1.1\" 200 1024"
}

2. 在索引模板中默认启用

PUT /_index_template/logs-template
{
  "index_patterns": ["logs-*"],
  "template": {
    "settings": {
      "index.default_pipeline": "nginx-access-pipeline"
    }
  }
}

所有匹配 logs-* 的索引自动使用该 pipeline。


五、结合 Logstash 实现复杂 ETL 流程

虽然 Ingest Pipeline 轻量高效,但 复杂 ETL(如多源聚合、窗口计算、流处理)仍需 Logstash

1. 架构设计

+------------------+     +---------------------+
|  日志源 (File, Kafka)  | --> | Logstash            |
+------------------+     +----------+----------+
                                    |
                                    v
                     +--------------------------+
                     | 复杂 ETL 处理             |
                     | - 多源 Join              |
                     | - 聚合统计               |
                     | - 外部 API 调用          |
                     +------------+-------------+
                                  |
                                  v
                     +--------------------------+
                     | Elasticsearch            |
                     | - 使用 Ingest Pipeline   |
                     |   做最后清洗             |
                     +--------------------------+

2. Logstash 配置示例(logstash.conf)

input {
  file {
    path => "/var/log/nginx/access.log"
    start_position => "beginning"
  }
}

filter {
  # 使用 Grok 解析
  grok {
    match => { "message" => "%{COMBINEDAPACHELOG}" }
  }

  # 时间解析
  date {
    match => [ "timestamp", "dd/MMM/yyyy:HH:mm:ss Z" ]
  }

  # 类型转换
  mutate {
    convert => { "response" => "integer" }
    rename => { "clientip" => "src_ip" }
  }

  # 条件处理
  if [response] >= 500 {
    mutate { add_tag => [ "error" ] }
  }

  # 调用外部服务(如 GeoIP)
  geoip {
    source => "src_ip"
  }
}

output {
  elasticsearch {
    hosts => ["http://es-node1:9200"]
    index => "logs-nginx-%{+YYYY.MM.dd}"
    pipeline => "final-cleanup-pipeline"  # 可选:再走一次 Ingest Pipeline
  }
}

3. Ingest Pipeline 与 Logstash 的分工建议

场景推荐方案
简单字段清洗✅ Ingest Pipeline
日志解析(Grok)✅ 两者皆可
多源数据 Join❌ Ingest → ✅ Logstash
流式聚合(每分钟统计)❌ Ingest → ✅ Logstash + Kafka
外部 API 调用(GeoIP)❌ Ingest → ✅ Logstash
高吞吐日志采集✅ Beats → Logstash → ES

六、性能与资源优化

1. Ingest Node 资源分配

  • 高 CPU:Grok、Script 处理密集;
  • 足够内存:避免 OOM;
  • 建议:专用 Ingest Node 或与 Data Node 分离。

2. Pipeline 性能监控

GET /_node/stats/ingest

返回每个 pipeline 的处理次数、失败数、处理时间。


七、最佳实践 checklist ✅

项目建议
简单清洗使用 Ingest Pipeline
复杂 ETL使用 Logstash
日志解析Grok + 预定义 pattern
时间字段使用 date 处理器
敏感字段使用 remove 脱敏
Pipeline 复用通过索引模板默认启用
监控监控 ingest 节点负载与失败率
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值