logstach:jdbc_page_size不会将我的所有数据转储到弹性搜索

时间:2017-09-23 18:02:02

标签: database postgresql elasticsearch logstash dump

我想将tom_test2 postgresql表导出为弹性搜索。该表有176805行:

=> select count(*) from tom_test2;
 count  
--------
 176805
(1 row)

以下logstach配置文件将我的数据正确导入弹性搜索:

input {
    jdbc {
        # Postgres jdbc connection string to our database, mydb
        jdbc_connection_string => "xxx"
        # The user we wish to execute our statement as
        jdbc_user => "xxx"
        jdbc_password => "xxx"
        # The path to our downloaded jdbc driver
        jdbc_driver_library => "xxx"
        # The name of the driver class for Postgresql
        jdbc_driver_class => "org.postgresql.Driver"
        # our query
        statement => "select * from tom_test2"
    }
}


output {
    elasticsearch {
        hosts => ["xxx"]
        index => "tom"
        document_type => "tom_test"
    }
}

弹性搜索:

GET tom/tom_test/_search

  "hits": {
    "total": 176805,
    "max_score": 1,
}

我在弹性搜索中删除了我的索引:

delete tom

我现在想使用jdbc_page_size进行相同的操作,以防我的数据变大,我的logstach conf文件现在是:

input {
    jdbc {
        # Postgres jdbc connection string to our database, mydb
        jdbc_connection_string => "xxx"
        # The user we wish to execute our statement as
        jdbc_user => "xxx"
        jdbc_password => "xxx"
        # The path to our downloaded jdbc driver
        jdbc_driver_library => "xxx"
        # The name of the driver class for Postgresql
        jdbc_driver_class => "org.postgresql.Driver"
        # our query
        statement => "select * from tom_test2"

        jdbc_page_size => 1000
        jdbc_paging_enabled => true
    }
}


output {
    elasticsearch {
        hosts => ["xxx"]
        index => "tom"
        document_type => "tom_test"
    }
}

我的计数现在错了:

GET tom/tom_test/_search

  "hits": {
    "total": 106174,
    "max_score": 1,
}

为176805-106174 =缺少70631行

2 个答案:

答案 0 :(得分:0)

你面临这种情况的原因 - 你有订购问题:你的查询并没有控制收到数据的顺序,一般来说postgresql不应该保证在无序的后续寻呼电话中你不会这样做。 t获取相同的数据:这会产生一些情况,当某些数据根本不被提取,并且一些数据将被多次获取:(即使在这些调用期间未修改数据时,后台真空工作者可能会改变顺序物理文件中的数据,从而重现描述的情况。

在您的对帐单SELECT * FROM tom_test2 ORDER BY id中添加订单并为您的数据分页。但请注意:在这种情况下,您上传​​到elasticsearch将无法确保表格的精确副本。其原因在于,在后续页面请求的logstash处理期间,在即将到来的页面中引入了数据更新,即您在第1页上传到10000并且更新发生在第10001页和第20000页上的数据,然后是否则...所以你的数据一致性有问题。

或者,如果您想获取所有数据并在logstash上慷慨地使用内存...,那么您需要控制jdbc_fetch_size参数:即您执行相同的SELECT * FROM tom_test2。使用这种方法,您将创建一个查询结果集,但是" pump"在你的"抽水"不会导致你:你将在查询开始时获取状态。

答案 1 :(得分:0)

因为jdbc_page_size中的jdbc_page_size中的查询之间的排序无法保证为documentation of jdbc_paging_enabled中的警告。

我建议使用jdbc_fetch_size而不是UserName nvarchar(50)作为documentation also says that用于大型结果集。

P.S:有时;)在http://discuss.elastic.co询问你的问题,弹性维护者可以更好地回答