Страницы

Поиск по вопросам

четверг, 13 февраля 2020 г.

Индексируется только часть файлов

#база_данных #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"

Комментариев нет:

Отправить комментарий