Logstash中如何处理到ElasticSearch的数据映射
Logstash作为一个数据处理管道,提供了丰富的插件,能够从不同数据源获取用户数据,进行处理后发送给各种各样的后台。这中间,最关键的就是要对数据的类型就行定义或映射。
本文讨论的 ELK 版本为 5.5.1。
为什么要定义数据
Elastisearch不仅是一个强大的全文检索引擎,它还能够对一些数据类型进行实时的统计运算,相关的结果可以通过Kibana的图表展现出来。如果数据类型没有正确的定义,那么Elasticsearch就无法进行运算了,因此,虽然数据类型的定义需要花一点时间,但你会收到意想不到的效果。
JSON、字符串和数字
所有送往Elasticsearch的数据都要求是JSON格式,Logstash所做的就是如何将你的数据转换为JSON格式。ElasticSearch会帮我们自动的判断传入的数据类型,这么做当然极大的方便了用户,但也带来了一些问题。
Elastic中的一些数据类型: text、keyword、date、long、double、boolean、ip、object、nested、geo_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,@version,count,average,host。其中 @timestamp 和 host 是字符串,count、average 是数字,@version比较特殊,它的值是数字,但是因为放在双引号中,所以作为字符串来对待。
尝试把数据送入到 Elasticsearch 中,首先创建一个测试的索引:

将数据存入索引

查看数据映射的情况

根据结果可知,在没有明确定义数据类型的情况下,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-* 的模板。

我们用实际的例子来看一下映射和模板是如何起作用的。
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"
数据导入完成后,看一下索引的情况

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

这里可以注意到模板文件和索引中的映射关系稍有不同,没关系,我们把 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 中的注释打开即可。然后删除索引,我们对索引重建一下。
看一下索引,可以看到模板中定义的规则已经在里面了。

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

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

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

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

可以看到,除了默认的模板,新增了一个我们定义的 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时踩的坑
Logstash中如何处理到ElasticSearch的数据映射的更多相关文章
- Elasticsearch的快速使用——Spring Boot使用Elastcisearch, 并且使用Logstash同步mysql和Elasticsearch的数据
我主要是给出一些方向,很多地方没有详细说明.当时我学习的时候一直不知道怎么着手,花时间找入口点上比较多,你们可以直接顺着方向去找资源学习. 如果不是Spring Boot项目,那么根据Elastics ...
- 通过Logstash由SQLServer向Elasticsearch同步数据
延用上篇ELK所需环境,新增logstash配置文件 需要数据库链接驱动 Microsoft JDBC driver 6.2 for SQL Server 下载地址: https://www.micr ...
- LogStash 中字段的排除和数据的排除
排除字段 字段的排除需要在filter中进行操作,使用一个叫做 mutate 的工具,具体操作如下 由于这个工具的名字不是很容易联想到,也是找了好一会. //比如我们可能需要避免日志中kafka的一些 ...
- 架构模式数据源模式之:数据映射器(Data Mapper)
一:数据映射器 关系型数据库用来存储数据和关系,对象则可以处理业务逻辑,所以,要把数据本身和业务逻辑糅杂到一个对象中,我们要么使用 活动记录,要么把两者分开,通过数据映射器把两者关联起来. 数据映射器 ...
- Logstash 6.4.3 导入 csv 数据到 ElasticSearch 6.4.3
本文实践最新版的Logstash从csv文件导入数据到ElasticSearch. 本文目录: 1.初始化ES.Kibana.Logstash 2.安装logstash文件导入.过滤器等插件 3.配置 ...
- JAVA反射机制示例,读取excel数据映射到JAVA对象中
import java.beans.PropertyDescriptor; import java.io.File; import java.io.FileInputStream; import ja ...
- applyColorMap 在OpenCV中对灰度图进行颜色映射,实现数据的色彩化
什么是色彩映射: 说直白点就是将各种数据映射成颜色信息,例如:温度,高度,压力,密度,湿度,城市拥堵数据等等 色彩化后更加直观表达 在OpenCV里可以使用 Mat im_gray = imread( ...
- Elasticsearch 教程--数据
在Elasticsearch中,每一个文档都有一个版本号码.每当文档产生变化时(包括删除),_version就会增大.在<版本控制>中,我们将会详细讲解如何使用_version的数字来确认 ...
- elasticsearch的mapping映射
Mapping简述 Elasticsearch是一个schema-less的系统,但并不代表no shema,而是会尽量根据JSON源数据的基础类型猜测你想要的字段类型映射.Elasticsearch ...
随机推荐
- Java第三阶段学习(九、类加载器、反射)
一.类加载器 1.类的加载: 当程序要使用某个类时,如果该类还未被加载到内存中,则系统会通过加载,连接,初始化三步来实现对这个类进行初始化. 1.1 加载: 就是指将class文件读入内存,并为之自动 ...
- Kmeans 聚类 及其python实现
主要参考 K-means 聚类算法及 python 代码实现 还有 <机器学习实战> 这本书,当然前面那个链接的也是参考这本书,懂原理,会用就行了. 1.概述 K-means ...
- 【GOF23设计模式】--工厂模式
工厂模式: 实现了创建者调用者的分离 详细分类: 简单工厂模式 工厂方法模式 抽象工厂模式 面向对象设计的基本原则: OCP(开闭原则,Open-Closed Principle):一个软件的实体应当 ...
- Chrome浏览器被hao123劫持,浏览器主页会被篡改为 hao123等
先放一个知乎帖子: https://www.zhihu.com/question/21883209 我就只放几个有效解决办法了,具体的可以看上边那个帖子 方案一: 删掉桌面上的chrome图标 ...
- Django 浏览器打开警告Not Found: /favicon.ico (转)
Django 浏览器打开警告Not Found: /favicon.ico 初学Django 执行python manage.py runserver 0.0.0.0:8000 urls.py ...
- Wannafly 挑战赛 19 参考题解
这一次的 Wannafly 挑战赛题目是我出的,除了第一题,剩余的题目好像对大部分算法竞赛者来说好像都不是特别友好,但是个人感觉题目质量还是过得去的,下面是题目链接以及题解. [题目链接] Wanna ...
- php调用python脚本
主要参考两篇文章 PHP中的换行详解 利用PHP调试Python Python小窥 - 写给Python的入门者 这两篇文章结合起来进行测试,主要过程如下 cd /var/www/html mkdir ...
- ArduinoYun教程之Arduino编程环境搭建
ArduinoYun教程之Arduino编程环境搭建 Arduino编程环境搭建 通常,我们所说的Arduino一般是指我们可以实实在在看到的一块开发板,他可以是Arduino UNO.Arduino ...
- 清北学堂省选刷题冲刺班 Test Day3
目录 2018.3.27 Test T1 T2 T3 考试代码 T2 T3 2018.3.27 Test 时间:8:00~11:30 期望得分:100+60+25=185 实际得分:100+40+25 ...
- Java clone() 浅克隆与深度克隆(转)
以下文字转自:桔子园 http://www.blogjava.net/orangelizq/archive/2007/10/17/153573.html 现在Clone已经不是一个新鲜词语了,伴随着“ ...