2015-10-14 186 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