#база_данных #elasticsearch #big_data
Необходимо проиндексировать большое количество (около 100к) файлов формата json разного
размера (на 100к файлов приходится в общем 1,2ГГб текстовой информации).
Пишу на python, соответственно использую стандартный модуль для работы с Elasticsearch.
Из состава использую функцию helpers.bulk таким образом:
es = Elasticsearch(ES_CLUSTER)
json_docs = []
for filename in os.listdir(os.getcwd()):
if filename.endswith('.json'):
with open(filename) as open_file:
json_docs.append(json.load(open_file))
helpers.bulk(ES_INDEX, ES_TYPE, json_docs)
В результате работы индексируется только 570 файлов. Причем заметил, что размер индекса
после каждого нового прогона программы сильно колеблется от 2-4мб до 15мб, хотя количество
проиндексированных файлов остается неизменным.
Размер индекса узнаю запросом:
curl 'localhost:9200/_cat/indices?v'
Очищаю так:
curl -XDELETE 'localhost:9200/_all/'
Видимо использую не оптимальный способ индексирования.
Ответы
Ответ 1
Очередь на индексацию в Elasticsearch по умолчанию ограничена.Вы пытаетесь скормить ему слишком много записей за раз. Это хоть и Bulk API, но работает он немного по другому: Необходимо отправлять порции в несколько сотен записей (подбирается экспериментально) es = Elasticsearch(ES_CLUSTER) json_docs = [] i=0 bulkSize=500 for filename in os.listdir(os.getcwd()): i++ if filename.endswith('.json'): with open(filename) as open_file: json_docs.append(json.load(open_file)) if len(json_docs) >= bulkSize: print(i, "current file:", datetime.now(), filename) try: helpers.bulk(ES_INDEX, ES_TYPE, json_docs) except Exception as error: print(error) del json_docs json_docs = [] //do not forget to put rest helpers.bulk(ES_INDEX, ES_TYPE, json_docs)Ответ 2
Мы в своем проекте (не python) тоже индексируем большое кол-во информации. Основные моменты: Мы не индексируем через API - curl из bash Наш скрипт преобразует данные в формат bulk и кусками по 1000 документов складывает в обычный текстовый файл. После обработки всех данных запускаем консольный скрипт: files=(${1}*.txt) total=${#files[@]}; count=0 pstr="[=======================================================================]" echo "Start export to ElasticSearch ${total} files with data" for i in ${1}*.txt; do curl -XPOST http://elastic.domain.conm/_bulk --data-binary @${i} &>/dev/null count=$(( $count + 1 )) pd=$(( $count * 73 / $total )) printf "\r%3d.%1d%% %.${pd}s" $(( $count * 100 / $total )) $(( ($count * 1000 / $total) % 10 )) $pstr done printf "\n"
Комментариев нет:
Отправить комментарий