记录一次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