2015-10-14 185 views
0

我目前遇到了一个问题,我真的陷入了困境。 我正试图解决一个问题,我必须输出Elasticsearch文档并将它们写入csv。文件范围从5万到5百万。 我遇到严重的性能问题,我感觉我在这里失去了一些东西。Elasticsearch批量写入速度很慢,使用扫描和滚动

现在我有一个数据集,我想扫描和滚动,最终将被格式化并写入csv的400,000个文档。但输出的时间是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服务器。

任何人都可以告诉我,我可能会在这里做错吗?

+0

难道您轻松导出数据尝试将大小参数设置为10或100? – Rob

+0

@Rob是的,我做了,我从10开始,然后是50,100,150,200,500,100,然后继续改变它。我得到的最好的情况是在200秒的时间里,需要18秒才能输出4000条记录,而这个记录又是非常慢的。我想我绝对缺少一些除尺寸参数外的其他东西。 –

回答

0

一个简单的解决方案,输出ES数据以CSV是使用Logstash与elasticsearch input并用以下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