我应该如何在logstash中使用sql_last_value?

时间:2016-11-01 17:05:18

标签: elasticsearch jdbc logstash logstash-configuration elasticsearch-5

当我发表声明时,我不清楚sql_last_value的作用是什么:

statement => "SELECT * from mytable where id > :sql_last_value"

我可以稍微理解使用它的原因,它不会浏览整个数据库表以更新字段,而只会更新新添加的记录。如果我错了,请纠正我。

所以我要做的是,使用logstash创建索引:

input {
    jdbc {
        jdbc_connection_string => "jdbc:mysql://hostmachine:3306/db" 
        jdbc_user => "root"
        jdbc_password => "root"
        jdbc_validate_connection => true
        jdbc_driver_library => "/path/mysql_jar/mysql-connector-java-5.1.39-bin.jar"
        jdbc_driver_class => "com.mysql.jdbc.Driver"
        schedule => "* * * * *"
        statement => "SELECT * from mytable where id > :sql_last_value"
        use_column_value => true
        tracking_column => id
        jdbc_paging_enabled => "true"
        jdbc_page_size => "50000"
    }
}

output {
    elasticsearch {
        #protocol => http
        index => "myindex"
        document_type => "message_logs"
        document_id => "%{id}"
        action => index
        hosts => ["http://myhostmachine:9402"]
    }
}

执行此操作后,文档根本不会上传到索引中。我哪里错了?

任何帮助都可以得到赞赏。

3 个答案:

答案 0 :(得分:4)

如果您的表格中有时间戳列(例如last_updated),则最好使用它而不是ID。因此,当记录更新时,您也会修改该时间戳,jdbc输入插件将获取记录(即ID列不会更改其值并且更新的记录将赢得&t; t拿起来)

input {
    jdbc {
        jdbc_connection_string => "jdbc:mysql://hostmachine:3306/db" 
        jdbc_user => "root"
        jdbc_password => "root"
        jdbc_validate_connection => true
        jdbc_driver_library => "/path/mysql_jar/mysql-connector-java-5.1.39-bin.jar"
        jdbc_driver_class => "com.mysql.jdbc.Driver"
        jdbc_paging_enabled => "true"
        jdbc_page_size => "50000"
        schedule => "* * * * *"
        statement => "SELECT * from mytable where last_updated > :sql_last_value"
    }
}

如果您决定继续使用ID列,则应删除$HOME/.logstash_jdbc_last_run文件,然后重试。

答案 1 :(得分:2)

有几件事要照顾:

  1. 如果您之前没有安排运行Logstash,那么在运行Logstash with schedule之前,请删除该文件:

    $HOME/.logstash_jdbc_last_run
    

    在Windows中,此文件位于:

    C:\Users\<Username>\.logstash_jdbc_last_run
    
  2. “statement =&gt;”在Logstash配置中应该有“order by”tracking_column。

  3. 应正确给出tracking_column。

  4. 以下是Logstash配置文件的示例:

        input {
    jdbc {
        # MySQL DB jdbc connection string to our database, softwaredevelopercentral
        jdbc_connection_string => "jdbc:mysql://localhost:3306/softwaredevelopercentral?autoReconnect=true&useSSL=false"
        # The user we wish to execute our statement as
        jdbc_user => "root"
        # The user password
        jdbc_password => ""
        # The path to our downloaded jdbc driver
        jdbc_driver_library => "D:\Programs\MySQLJava\mysql-connector-java-6.0.6.jar"
        # The name of the driver class for MySQL DB
        jdbc_driver_class => "com.mysql.cj.jdbc.Driver"
        # our query
        schedule => "* * * * *"
        statement => "SELECT * FROM student WHERE studentid > :sql_last_value order by studentid"
        use_column_value => true
        tracking_column => "studentid"
    }
    }
    output {
    stdout { codec => json_lines }
    elasticsearch { 
       hosts => ["localhost:9200"]
       index => "students"
       document_type => "student"
       document_id => "%{studentid}"
       }
    

    }

    要查看相同的工作示例,您可以查看我的博文: http://softwaredevelopercentral.blogspot.com/2017/10/elasticsearch-logstash-kibana-tutorial.html

答案 2 :(得分:0)

简而言之,sql_last_value允许您以最后一个sql的名称sugets的形式持久化数据。

当您安排查询时,此值特别有用。但为什么 ... ? 因为您可以基于存储在sql_last_value中的值来创建sql语句条件,并且避免检索已为logstash输入摄取的行或在上次执行管道之后更新的行

使用sql_last_value

时要记住的事情
  • 默认情况下,此变量存储上次运行的时间戳。当您需要基于creation_date last_update等列提取数据时很有用。
  • 您可以通过跟踪特定表的列值来定义sql_last_value的值。当您需要基于自动摄取数据时很有用。为此,您需要指定use_column_value => truetracking_column => "column_name_to_track"

以下示例将存储最后一个mytable行的 id :sql_last_value中,以在下一次执行中提取之前未提取的行,这意味着其id大于的行最后提取的ID。

input {
    jdbc {
        # ...
        schedule => "* * * * *"
        statement => "SELECT * from mytable where id > :sql_last_value"
        use_column_value => true
        tracking_column => id
    }
}

非常重要!!!

当您在管道中使用多个输入时,每个输入块将覆盖最后一个的sql_last_value的值。为了避免这种行为,可以使用last_run_metadata_path => "/path/to/sql_last_value/of_your_pipeline.yml"选项,这意味着每个管道将在不同的文件中存储自己的值。