【问题标题】:Logstash is indexing only one row of select query from mysql to elastic searchLogstash 仅索引从 mysql 到弹性搜索的选择查询的一行
【发布时间】:2017-05-16 01:01:54
【问题描述】:

我正在尝试使用 logstash 将数据从 mysql db 索引到 elasticsearch。 Logstash 运行没有错误,但问题是,它只索引我的 SELECT 查询中的一行。 以下是我使用的软件版本:

  • 弹性搜索:2.4.1
  • logstash:5.1.1
  • mysql: 5.7.17
  • jdbc_driver_library: mysql-connector-java-5.1.40-bin.jar

我不确定这是否是因为 logstash 和 elasticsearch 版本不同。

下面是我的流水线配置:

input {
  jdbc {
    jdbc_driver_library => "mysql-connector-java-5.1.40-bin.jar"
    jdbc_driver_class => "com.mysql.jdbc.Driver"
    jdbc_connection_string => "jdbc:mysql://localhost:3306/mydb"
    jdbc_user => "user"
    jdbc_password => "password"
    schedule => "* * * * *"
    statement => "SELECT * FROM employee"
    use_column_value => true
    tracking_column => "id"
  }
}
output {
    elasticsearch {
        index => "logstash"
        document_type => "sometype"
        document_id => "%{uid}"
        hosts => ["localhost:9200"]
    }
}

【问题讨论】:

    标签: elasticsearch logstash


    【解决方案1】:

    您在jdbc 插件中使用的tracking_column (id) 和output 中的document_id (uid) 似乎不同。如果你有两个相同的东西怎么办,因为很容易通过id 获取所有记录并使用相同的id 将它们推送到 ES 中,这看起来更容易理解:

    document_id => "%{id}" <-- make sure you've got the exact spellings
    

    还请尝试在tracking_column 之后将以下行添加到您的jdbc 输入:

    tracking_column_type => "numeric"
    

    此外,为了确保在运行 logstash 文件时不存在 .logstash_jdbc_last_run 文件,还包括以下行:

    clean_run => true
    

    这就是你的 jdbc 输入应该是这样的:

    jdbc {
        jdbc_driver_library => "mysql-connector-java-5.1.40-bin.jar"
        jdbc_driver_class => "com.mysql.jdbc.Driver"
        jdbc_connection_string => "jdbc:mysql://localhost:3306/mydb"
        jdbc_user => "user"
        jdbc_password => "password"
        schedule => "* * * * *"
        statement => "SELECT * FROM employee"
        use_column_value => true
        tracking_column => "id"
        tracking_column_type => "numeric"
        clean_run => true
      }
    

    除此之外,conf 似乎还不错,除非您愿意使用:sql_last_value,如果您只想更新数据库表中新添加的记录。希望对您有所帮助!

    【讨论】:

    • 非常感谢您的回复。我不清楚一些事情。每次调度程序运行时,它是否会在 ES 中选择所有行并重新索引(我知道它不会重复,因为我们有 tracking_column)?例如,我最初在表中有 10 行,它们在 ES 中被索引。在调度程序下一次运行之前,又添加了 5 行。现在,调度器选择 15 行还是 5 行?我的理解是,如果 :sql_last _value 在选择查询中使用,则选择 5,否则将选择 15。请澄清我的理解。
    • @MaruthiPodila 是的,没错。如果您的 sql_last_value 指向最后更新的 id,它总是会在调度程序再次运行时选择已添加的最后 5 行。
    猜你喜欢
    • 1970-01-01
    • 2014-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-13
    • 1970-01-01
    相关资源
    最近更新 更多