向AWS ElasticSearch添加5000万条记录的最快方法

时间:2018-08-17 13:34:59

标签: java database elasticsearch pentaho aws-elasticsearch

我正在尝试确定一种可以将数据加载到弹性搜索的方法。 AWS-ES提供了bulk-api,但是aws对有效负载大小设置了限制。

请让我知道从DB2提取数据并将其放入AWS-ES的最快方法是什么。记录数约为5000万,每条记录可能具有1到3 KB的有效负载。

我已经尝试过使用Java模块并通过API调用将数据放入ES,但这非常慢。

有没有可用的 ETL工具任何服务可以读取JSON或CSV并将数据放入ES?

2 个答案:

答案 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_sizejdbc_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

  1. 创建一个新的工作文件夹。
  2. 转到创建的文件夹。
  3. 键入npm install fs
  4. 键入npm install etl
  5. 键入npm install JSONStream
  6. 键入npm install elasticsearch
  7. 创建一个新的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

它如何工作?

  1. 声明所需的模块

  2. 创建ES客户端并连接

  3. 读取创建流的json文件

  4. 通过流传输,解析每个JSON对象(我的文件包含10K对象)

  5. 使用etl收集100个对象

  6. 索引elasticsearch添加收集的100个对象

使用ETL,您还可以导入csv(和其他格式)

更多信息和规格:ETLJSONStreamElasticsearch(nodejs)