记录一次elastic通过logstash导入mysql数据的异常:have more than 1 type: [new_doc, doc]

博客围绕ES早晨报错问题展开,推测与昨晚mysql数据导入有关。经分析,问题可能出在logstash导入时的dymaic_template模板及配置文件。解决步骤包括删除template、优化logstash导入template和配置文件,最终解决问题,还提及正在测试logstash导百万数据的速度。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

记录一次elastic通过logstash导入mysql数据的异常:have more than 1 type: [new_doc, doc]

ES早晨无辜报错,超过一个type,稍加思索,想到可能和昨晚走之前的mysql数据导入有关系,附一张报错图
在这里插入图片描述

参考文献

网上基本没有类似的博文,除了这一篇,博主的说法更加证实了我的猜测
参考连接:https://blog.youkuaiyun.com/q18810146167/article/details/89339380

问题来源

首先看创建的type是,x-pack的监控节点,这个属于程序的插件,不是我主动操作造成的,所以猜测可能是通过logstash导入mysql时的dymaic_template模板有关系

{
    "template": "*",
    "version": 1,
    "settings": {
        "index.refresh_interval": "5s"
    },
    "mappings": {
    "doc": {
      "dynamic_templates":[
        {
          "STRING":{
          "match_mapping_type":"string",
          "mapping":{
            "type":"text",
			"analyzer": "ik_max_word",
            "fields":{
              "raw":{
                "type":"keyword",
                "ignore_above":256
				 
                }
              }
            }
          }
        }
      ],
      "properties":{
        "pinyin":{
          "type":"text"
        },
        "address":{
          "type":"text"
        },
        "latitude":{
          "type":"geo_point"
        },
        "longitude":{
          "type":"geo_point"
        },
        "operate_scope":{
          "type":"text"
        }
      }
    }
  }
}

果然,_doc出现在这,首先elastic在6之后支持单type,默认的type的名字就叫做_doc,所以当时才这么写的,后来参阅了elstic的官网介绍
https://www.elastic.co/guide/en/elasticsearch/reference/6.2/indices-templates.html
其实可以不用再显示的声明type的name了,因为只有一个,除非你要自己起一个名字可以这样。

问题发现第二:
在这里插入图片描述logstash执行报错,http://**/_template/logstash请求返回400,于是去elastic上get请求了一下,发现正是自己配置的模板,现在已经 被我删掉了,看不到当时的数据,有可能是配置本身有问题,现在无法确定了,记忆里面的type的name叫做_doc,可是按理说这是正常的,不会报错,那么问题就来了,doc到底是哪里来的,刚才那个老兄的博文里面说logstash默认的type叫做doc,那么就可以试着解决一下了

解决步骤

1. 删除template

curl -XDELETE http://localhost:9200/_template/logstash

删除之后应该控制台的报错信息就不刷了,颜色应该从yellow->green

2. 优化logstash导入template

就是上面的把_doc去掉就行,这一步应改不做也可以,不过我为了一次成功,还是重弄了一下

3.优化logstash导入的配置文件

其实就是导入elastic的时候显示指定type为_doc,而不是logstash默认的doc

input {
  stdin {
  }
  jdbc {
	  type => "enterprise"
	  jdbc_connection_string => "jdbc:mysql://"
	  jdbc_driver_library => "D:\ELK\logstash-6.2.2\mysql\mysql-connector-java-5.1.25.jar"
	  jdbc_driver_class => "com.mysql.jdbc.Driver"
	  jdbc_paging_enabled => true
	  jdbc_page_size => "5000"
	  jdbc_user => "root"
	  jdbc_password => "!Z"
	  clean_run => "false"
	  use_column_value => true
	  tracking_column => "create_time"
	  tracking_column_type => "timestamp"
	  last_run_metadata_path => "D:\ELK\logstash-6.2.2\mysql\data\last_value.txt"
	  statement => "select * from ENTERPRISE where create_time >= :sql_last_value"
	  schedule => "* * * * *"
  }
}
filter {
	    mutate {
		remove_field => ["@version", "@timestamp", "risktype"]
    
    }
}
output { 
	elasticsearch { 
		hosts => ["http://:9200"] 
		index => "enterprise" 
		document_id => "%{id}"
		document_type => "_doc"
		template_overwrite => true
		template => "D:\ELK\logstash-6.2.2\template\dymaic_mapping.json"
	}
	stdout {
		codec => json_lines 
	} 
}

问题解决

elastic目前刚刚接触,还有很多没搞明白的,继续努力吧
目前正在测试通过logstash导百W数据,测试速度大约在3000条/s

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值