我正在尝试使用logstash jdbc输入将所有订单数据导入elasticsearch。 sql查询涉及7个表的连接,并且在加入后没有可能的索引,并且表之间存在一对多的关系。加入后约有3M行。
我想逐日导入订单数据,因为没有任何记录,而是针对完成订单运行整个查询直到日期并对它们进行分页。如果我查询整个数据,数据库就会计算出记录本身的数量。
如何在不停止logstash和动态配置SQL日期参数的情况下,日复一日地运行导入。
这是我当前的logstash作业配置
input {
jdbc {
jdbc_connection_string => "jdbc:mysql://dbhostname:3306/mydatabase?zeroDateTimeBehavior=CONVERT_TO_NULL"
jdbc_user => "username"
jdbc_password => "password"
jdbc_driver_library => "/home/username/mysql-connector-java-8.0.11.jar"
jdbc_driver_class => "com.mysql.jdbc.Driver"
statement => "select * from table1 t1, table2 t2 ,table3 t3 , table4 t4, table5 t5, table6 t6 where some_condition and some_other_condition and t1.created_at between 'date1_start' and 'date1_end'"
}
}
output {
stdout { codec => json_lines }
elasticsearch {
"hosts" => "localhost:9200"
"index" => "orderdata_prod"
"document_type" => "data"
}
}
我想用新的日期值动态更改配置中提供的语句。我怎样才能做到这一点?或者有没有其他方法可以导入这些数据?
答案 0 :(得分:0)
我想您可能担心生产数据库可能会崩溃,但您可以使用logstash的分页来将单个查询分解为多个较小的查询来降低风险。但是你应该一次性运行导入,因为不能保证查询之间的顺序。
如果要限制每个查询下载100 000行,请在logstsh配置文件中添加这两个参数:
jdbc_paging_enabled => true
jdbc_page_size => 100000
您还可以尝试使用fetch size参数,与db的默认值相比降低它,但请注意,此参数只是jdbc的提示,有时可能无效。例如,Oracle将默认提取大小设置为10,因此您可以将其降低为5:
jdbc_fetch_size => 5