2017-09-23 15 views
6

Tôi muốn xuất bảng tom_test2 postgresql sang tìm kiếm đàn hồi. Bảng này có 176.805 hàng:logstach: jdbc_page_size không đổ tất cả dữ liệu của tôi vào tìm kiếm đàn hồi

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

sau Việc nhập khẩu logstach file conf một cách chính xác dữ liệu của tôi để tìm kiếm đàn hồi:

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" 
    } 
} 

Trong tìm kiếm đàn hồi:

GET tom/tom_test/_search 

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

tôi đang xóa index của tôi trong tìm kiếm đàn hồi:

delete tom 

Và bây giờ tôi muốn làm các hoạt động tương tự sử dụng jdbc_page_size trong trường hợp dữ liệu của tôi trở nên lớn hơn, file conf logstach của tôi bây giờ là:

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" 
    } 
} 

đếm của tôi bây giờ là sai:

GET tom/tom_test/_search 

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

như 176.805 -106174 = 70631 hàng bị thiếu

+1

Bất kỳ bản ghi trong logstash hoặc elasticsearch? Bất kỳ lý do nào để đặt một kích thước trang nhỏ như vậy? (mặc định là 100000) –

+0

Tôi nhận xét thứ hai của Julien, có thêm thông tin nào không? – Val

Trả lời

0

Lý do bạn phải đối mặt với điều này - bạn có vấn đề đặt hàng: truy vấn của bạn không kiểm soát thứ tự dữ liệu được nhận, và trong postgresql chung không nên đảm bảo rằng trong phân trang hậu quả không theo thứ tự gọi bạn không Không tìm nạp cùng một dữ liệu: điều này tạo ra tình huống khi một số dữ liệu sẽ không được tải xuống và một số dữ liệu sẽ được tìm nạp nhiều lần: (ngay cả khi dữ liệu không được sửa đổi trong các cuộc gọi này, nhân viên chân không nền có thể thay đổi thứ tự của dữ liệu trong tệp vật lý và do đó tạo lại tình huống được mô tả.

Hoặc thêm đơn hàng vào bảng sao kê SELECT * FROM tom_test2 ORDER BY id và trang dữ liệu của bạn. Nhưng lưu ý: trong trường hợp này, việc tải lên elasticsearch của bạn sẽ không đảm bảo bản sao chính xác của bảng tại thời điểm. Nguyên nhân của điều đó sẽ xảy ra, trong quá trình xử lý yêu cầu phân trang logstash, việc cập nhật dữ liệu trong trang sắp tới được giới thiệu, tức là bạn đang tải lên trang 1 đến 10000 và cập nhật dữ liệu trên trang 10001 và 20000, và sau đó ... vì vậy bạn có vấn đề về tính nhất quán của dữ liệu của bạn.

Hoặc nếu bạn muốn lấy tất cả các dữ liệu và hào phóng sử dụng bộ nhớ trên logstash ..., sau đó bạn cần phải kiểm soát các jdbc_fetch_size tham số: ví dụ bạn đang thực hiện với cùng SELECT * FROM tom_test2. Với cách tiếp cận này, bạn sẽ tạo ra một kết quả truy vấn đơn lẻ, nhưng sẽ "bơm" từng phần và sửa đổi dữ liệu trong quá trình "bơm" của bạn sẽ không gây ra cho bạn: bạn sẽ tìm nạp trạng thái tại thời điểm bắt đầu truy vấn.

0

Vì đặt hàng không được đảm bảo giữa các truy vấn trong jdbc_page_size như được cảnh báo trong documentation of jdbc_paging_enabled.

Tôi khuyên bạn nên sử dụng jdbc_fetch_size thay vì sử dụng jdbc_page_size làm documentation also says that cho các tập hợp kết quả lớn.

Tái bút: đôi khi;) đặt câu hỏi của bạn tại http://discuss.elastic.co được trả lời tốt hơn bằng cách bảo trì đàn hồi

Các vấn đề liên quan