前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >某用户Logstash消费Kafka数据写入ES报错,"cannot be changed from type [long] to [text]"处理过程

某用户Logstash消费Kafka数据写入ES报错,"cannot be changed from type [long] to [text]"处理过程

原创
作者头像
南非骆驼说大数据
修改于 2022-08-06 11:10:28
修改于 2022-08-06 11:10:28
2.6K10
代码可运行
举报
运行总次数:0
代码可运行

一、前言

某用户通过logstash消费Kafka数据写入ES时报错,导致数据写入ES失败。需要排查原因

  1. 问题排查报错信息如下:

Could not index event to Elasticsearch. {:status=>400, :action=>["index", {:_id=>nil, :_index=>"XXXXXX-2022.08", :routing=>nil, :_type=>"_doc"}, #<LogStash::Event:0x153461e0>], :response=>{"index"=>{"_index"=>"XXXXXX-2022.08

", "_type"=>"_doc", "_id"=>"AKkgXoIBJ6THvkxd4efv", "status"=>400, "error"=>{"type"=>"illegal_argument_exception", "reason"=>"mapper [modules.subModules.items.value] cannot be changed from type [long] to [text]"}}}}

大意是"modules.subModules.items.value"这个字段的类型是长整型,但是写入ES的时候变成了字符串类型text.类型转换错误导致数据写入失败。

二、数据测试

测试一:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制

PUT nginx-hezhenserver/_doc/1
{
  "modules": [
    {
      "name": "IPC",
      "subModules": [
        {
          "name": "cpuUse",
          "items": [
            {
              "name": "all",
              "value": "31.63"
            },
            {
              "name": "cpu1",
              "value": 29                    //注意这里的value的值的不同。
            }
          ]
        }
      ]
    }
  ]
}

报错如下:

插入文档报错
插入文档报错

测试二:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
PUT nginx-hezhenserver/_doc/1
{
  "modules": [
    {
      "name": "IPC",
      "subModules": [
        {
          "name": "cpuUse",
          "items": [
            {
              "name": "all",
              "value": "31.63"
            },
            {
              "name": "cpu1",
              "value": "29"           加引号//注意这里的value的值的不同,将value值的格式改为一致。
            }
          ]
        }
      ]
    }
  ]
}

数据创建成功。

从以上对比中,我们可以看到,这种object类型的对象子字段内容中数据类型不一致时,在存入ES的时候,会报类型转换错误,默认都会转为字符串类型存储。

三、解决办法

由于用户这种类型的字段内容都是数字类型,那这里就统一定义为long. 可以在template里加一个动态模板,用来将这类的字段写入ES时自动转为long类型。由于这里是对象字段object 子字段,这里需要用到path.match,模板里设置如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
    {
        "message22": {
          "mapping": {
            "type": "long"
          },
         "path_match" : "modules.subModules.items.value"
        }
      }
    //将此类index下的value对象字段映射成long.

执行上述模板后,再生成一个new index.

还是上一个测试语句。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
PUT nginx-hezhenserver/_doc/1
{
  "modules": [
    {
      "name": "IPC",
      "subModules": [
        {
          "name": "cpuUse",
          "items": [
            {
              "name": "all",
              "value": "31.63"
            },
            {
              "name": "cpu1",
              "value": 29
            }
          ]
        }
      ]
    }
  ]
}

再次执行,发现执行成功。查看mapping,values子字段变成了long.其他对象字段变成了text。

那么问题到这里基本就解决了,但是由于用户logstash消费的源数据不统一,value数组里的内容不规范,导致写入ES的时候还是报错。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
PUT nginx-hezhenserver/_doc/1
{
  "modules": [
    {
      "name": "IPC",
      "subModules": [
        {
          "name": "cpuUse",
          "items": [
            {
              "name": "all",
              "value": "31.63"
            },
            {
              "name": "cpu1",
              "value": 29
            },{
              "name": "cpu1",
              "value": "689MZH"   //字符串类型的value
            }
          ]
        }
      ]
    }
  ]
}

报错如下:

写入报错2
写入报错2

这个意思是这个写入的value里的内容ES识别到输入的是String.不能转成long. 解析失败。

由于用户侧无法控制写入数据的标准性,那只能ES侧再调整模板,直接改为text类型即可。调整如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
{
        "message22": {
          "mapping": {
            "type": "text"
          },
         "path_match" : "modules.subModules.items.value"
        }
      }

再次执行上述index.索引即创建成功。

那么以上调整,客户此类logstash消费kafka异常的数据写入问题就全部解决。

四、总结

这里主要用到了Elasticseach的动态模板,用到了对象字段path_match组合,特地记录了这个问题。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
1 条评论
热度
最新
大佬第三步,按个在什么地方操作啊?能不能说明细一点啊?不会操作
大佬第三步,按个在什么地方操作啊?能不能说明细一点啊?不会操作
回复回复点赞举报
推荐阅读
编辑精选文章
换一批
Elasticsearch 5.x 版本升级到 6.x 版本,数据写入异常处理方案
某客户将云ES从5.6.4版本升级到6.8.2版本后出现数据写入异常,数据丢失的情况。需协助紧急协助处理
zjiekou
2022/11/30
1.2K0
Elasticsearch 5.x 版本升级到 6.x 版本,数据写入异常处理方案
ELK专栏之ES索引-04
● 在生产上,我们需要自己手动建立索引和映射,是为了更好的管理索引,就像数据库的建表数据一样。
大忽悠爱学习
2022/09/29
6700
ELK专栏之ES索引-04
Elasticsearch的Index和Mapping(二)
本文使用的Elasticsearch版本为6.5.4,基本命令以及操作大都通用。下面通过MySQL与Elasticsearch的对比图,让我们更好地理解接下来的增删改操作。
用户3467126
2020/02/25
2.9K0
Elasticsearch的Index和Mapping(二)
logstash使用template提前设置好maping同步mysql数据到Elasticsearch5.5.2
上篇blog说到采用logstash-input-jdbc将mysql数据同步到ES(http://www.cnblogs.com/jstarseven/p/7704893.html),但是这里有一个问题,即假如我不需要logstash自动对mysql数据提供的mapping模板怎么办,毕竟我的数据需要ik分词,同义词解析等。。。
大道七哥
2019/09/10
2.4K0
logstash使用template提前设置好maping同步mysql数据到Elasticsearch5.5.2
Elasticsearch Dynamic Mapping(动态映射机制)
执行上述请求时,索引"data"不必预先创建,该API首先会自动创建索引data、类型映射_doc,其映射类型下包含字段count,其类型为long。自动根据文档的值推测其类型的过程,就是本文要重点描述的机制:动态类型映射机制。动态映射机制包含如下两种映射规则:
丁威
2019/06/10
3.1K0
Elasticsearch 学习笔记
es提供了一个测试分词的 api 接口,方便验证分词效果,endpoint 是 _analyze
学徒漠筱歌
2022/07/17
6280
Elasticsearch:Dynamic mapping
Elasticsearch 最重要的功能之一是它试图摆脱你的方式,让你尽快开始探索你的数据。 要索引文档,你不必首先创建索引,定义映射类型和定义字段 - 你只需索引文档,那么 index,type 和 field 将自动生效。比如:
腾讯云大数据
2020/09/28
8410
Elasticsearch:Dynamic mapping
Elasticsearch从入门到放弃:瞎说Mapping
前面我们聊了 Elasticsearch 的索引、搜索和分词器,今天再来聊另一个基础内容—— Mapping。
Jackeyzhe
2020/08/05
9850
Elasticsearch索引模板与动态mapping模板(四)
前面我们介绍了mapping相关的属性,细心的朋友可能会发现,在我们最开始使用ES的时候,可能还不太了解mapping,也没有添加过mapping为什么我们还是能够正常的添加文档。
问道白发
2019/12/15
5.1K0
Elasticsearch索引模板与动态mapping模板(四)
Elasticsearch 6.x Mapping设置
需要注意的是,在索引中定义太多字段可能会导致索引膨胀,出现内存不足和难以恢复的情况,下面有几个设置:
小旋锋
2019/01/21
3.2K0
Elasticsearch RESTful API 常用操作
ElasticSearch 是一个基于Lucene的搜索服务器。它提供了一个分布式多用户能力的全文搜索引擎,基于RESTful web接口。Elasticsearch是用Java语言开发的,并作为Apache许可条款下的开放源码发布,是一种流行的企业级搜索引擎。
YP小站
2020/06/04
1.5K0
logstash在Elasticsearch中创建的默认索引模板问题
在ELK架构中,使用logstash收集服务器中的日志并写入到Elasticsearch中,有时候需要对日志中的字段mapping进行特殊的设置,此时可以通过自定义模板template解决,但是因为logstash默认会向Elasticsearch提交一个名为logstash的模板,所以在定义logstash配置文件时有一些关键点需要注意。本文基于logstash-5.6.4和elastcisearch-5.6.4对需要注意的关键点进行列举。
bellen
2018/10/30
7.7K0
logstash在Elasticsearch中创建的默认索引模板问题
Logstash读取Kafka数据写入HDFS详解
通常日志数据除了要入ES提供实时展示和简单统计外,还需要写入大数据集群来提供更为深入的逻辑处理,前边几篇ELK的文章介绍过利用logstash将kafka的数据写入到elasticsearch集群,这篇文章将会介绍如何通过logstash将数据写入HDFS
37丫37
2019/04/09
3.3K1
Elasticsearch实战(六)-mapping映射
将该字段的值复制到目标字段,实现类似 _all 的作用,不会出现在 _source 中,只用来搜索
JavaEdge
2021/02/23
7700
Elasticsearch实战(六)-mapping映射
怎样将 MySQL 数据表导入到 Elasticsearch
本文节选自《Netkiller Database 手札》 MySQL 导入 Elasticsearch 的方法有很多,通常是使用ETL工具,但我觉得太麻烦。于是想到 logstash 。 23.8. Migrating MySQL Data into Elasticsearch using logstash 23.8.1. 安装 logstash 安装 JDBC 驱动 和 Logstash curl -s https://raw.githubusercontent.com/oscm/shell/maste
netkiller old
2018/03/05
5.2K0
如何使用Ubuntu 18.04上的弹性分析托管的PostgreSQL数据库统计信息
数据库监控是系统地跟踪显示数据库执行情况的各种指标的持续过程。 通过观察性能数据,您可以获得有价值的见解并识别可能的瓶颈,并找到提高数据库性能的其他方法。 此类系统通常会实施警报,以便在出现问题时通知管理员。 收集的统计信息不仅可用于改进数据库的配置和工作流程,还可用于改进客户端应用程序的配置和工作流程。
用户2323866
2021/06/18
4.4K0
使用Logstash创建ES映射模版并进行数据默认的动态映射规则
Elasticsearch 能够自动检测字段的类型并进行映射,例如引号内的字段映射为 String,不带引号的映射为数字,日期格式的映射为日期等等,这个机制方便了我们快速上手 ELK,但是后期我们经常需要对一些特定的字段进行定制,之前本人有一篇文章进行这方面的尝试Logstash中如何处理到ElasticSearch的数据映射,但对于默认映射规则没有介绍,本文就来探讨一些默认的动态映射规则。
大江小浪
2018/07/24
2.5K0
干货 | Elasticsearch 数据建模指南
如果我们对上述实战问题进行归类,就都可以归结为 Elasticsearch 数据建模问题。
铭毅天下
2022/05/23
1.1K0
干货 | Elasticsearch 数据建模指南
ElasticSearch + Logstash + Kibana 日志采集
本文节选自《Netkiller Monitoring 手札》 ElasticSearch + Logstash + Kibana 一键安装 配置 logstash 将本地日志导入到 elasticsearch input { file { type => "syslog" path => [ "/var/log/maillog", "/var/log/messages", "/var/log/secure" ] start_position => "beginning"
netkiller old
2018/03/05
1.6K0
ElasticSearch + Logstash + Kibana 日志采集
Elasticsearch实战:常见错误及详细解决方案
上述报错是说索引现在的状态是只读模式(read-only),如果查看该索引此时的状态:
汀丶人工智能
2023/11/03
4120
推荐阅读
相关推荐
Elasticsearch 5.x 版本升级到 6.x 版本,数据写入异常处理方案
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验