【问题标题】:Elasticsearch Bulk Write is slow using Scan and ScrollElasticsearch Bulk Write 使用 Scan 和 Scroll 很慢
【发布时间】:2015-10-14 07:42:42
【问题描述】:

我目前遇到了一个我真正陷入困境的问题。 我正在尝试解决一个问题,我必须输出 Elasticsearch 文档并将它们写入 csv。文档从 50,000 到 500 万不等。 我遇到了严重的性能问题,我觉得我在这里遗漏了一些东西。

现在我有一个包含 400,000 个文档的数据集,我正在尝试对其进行扫描和滚动,最终将被格式化并写入 csv。但是输出的时间是20分钟!!这太疯狂了。

这是我的脚本:

import elasticsearch
import elasticsearch.exceptions 
import elasticsearch.helpers as helpers
import time

es =  elasticsearch.Elasticsearch(['http://XX.XXX.XX.XXX:9200'],retry_on_timeout=True)

scanResp = helpers.scan(client=es,scroll="5m",index='MyDoc',doc_type='MyDoc',timeout="50m",size=1000)

resp={}
start_time = time.time()
for resp in scanResp:
    data = resp
    print data.values()[3]

print("--- %s seconds ---" % (time.time() - start_time))

我正在为 Elasticsearch 使用托管的 AWS m3.medium 服务器。

谁能告诉我我在这里做错了什么?

【问题讨论】:

  • 您是否尝试将 size 参数设置为 10 或 100?
  • @Rob 是的,我做到了,我从 10 开始,然后是 50、100,150、200、500、100,然后继续更改它。我得到的最好的情况是在 200 时需要 18 秒才能输出 4000 条记录,这又是非常慢的。我想我肯定错过了除了 size 参数之外的其他东西。

标签: elasticsearch


【解决方案1】:

将 ES 数据输出到 CSV 的简单解决方案是使用带有 elasticsearch input 的 Logstash 和带有以下 es2csv.conf 配置的 csv output

input {
  elasticsearch {
   host => "localhost"
   port => 9200
   index => "MyDoc"
  }
}
filter {
 mutate {
  remove_field => [ "@version", "@timestamp" ]
 }
}
output {
 csv {
   fields => ["field1", "field2", "field3"]  <--- specify the field names you want 
   path => "/path/to/your/file.csv"
 }
}

然后您可以使用bin/logstash -f es2csv.conf 轻松导出数据

【讨论】:

    猜你喜欢
    • 2020-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-21
    • 1970-01-01
    相关资源
    最近更新 更多