将Logstash与MySQL和Elasticsearch结合使用,无法发送数据

时间:2018-07-03 13:15:38

标签: elasticsearch logstash

我正在尝试使用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来分析和可视化数据库中的数据。

1 个答案:

答案 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