我正在尝试确定一种可以将数据加载到弹性搜索的方法。 AWS-ES提供了bulk-api,但是aws对有效负载大小设置了限制。
请让我知道从DB2提取数据并将其放入AWS-ES的最快方法是什么。记录数约为5000万,每条记录可能具有1到3 KB的有效负载。
我已经尝试过使用Java模块并通过API调用将数据放入ES,但这非常慢。
有没有可用的 ETL工具或任何服务可以读取JSON或CSV并将数据放入ES?
答案 0 :(得分:2)
您可以使用Logstash一次,也可以连续地从数据库读取数据到Elasticsearch。按照instructions的说明安装Logstash,然后只需要一个JDBC jar来存储数据库和Logstash的配置文件。配置文件模板:
input {
jdbc {
jdbc_driver_library => "LOCATION_OF_db2jcc4.jar"
jdbc_driver_class => "com.ibm.db2.jcc.DB2Driver"
jdbc_connection_string => "jdbc:db2://_DB_CONNECTION_DETAILS"
jdbc_user => "user"
jdbc_password => "pass"
jdbc_paging_enabled => "true" #Useful for big data sets
jdbc_fetch_size => "50000"
jdbc_page_size => 100000
#schedule => "* * * * *" #Uncomment if you want to run your query continuously
statement => "SELECT * from table" #Query that selects data which you want to download
}
}
output{
elasticsearch {
index => "YOUR_INDEX_NAME-%{+YYYY.MM.dd}"
hosts => ["localhost:9200"]
}
创建配置文件后,启动Logstash,它将开始从DB导入数据。导入大数据集可能会导致一些问题,因此您至少应将5 GB
的ram分配给Logstash,这样更好。如果出现问题,则应调整jdbc_fetch_size
和jdbc_page_size
参数。
如果要连续从数据库下载数据,例如仅下载最新数据,请阅读有关sql_last_value
参数的信息。
编辑: 您还可以使用Amazon Elasticsearch Output插件将索引输出到AWS ES,因此不必配置终端节点,可以阅读如何安装插件here。使用插件的输出配置:
output {
amazon_es {
hosts => ["foo.us-east-1.es.amazonaws.com"]
region => "us-east-1"
aws_access_key_id => 'ACCESS_KEY'
aws_secret_access_key => 'SECRET_KEY'
index => "YOUR_INDEX_NAME-%{+YYYY.MM.dd}"
}
}
解释如何使用此插件集成Logstash的视频: https://www.oreilly.com/learning/how_do_i_integrate_logstash_with_amazons_elasticsearch_service_es
答案 1 :(得分:0)
您好,您可以使用simpe nodejs小型应用程序。 我尝试了许多解决方案(包括logstash),但发现最有用的方法是使用nodejs编写小的代码。
我在本地计算机上使用10K记录的JSON文件进行了测试(性能低下),总计35MB。
要求:nodejs,npm
npm install fs
npm install etl
npm install JSONStream
npm install elasticsearch
index.js
文件,并将以下代码粘贴到您的数据中(elasticsearch服务器,json文件)。 在这种情况下,我将json数据文件放在同一文件夹中。 将以下代码粘贴到index.js中
var etl = require('etl');
var fs = require('fs');
var JSONStream = require('JSONStream');
var elasticsearch = require('elasticsearch');
//change with your data
var client = new elasticsearch.Client({
host: 'localhost:9200',
log: 'trace'
});
var readStream = fs.createReadStream('file.json') //change with your filename
readStream
.pipe(JSONStream.parse('*'))
.pipe(etl.collect(100))
.pipe(etl.elastic.index(client,'testindex','testtype')) //testindex(your index)- testtype your es type
运行node index.js
它如何工作?
声明所需的模块
创建ES客户端并连接
读取创建流的json文件
通过流传输,解析每个JSON对象(我的文件包含10K对象)
使用etl收集100个对象
索引elasticsearch添加收集的100个对象
使用ETL,您还可以导入csv(和其他格式)
更多信息和规格:ETL,JSONStream,Elasticsearch(nodejs)