2017-02-21 41 views
0

我有一个要求,我需要从Oracle数据库快速获取数千万的记录,把每个记录成JSON格式的最终​​饲料中Elasticsearch饲料所取得的数据它在Elasticsearch中。
从数据库抓取到Elasticsearch喂食的整个过程,最好的方法是什么?如何获取的记录数千万快捷,使用Java

回答

0

TL; DR:使用logstash,读到它here

加长版:你应该找到自己一个兼容JDBC驱动程序,然后告诉logstash在哪里可以找到你的表。从上面的页面的例子是PostgreSQL的,但方法是一样的:

所以从该页面直接:

create table contacts (
    uid serial, 
    email VARCHAR(80) not null, 
    first_name VARCHAR(80) NOT NULL, 
    last_name VARCHAR(80) NOT NULL 
); 
INSERT INTO contacts(email, first_name, last_name) VALUES('[email protected]', 'Jim', 'Smith'); 
INSERT INTO contacts(email, first_name, last_name) VALUES(null, 'John', 'Smith'); 
INSERT INTO contacts(email, first_name, last_name) VALUES('[email protected]', 'Carol', 'Smith'); 
INSERT INTO contacts(email, first_name, last_name) VALUES('[email protected]', 'Sam', null); 

如果我们要插入表中,我们可以用这个配置这样做:

# file: simple-out.conf 
input { 
    jdbc { 
     # Postgres jdbc connection string to our database, mydb 
     jdbc_connection_string => "jdbc:postgresql://localhost:5432/mydb" 
     # The user we wish to execute our statement as 
     jdbc_user => "postgres" 
     # The path to our downloaded jdbc driver 
     jdbc_driver_library => "/path/to/postgresql-9.4-1201.jdbc41.jar" 
     # The name of the driver class for Postgresql 
     jdbc_driver_class => "org.postgresql.Driver" 
     # our query 
     statement => "SELECT * from contacts" 
    } 
} 
output { 
    stdout { codec => json_lines } 
} 

,并调用它像这样:

logstash-1.5.3/bin/logstash -f simple-out.conf Logstash startup 

更多的例子可有

+0

我想用Logstash的,但事实证明,该工具无法处理嵌套的对象即转向表(扁平结构)转换成JSON状结构 –

+0

我真的不知道你的意思。至少在我看来,弹性搜索的大多数用法是采用嵌套结构(例如关系数据库)并将其转变为平面结构(表示为JSON部分的文档列表)。但这可能只是一种语言/命名的事情。我仍然试着像上面那样修复它,所以把你的完整结果放在一行中,如果可能的话,把它做成映射。如果你有一个一对多的关系,而且行数不可预测,那么你运气不好,你只需要编写一些创建文档的代码,并且我猜想调用'_bulk'。 – Nanne

+0

我明白你的观点。但是,你将如何摆脱源自RDB的数据的嵌套结构?我相信只要数据来自RDB,那么表 –