Wie benutzt man elasticsearch.helpers.streaming_bulk
Kann jemand Ratschläge geben, wie die Funktion elasticsearch.helpers.streaming_bulk anstelle von elasticsearch.helpers.bulk zum Indizieren von Daten in elasticsearch verwendet werden kann.
Wenn ich einfach streaming_bulk anstelle von bulk ändere, wird nichts indiziert. Ich denke, es muss in einer anderen Form verwendet werden.
Code unten erstellt Index-, Typ- und Indexdaten aus der CSV-Datei in Teilen von 500 Elementen in elasticsearch. Es funktioniert einwandfrei, aber ich wandere, ist es möglich, die Leistung zu steigern. Deshalb möchte ich die streaming_bulk-Funktion ausprobieren.
Derzeit benötige ich 10 Minuten, um 1 Million Zeilen für ein CSV-Dokument mit 200 MB zu indizieren. Ich benutze zwei Maschinen, Centos 6.6 mit 8 CPUs, x86_64, CPU-MHz: 2499.902, Mem: 15.574G insgesamt. Ich bin mir nicht sicher, ob es schneller gehen kann.
es = elasticsearch.Elasticsearch([{'host': 'uxmachine-test', 'port': 9200}])
index_name = 'new_index'
type_name = 'new_type'
mapping = json.loads(open(config["index_mapping"]).read()) #read mapping from json file
es.indices.create(index_name)
es.indices.put_mapping(index=index_name, doc_type=type_name, body=mapping)
with open(file_to_index, 'rb') as csvfile:
reader = csv.reader(csvfile) #read documents for indexing from CSV file, more than million rows
content = {"_index": index_name, "_type": type_name}
batch_chunks = []
iterator = 0
for row in reader:
var = transform_row_for_indexing(row,fields, index_name, type_name,id_name,id_increment)
id_increment = id_increment + 1
#var = transform_row_for_indexing(row,fields, index_name, type_name)
batch_chunks.append(var)
if iterator % 500 == 0:
helpers.bulk(es,batch_chunks)
del batch_chunks[:]
print "ispucalo batch"
iterator = iterator + 1
# indexing of last batch_chunk
if len(batch_chunks) != 0:
helpers.bulk(es,batch_chunks)