SOLR - лучший подход для импорта 20 миллионов документов из CSV-файла - PullRequest
14 голосов
/ 26 февраля 2012

Моя текущая задача - найти лучший подход для загрузки миллионов документов в solr.Файл данных - это экспорт из БД в формате csv.

В настоящее время я думаю о том, чтобы разделить файл на более мелкие файлы и создать сценарий, в то время как размещать файлы меньшего размера с помощью curl.заметил, что если вы публикуете большое количество данных, большую часть времени запрос прерывается.

Я смотрю на импортер данных, и это кажется хорошим вариантом

Любые другие идеи высоко ценятся

Спасибо

Ответы [ 5 ]

22 голосов
/ 26 февраля 2012

Если база данных уже не является частью вашего решения, я бы не стал добавлять дополнительную сложность к вашему решению. Цитируя SOLR FAQ , ваш контейнер сервлета выдает время ожидания сеанса.

На мой взгляд, у вас есть несколько вариантов (в моем порядке предпочтений):

Увеличение времени ожидания контейнера

Увеличить время ожидания контейнера. (параметр «maxIdleTime», если вы используете встроенный экземпляр Jetty).

Я предполагаю, что вы только иногда индексируете такие большие файлы? Временное увеличение времени ожидания может быть просто самым простым вариантом.

Разделить файл

Вот простой сценарий Unix, который выполнит эту работу (Разделение файла на 500 000 строк):

split -d -l 500000 data.csv split_files.
for file in `ls split_files.*`
do  
curl 'http://localhost:8983/solr/update/csv?fieldnames=id,name,category&commit=true' -H 'Content-type:text/plain; charset=utf-8' --data-binary @$file
done

Разобрать файл и загрузить кусками

Следующий скрипт groovy использует opencsv и solrj для анализа файла CSV и передачи изменений в Solr через каждые 500 000 строк.

import au.com.bytecode.opencsv.CSVReader

import org.apache.solr.client.solrj.SolrServer
import org.apache.solr.client.solrj.impl.CommonsHttpSolrServer
import org.apache.solr.common.SolrInputDocument

@Grapes([
    @Grab(group='net.sf.opencsv', module='opencsv', version='2.3'),
    @Grab(group='org.apache.solr', module='solr-solrj', version='3.5.0'),
    @Grab(group='ch.qos.logback', module='logback-classic', version='1.0.0'),
])

SolrServer server = new CommonsHttpSolrServer("http://localhost:8983/solr/");

new File("data.csv").withReader { reader ->
    CSVReader csv = new CSVReader(reader)
    String[] result
    Integer count = 1
    Integer chunkSize = 500000

    while (result = csv.readNext()) {
        SolrInputDocument doc = new SolrInputDocument();

        doc.addField("id",         result[0])
        doc.addField("name_s",     result[1])
        doc.addField("category_s", result[2])

        server.add(doc)

        if (count.mod(chunkSize) == 0) {
            server.commit()
        }
        count++
    }
    server.commit()
}
12 голосов
/ 11 октября 2012

В SOLR 4.0 (в настоящее время в бета-версии) CSV из локального каталога можно импортировать напрямую с помощью UpdateHandler.Изменяя пример из SOLR Wiki

curl http://localhost:8983/solr/update?stream.file=exampledocs/books.csv&stream.contentType=text/csv;charset=utf-8

И это приводит к потоковой передаче файла из локального расположения, поэтому нет необходимости разбивать его на части и POST через HTTP.

3 голосов
/ 13 сентября 2016

Приведенные выше ответы действительно хорошо объяснили стратегии приема с одного компьютера.

Несколько дополнительных вариантов, если у вас есть инфраструктура больших данных и вы хотите реализовать распределенный конвейер приема данных.

  1. Используйте sqoop для переноса данных в hadoop или поместите CSV-файл вручную в hadoop.
  2. Используйте один из следующих коннекторов для ввода данных:

hive-solrсоединитель , искровый соединитель .

PS:

  • Убедитесь, что межсетевой экран не блокирует соединение между клиентомузлы и узлы solr / solrcloud.
  • Выберите правильную фабрику каталогов для загрузки данных, если поиск в режиме реального времени не требуется, используйте StandardDirectoryFactory.
  • Если вы получаете ниже исключения в клиентских журналах во времяПрием внутрь, а затем настройка autoCommit и autoSoftCommit конфигурации в файле solrconfig.xml.

SolrServerException: нет доступных SolrServer для обработки этого запроса

1 голос
/ 26 февраля 2012

Обязательно сначала загрузите их в обычную базу данных. Существуют всевозможные инструменты для работы с CSV (например, postgres 'COPY ), поэтому это должно быть легко. Использовать Data Import Handler также довольно просто, так что это выглядит как самый удобный способ загрузки ваших данных. Этот метод также будет быстрее, поскольку у вас не будет ненужных сетевых / HTTP-издержек.

0 голосов
/ 31 марта 2014

Справочное руководство говорит, что ConcurrentUpdateSolrServer можно / нужно использовать для массовых обновлений.

Javadocs несколько некорректны ( v 3.6.2 , v 4.7.0 ):

ConcurrentUpdateSolrServer буферизует все добавленные документы и записиих в открытые HTTP-соединения.

Он не буферизуется бесконечно, но до int queueSize, который является параметром конструктора.

...