情景: - 我正在尝试将大型数据集从Oracle DB(少量百万记录)导入ElasticSearch。 - 我可以使用logstash jdbc输入插件导入数据。
问题: - 需要很长时间(5小时)才能完成。
答案 0 :(得分:3)
您可以首先使用jdbc_fetch_size
,下一步将在多个节点上运行导入,因为每个节点将sql查询拆分为非重叠集合,如select * from XX where id between 0 and 1000000
。
您还可以在索引大批量之前将ES索引副本的数量设置为0,然后再将其更改回来。当然,使用具有良好批量大小和并行性的批量索引API。
答案 1 :(得分:0)
你可以在同一个配置文件中添加超过jdbc输入插件..它适用于我。
即:
输入{ jdbc { ... }
jdbc {
...
}
}
答案 2 :(得分:0)
您可以使用
: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 TABLE where id >= :sql_last_value and rownum < 20 order ORDER BY id ASC"
use_column_value => true
tracking_column => id
tracking_column_type => "numeric"
schedule => "* * * * *"
}
}
使用分页可以实现相同的结果,但它存在性能问题。如果我们使用分页 例如:
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"
}
}
但这将包装
“select * from TABLE”
喜欢
SELECT * FROM(SELECT“T1”。*,ROWNUM“X_SEQUEL_ROW_NUMBER_X”FROM(SELECT * FROM(select * from TABLE)“T1”)“T1”)“T1”WHERE((“X_SEQUEL_ROW_NUMBER_X”&gt; 0) AND(“X_SEQUEL_ROW_NUMBER_X”&lt; =(0 + 20)));
并且将在没有调度程序的情况下运行,方法是根据指定的jdbc_page_size (本例中为20)划分查询。但是这种方法显然存在性能问题。