logstash使用template提前设置好maping同步mysql数据到Elasticsearch5.5.2
上篇blog說到采用logstash-input-jdbc將mysql數(shù)據(jù)同步到ES(http://www.cnblogs.com/jstarseven/p/7704893.html),但是這里有一個問題,即假如我不需要logstash自動對mysql數(shù)據(jù)提供的mapping模板怎么辦,畢竟我的數(shù)據(jù)需要ik分詞,同義詞解析等。。。
這時候就需要用到logstash的template功能了 ,如果現(xiàn)在還不到logstash和logstash-input-jdbc的安裝使用方式的建議先看上一篇文章。--------jstarseven
轉(zhuǎn)載請注明原文出處:http://www.cnblogs.com/jstarseven/p/7707499.html
好的,首先看一下之前簡單使用logstash-input-jdbc導(dǎo)入es的配置文件mysql.conf(一會配置template時候需要修改):
input {
stdin {
}
jdbc {
# 數(shù)據(jù)庫
jdbc_connection_string => "jdbc:mysql://127.0.0.1:3306/test"
# 用戶名密碼
jdbc_user => "root"
jdbc_password => "123456"
# jar包的位置
jdbc_driver_library => "/usr/local/logstash-5.5.2/bin/config-mysql/mysql-connector-java-5.1.31.jar"
# mysql的Driver
jdbc_driver_class => "com.mysql.jdbc.Driver"
jdbc_paging_enabled => "true"
jdbc_page_size => "50000"
#statement_filepath => "config-mysql/test02.sql"
statement => "select * from my_into_es "
schedule => "* * * * *"
#索引的類型
type => "my_into_es_type"
}
}
filter {
json {
source => "message"
remove_field => ["message"]
}
}
output {
elasticsearch {
hosts => "127.0.0.1:9200"
# index名
index => "my_into_es_index"
# 需要關(guān)聯(lián)的數(shù)據(jù)庫中有有一個id字段,對應(yīng)索引的id號
document_id => "%{id}"
}
stdout {
codec => json_lines
}
}
現(xiàn)在,我們來看template模板怎么用:
第一種采用我個人將它稱為動態(tài)模板:dynamic_templates 可以做到對某種類型字段進(jìn)行匹配mapping
1. 切換路徑 cd /usr/local/logstash-5.5.2 目錄下
2. 新建template目錄 mkdirtemplate
3. cdtemplate
4. 新建文件logstash-ik.json
5. 編輯文件內(nèi)容:
{
"template": "*",
"version": 50001,
"settings": {
"index.refresh_interval": "5s"
},
"mappings": {
"_default_": {
"_all": {
"enabled": true,
"norms": false
},
"dynamic_templates": [
{
"message_field": {
"path_match": "message",
"match_mapping_type": "string",
"mapping": {
"type": "text",
"norms": false
}
}
},
{
"string_fields": {
"match": "*",
"match_mapping_type": "string",
"mapping": {
"type": "text",
"norms": false,
"analyzer": "ik_max_word",
"fields": {
"keyword": {
"type": "keyword"
}
}
}
}
}
],
"properties": {
"@timestamp": {
"type": "date",
"include_in_all": false
},
"@version": {
"type": "keyword",
"include_in_all": false
}
}
}
}
}
~
6. cd/usr/local/logstash-5.5.2/bin/config-mysql
7.新建文件 mkdirmysql-ik-define.conf
文件內(nèi)容:
input {
stdin {
}
jdbc {
# 數(shù)據(jù)庫
jdbc_connection_string => "jdbc:mysql://127.0.0.1:3306/test"
# 用戶名密碼
jdbc_user => "root"
jdbc_password => "123456"
# jar包的位置
jdbc_driver_library => "/usr/local/logstash-5.5.2/bin/config-mysql/mysql-connector-java-5.1.31.jar"
# mysql的Driver
jdbc_driver_class => "com.mysql.jdbc.Driver"
jdbc_paging_enabled => "true"
jdbc_page_size => "50000"
#statement_filepath => "config-mysql/test02.sql"
statement => "select * from my_into_es_define"
schedule => "* * * * *"
#索引的類型
type => "into_es_type_define_ik"
}
}
filter {
json {
source => "message"
remove_field => ["message"]
}
}
output {
elasticsearch {
hosts => "127.0.0.1:9200"
# index名
index => "into_es_index_define_ik"
# 需要關(guān)聯(lián)的數(shù)據(jù)庫中有有一個id字段,對應(yīng)索引的id號
document_id => "%{id}"
template_overwrite => true
template => "/usr/local/logstash-5.5.2/template/logstash-ik.json"
}
stdout {
codec => json_lines
}
}
注釋:上面標(biāo)顏色的就是template的配置,其他基本不變
8. cd/usr/local/logstash-5.5.2/bin
9. 執(zhí)行命令:./logstash -f config-mysql/mysql-ik-define.conf
觀察日志:
10.我們拿ElasticSearch-head插件看一下新建好的mapping:
和我們預(yù)料的一樣沒有問題,數(shù)據(jù)也成功導(dǎo)入:
總結(jié):這種配置方式個人覺得比較靈活可以對字段按類區(qū)分做mapping
第二種采用我個人將它稱為靜態(tài)模板(其實(shí)和上面的基本一致),就是template文件不一樣,mapping針對每個字段寫死就好:
1.在之前的template目錄下新建logstash-ik-define.json文件:
{
"template": "*",
"version": 50001,
"settings": {
"index.refresh_interval": "5s"
},
"mappings": {
"into_es_type_define" :{
"properties": {
"ct": {
"type": "date"
},
"@timestamp": {
"include_in_all": false,
"type": "date"
},
"@version": {
"include_in_all": false,
"type": "keyword"
},
"name": {
"norms": false,
"analyzer": "ik_max_word",
"type": "text",
"fields": {
"keyword": {
"type": "keyword"
}
}
},
"id": {
"type": "long"
},
"type": {
"norms": false,
"analyzer": "ik_max_word",
"type": "text",
"fields": {
"keyword": {
"type": "keyword"
}
}
},
"age": {
"type": "long"
},
"desc": {
"norms": false,
"analyzer": "ik_max_word",
"type": "text",
"fields": {
"keyword": {
"type": "keyword"
}
}
},
"ut": {
"type": "date"
}
}
}
}
}
2.修改上述mysql-ik-define.conf文件里面的index,type,和template部分應(yīng)用模板文件即可
3.執(zhí)行命令:./logstash -f config-mysql/mysql-ik-define.conf
4.查看head里面的mapping新建情況和template文件中mapping保持一致:
5.數(shù)據(jù)也成功同步:
總結(jié):template模板使用
1.靜態(tài)模板 :
適合索引字段數(shù)據(jù)固定的場景,一旦配置完成,不能向里面加入多余的字段,否則會報(bào)錯
優(yōu)點(diǎn):scheam已知,業(yè)務(wù)場景明確,不容易出現(xiàn)因字段隨便映射從而造成元數(shù)據(jù)撐爆es內(nèi)存,從而導(dǎo)致es集群全部宕機(jī)
缺點(diǎn):字段數(shù)多的情況下配置稍繁瑣
1.動態(tài)模板 :
適合字段數(shù)不明確,大量字段的配置類型相同的場景,多加字段不會報(bào)錯
優(yōu)點(diǎn):可動態(tài)添加任意字段,無須改動scheaml,
缺點(diǎn):如果添加的字段非常多,有可能造成es集群宕機(jī)
定制索引模板,是搜索業(yè)務(wù)中一項(xiàng)比較重要的步驟,需要注意的地方有很多,比如:
(1)字段數(shù)固定嗎
(2)字段類型是什么
(3)分不分詞
(4)索引不索引
(5)存儲不存儲
(6)排不排序
(7)是否加權(quán)
除了這些還有其他的一些因素,比如,詞庫的維護(hù)改動,搜索架構(gòu)的變化等等。
如果前提沒有充分的規(guī)劃好,后期改變的話,改動其中任何一項(xiàng),都需要重建索引,這個代價(jià)是非常大和耗時的,尤其是在一些數(shù)據(jù)量大的場景中
-END-
總結(jié)
以上是生活随笔為你收集整理的logstash使用template提前设置好maping同步mysql数据到Elasticsearch5.5.2的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux C++ scandir 的使
- 下一篇: 4名发小6年后一起考上清华 绵阳同班“四