场景:-我正在尝试从Oracle (几百万个记录)导入一个大型数据集到ElasticSearch中。-我能够使用logstash输入插件导入数据。
发布:-它需要很长时间(5小时)才能完成。
发布于 2016-06-27 19:01:59
您可以首先使用jdbc_fetch_size,下一步是在几个节点上运行导入,因为每个节点将sql查询拆分为不重叠的集合,如select * from XX where id between 0 and 1000000。
您还可以在索引大容量之前将ES索引副本的数量设置为0,然后再将其更改。当然,使用批量索引API具有良好的批处理大小和并行性。
发布于 2017-10-19 08:36:59
您可以使用
:sql_last_value
选项可以使用调度程序增量地从数据库中获取数据。像下面这样的东西会有帮助。(假设您有一个ID字段)
input {
jdbc {
jdbc_connection_string => "jdbc:oracle:thin:IP:PORT:SID"
jdbc_user => "user"
jdbc_password => "password"
jdbc_driver_library => ".......\ojdbc8.jar"
jdbc_driver_class => "Java::oracle.jdbc.OracleDriver"
statement => "select * from (select * from TABLE where id >= :sql_last_value ORDER BY id ASC) rownum < 20"
use_column_value => true
tracking_column => id
tracking_column_type => "numeric"
schedule => "* * * * *"
} }
update: Refactored使用rownum和ORDER BY按照预定的顺序限制结果(在限制之前进行排序)。请参阅:https://blogs.oracle.com/oraclemagazine/on-rownum-and-limiting-results
使用分页可以获得相同的结果,但它存在性能问题。如果我们使用分页前:
input {
jdbc {
jdbc_connection_string => "jdbc:oracle:thin:IP:PORT:SID"
jdbc_user => "user"
jdbc_password => "password"
jdbc_driver_library => ".......\ojdbc8.jar"
jdbc_driver_class => "Java::oracle.jdbc.OracleDriver"
jdbc_page_size => 20
jdbc_paging_enabled => true
statement => "select * from TABLE"
}
}但是这个会被包裹
“从表中选择*”
喜欢
选择* from (选择"T1".*,ROWNUM "X_SEQUEL_ROW_NUMBER_X“从(SELECT * FROM (SELECT * FROM ) "T1") "T1") "T1”其中("X_SEQUEL_ROW_NUMBER_X“> 0)和(”X_SEQUEL_ROW_NUMBER_X“<= (0 +20));
并将通过根据指定的jdbc_page_size (本例中为20)除以查询来运行,而不需要调度程序。但这种方法显然存在性能问题。
发布于 2017-02-13 10:32:19
您可以在同一个配置文件中放置更多的jdbc输入插件。我觉得挺好的。
即:
输入{ jdbc {.}
jdbc {
...
}}
https://stackoverflow.com/questions/38061128
复制相似问题