Logstash中如何处理到ElasticSearch的数据映射

本文涉及的产品
检索分析服务 Elasticsearch 版,2核4GB开发者规格 1个月
日志服务 SLS,月写入数据量 50GB 1个月
云解析DNS,个人版 1个月
简介: Logstash作为一个数据处理管道,提供了丰富的插件,能够从不同数据源获取用户数据,进行处理后发送给各种各样的后台。这中间,最关键的就是要对数据的类型就行定义或映射。本文讨论的 ELK 版本为 5.5.1。

Logstash作为一个数据处理管道,提供了丰富的插件,能够从不同数据源获取用户数据,进行处理后发送给各种各样的后台。这中间,最关键的就是要对数据的类型就行定义或映射。

本文讨论的 ELK 版本为 5.5.1。

为什么要定义数据

Elastisearch不仅是一个强大的全文检索引擎,它还能够对一些数据类型进行实时的统计运算,相关的结果可以通过Kibana的图表展现出来。如果数据类型没有正确的定义,那么Elasticsearch就无法进行运算了,因此,虽然数据类型的定义需要花一点时间,但你会收到意想不到的效果。

JSON、字符串和数字

所有送往Elasticsearch的数据都要求是JSON格式,Logstash所做的就是如何将你的数据转换为JSON格式。ElasticSearch会帮我们自动的判断传入的数据类型,这么做当然极大的方便了用户,但也带来了一些问题。

Elastic中的一些数据类型: textkeyworddatelongdoublebooleanipobjectnestedgeo_point等。不同的类型有不同的用途,如果你需要全文检索,那应该使用text类型,如果你需要统计汇总那应该选择数据或者keyword类型。感谢动态映射 Dynamic Mapping 的存在,在向ES送数的时候我们不需要事先定义映射关系,ES会对新增的字段自动进行映射。但是你比Elasticsearch更加熟悉你的数据,因此可能需要自己进行显示定义 Explicit Mapping 映射关系。例如IP字段,默认是解析成字符串,如果映射为IP类型,我们就可以在后续的查询中按照IP段进行查询,对工作是很有帮助的。我们可以在创建索引时定义,也可以在索引创建后定义映射关系。

对于已经存在的数据,无法更新映射关系。更新映射关系意味着我们必须重建索引。

先来看下面这个JSON文档。

{
  "@timestamp": "2017-08-11T20:11:45.000Z",
  "@version": "1",
  "count": 2048,
  "average": 1523.33,
  "host": "elasticsearch.com"
}

这里有五个字段:@timestamp@versioncountaveragehost。其中 @timestamp 和 host 是字符串,count、average 是数字,@version比较特殊,它的值是数字,但是因为放在双引号中,所以作为字符串来对待。

尝试把数据送入到 Elasticsearch 中,首先创建一个测试的索引:

img_291ad7af5da41fa3aa04ecec0b7c927b.png

将数据存入索引

img_bdda9b202a725aada9a2a3e0b64f681c.png

查看数据映射的情况

img_8af485ced16c8c54ea22c0c282b1559e.png

根据结果可知,在没有明确定义数据类型的情况下,Elasticsearch会自动判断数据的类型,因此 @timestamp、@version、host都被映射为 text ,average、count 被映射为数字。

在Logstash中定义数据类型映射

Logstash提供了 grok 和 mutate 两个插件来进行数值数据的转换。

grok

grok 目前是解析非结构化的日志数据最好的插件。特别适合处理syslog、apache或其他web服务器、mysql等为了阅读而输出的信息类日志。

grok 的基本用法如下:%{SYNTAX:SEMANTIC},SYNTAX是grok提供的样式Pattern的名称,grok提供了120多种Pattern,SEMANTIC是你给匹配内容的名称(标志符)。因为grok实际上是正则匹配,因此任何输出都默认转换为字符类型,如果你需要数据类型的转换,则使用下面这种格式

%{NUMBER:SEMANTIC:int}

目前,类型转换仅支持 int 和 float 两种类型。

如果将带小数的数字转换为 int 类型,会将小数后的数字丢弃。

mutate

mutate 为用户提供了处理Logstash event数据的多种手段。允许我们移除字段、重命名字段、替换字段、修改字段等操作。

filter {
  mutate {
    convert => { "num" => "integer" }
  }
}

使用模版进行字段映射

Elasticsearch中通过模板来存放索引字段的映射关系,logstash可以在配置文件中指定模板文件来实现自定义映射关系。

查询 Elasticsearch 中的模板,系统自带了 logstash-* 的模板。

img_aebc1d3cd108cc5b4de264698c3ef07d.png

我们用实际的例子来看一下映射和模板是如何起作用的。

1、首先创建一个 logstash 配置文件,通过 filebeat 读取 combined 格式的 apache 访问日志。

配置文件名为 filebeat.conf 位于 logstash 文件夹内。filebeat的配置比较简单,可以参考我的上一篇文章 Filebeat+Logstash+ElasticSearch+Kibana搭建Apache访问日志解析平台

input {
  beats {
    port => "5043"
  }
}
filter {
  grok {
    match => { "message" => "%{COMBINEDAPACHELOG}" }
  }
  date {
    match => [ "timestamp", "dd/MMM/yyyy:HH:mm:ss Z" ]
    target => ["datetime"]
  }
  geoip {
    source => "clientip"
  }
}
output {
  elasticsearch {
    hosts => "localhost:9200"
    index => "my_index"
    #template => "/data1/cloud/logstash-5.5.1/filebeat-template.json"
    #template_name => "my_index"
    #template_overwrite => true
  }
  stdout { codec => rubydebug }
}

第一次数据导入的时候,我们先不使用模板,看看 es 如何默认映射数据,启动elk环境,进行数据导入。

[maserati@iZ627x15h6pZ logstash-5.5.1]$ ../elasticsearch-5.5.1/bin/elasticsearch 
[maserati@iZ627x15h6pZ logstash-5.5.1]$ ./bin/logstash -f filebeat.conf 
[maserati@iZ627x15h6pZ filebeat-5.5.1-linux-x86_64]$ sudo ./filebeat -e -c filebeat.yml -d "publish"

数据导入完成后,看一下索引的情况

img_6c852d48c543f019b0daa35482ed7501.png

因为从log导入的数据,所以mapping中给映射规则起名为log,对应的是 document_type,可以看到clientip和 geoip.location 分别解析成了文本和数值。其他大部分内容都映射为 text 。这种不需要我们定义映射规则的处理方式非常方便,但有时候我们更需要精确的映射。

看一下ES映射模板,只有logstash命名的模板,因为名称不匹配,所以没有应用这里的映射规则。

img_cb51369aa12aa8fc812ca7f86ae0991b.png

这里可以注意到模板文件和索引中的映射关系稍有不同,没关系,我们把 my_index 的映射关系拷贝下来,存为 filebeat-template.json ,这里贴一下一个删减版的 模板文件。

{
  "template": "my_index",
  "order": 1,
  "settings": {
    "index.refresh_interval" : "5s"
  },
  "mappings": {
    "_default_": {
      "properties": {
        "clientip" : { "type":"ip" },
        "geoip": {
          "properties": {
            "location": { "type":"geo_point" }
          }
        }

      }
    }
  }
}

我们可以通过命令行收工把模板上传到 elasticsearch ,也可以通过 logstash 配置文件指定。

curl -XPUT http://localhost:9200/_template/my_index_template?pretty -d @filebeat-template.json

我的例子中,我们只需要把 filebeat.conf 中的注释打开即可。然后删除索引,我们对索引重建一下。

看一下索引,可以看到模板中定义的规则已经在里面了。

img_fcb1f88f972dc2e72d7d31517b9fed3a.png

看一下索引字段,看到 clientip 已经定义成 ip 类型了。

img_84252b8f7d7a5d1e2691ef8e71d6f076.png

同样,geoip.location映射成 geo_point 类型。

img_67273a0ab0970c2d1c11c1048dcbb1d0.png

这样我们就可以做访客地图了。

img_c59d02f1b42aa3a14674f1188ad68c47.png

这时,再看一下 template 的情况。

img_a20644d4293ffaf982d256f2f01fc309.png

可以看到,除了默认的模板,新增了一个我们定义的 my_index 模板。后续还可以对模板进行修改,但是注意只能增加或者删除,无法对已经映射的字段进行更新。

参考资料:
1、Using Logstash to help create an Elasticsearch mapping template
2、Using grok and mutate to type your data
3、Elasticsearch Mapping
4、Grok Filter Plugin
5、Mutate Filter Plugin
6、用logstash导入ES且自定义mapping时踩的坑

相关实践学习
使用阿里云Elasticsearch体验信息检索加速
通过创建登录阿里云Elasticsearch集群,使用DataWorks将MySQL数据同步至Elasticsearch,体验多条件检索效果,简单展示数据同步和信息检索加速的过程和操作。
ElasticSearch 入门精讲
ElasticSearch是一个开源的、基于Lucene的、分布式、高扩展、高实时的搜索与数据分析引擎。根据DB-Engines的排名显示,Elasticsearch是最受欢迎的企业搜索引擎,其次是Apache Solr(也是基于Lucene)。 ElasticSearch的实现原理主要分为以下几个步骤: 用户将数据提交到Elastic Search 数据库中 通过分词控制器去将对应的语句分词,将其权重和分词结果一并存入数据 当用户搜索数据时候,再根据权重将结果排名、打分 将返回结果呈现给用户 Elasticsearch可以用于搜索各种文档。它提供可扩展的搜索,具有接近实时的搜索,并支持多租户。
相关文章
|
19天前
|
存储 监控 数据挖掘
使用 Meltano 将数据从 Snowflake 导入到 Elasticsearch:开发者之旅
【6月更文挑战第9天】Meltano,一个开源数据集成框架,简化了从Snowflake到Elasticsearch的数据迁移。这个工具支持多种数据源,提供易于配置的界面。要开始,需安装Meltano并配置连接信息。一个简单的YAML示例展示了如何定义从Snowflake到Elasticsearch的迁移任务。Meltano自动执行迁移,同时提供监控和日志功能。借助Meltano,用户能高效集成数据,提升搜索和分析能力,适应不断增长的数据需求和挑战。
67 6
|
19小时前
|
索引
利用滚动索引来管理海量Elasticsearch数据
利用滚动索引来管理海量Elasticsearch数据
10 3
|
17天前
|
JSON DataWorks 关系型数据库
DataWorks操作报错合集之同步Elasticsearch数据报错:Cat response did not contain a JSON Array,是什么导致的
DataWorks是阿里云提供的一站式大数据开发与治理平台,支持数据集成、数据开发、数据服务、数据质量管理、数据安全管理等全流程数据处理。在使用DataWorks过程中,可能会遇到各种操作报错。以下是一些常见的报错情况及其可能的原因和解决方法。
|
19小时前
|
数据安全/隐私保护 网络架构 索引
Elasticsearch索引数据的路由规则与自定义路由分发
Elasticsearch索引数据的路由规则与自定义路由分发
5 0
|
20小时前
|
API 网络架构 索引
Elasticsearch索引中数据的增删改查与并发控制
Elasticsearch索引中数据的增删改查与并发控制
6 0
|
20小时前
|
存储 自然语言处理 数据库
使用Elasticsearch映射定义索引结构
使用Elasticsearch映射定义索引结构
7 0
|
2天前
|
存储 JSON 定位技术
深入理解Elasticsearch的索引映射(mapping)
深入理解Elasticsearch的索引映射(mapping)
|
2天前
|
存储 Java API
在生产环境中部署Elasticsearch:最佳实践和故障排除技巧———索引与数据上传(二)
在生产环境中部署Elasticsearch:最佳实践和故障排除技巧———索引与数据上传(二)
|
1月前
|
运维 数据挖掘 Serverless
阿里云Elasticsearch Serverless助力某电商平台公司实现商品订单数据的实时写入查询
某电商平台公司采用阿里云Elasticsearch Serverless解决方案,实现商品、订单和其他关键信息的写入和查询的实时响应。
230 1
|
15天前
|
存储 负载均衡 NoSQL
【后端面经】【NoSQL】ElasticSearch - 1 - 1 节点角色 写入数据
【6月更文挑战第12天】中间件高可用与高性能通过冗余、负载均衡和优化实现。Elasticsearch节点有候选主节点、协调节点和数据节点等角色,可兼任或独立。数据写入涉及Buffer、Page Cache和磁盘,通过段合并优化资源使用。查询通过Commit Point识别新段,确保近实时搜索。
21 0