Logstash-JDBC插件:将数百万条记录从Oracle导入ElasticSearch

时间:2016-06-27 18:47:57

标签: performance elasticsearch logstash logstash-jdbc

情景: - 我正在尝试将大型数据集从Oracle DB(少量百万记录)导入ElasticSearch。 - 我可以使用logstash jdbc输入插件导入数据。

问题: - 需要很长时间(5小时)才能完成。

  • 是否有更好的解决方案来缩短这段时间? 此类情景中的良好做法

3 个答案:

答案 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)划分查询。但是这种方法显然存在性能问题。