我正在尝试使用Logstash将数据从MySQL服务器发送到ES。我正在使用ES 6.3.0和Logstash 6.3.0。我的配置文件如下所示:
input {
jdbc {
jdbc_driver_library => "/Users/.../mysql-connector-java-5.1.46-bin.jar"
jdbc_driver_class => "com.mysql.jdbc.Driver"
jdbc_connection_string => "jdbc:mysql://..."
jdbc_user => "user"
jdbc_password => "****"
statement => "SELECT * FROM user.customer"
}
}
output {
#stdout { codec => json_lines }
elasticsearch {
hosts => "localhost"
index => "customers"
}
}
我正在使用一个数据库的MySQL数据库,该表具有几列不同数据类型的列。当我尝试向ES发送数据时,出现以下错误消息:
[2018-07-03T14:39:06,088][WARN ][logstash.outputs.elasticsearch] Could not index event to Elasticsearch. {:status=>400, :action=>["index", {:_id=>nil, :_index=>"customers", :_type=>"doc", :_routing=>nil}, #<LogStash::Event:0x2ff3608c>], :response=>{"index"=>{"_index"=>"customers", "_type"=>"doc", "_id"=>"p-MnYGQBzIWWUpovTpES", "status"=>400, "error"=>{"type"=>"illegal_argument_exception", "reason"=>"mapper [uc_score] cannot be changed from type [long] to [float]"}}}}
经过一些研究,我发现您不能再在ES中使用不同的类型,但是我不确定它们的确切含义。我该怎么办才能解决这个问题?从MySQL数据库向ES发送数据的聪明方法是什么?我打算使用ES来分析和可视化数据库中的数据。
答案 0 :(得分:1)
这是由于使用JDBC驱动程序转换类型的能力有限所致。
字段uc_score
的MySQL类型为long
,它不是JDBC自动转换为Elasticsearch类型float
的。因此,您应该将此片段添加到filter
部分的logstash管道配置中,以转换uc_score
字段:
filter {
mutate { convert => {"uc_score" => "float"} }
}
别忘了重启logstash实例!
来源:Importing Data from MySQL to Elasticsearch to Visualize it with Kibana