3

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

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

我已经尝试过使用 java 模块并通过 API 调用将数据放入 ES,但速度很慢。

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

4

2 回答 2

4

您好,您可以使用一个简单的 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. index elasticsearch 添加收集到的 100 个对象

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

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

于 2018-08-31T21:12:11.163 回答
2

您可以使用 Logstash 一次性或连续地从数据库中获取数据到 Elasticsearch。按照有关如何安装 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 输出插件将索引输出到 AWS ES,这样您就不必配置端点,您可以在此处阅读如何安装插件。使用插件输出配置:

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

于 2018-08-17T15:20:58.327 回答