Chunked UrlDataSource для Solr DataImportHandler - PullRequest
1 голос
/ 12 мая 2011

Я пытаюсь разбить источник данных на части для оптимального импорта данных в solr, и мне было интересно, можно ли использовать мастер-URL, который разбивает данные на фрагменты.

Например, в файле 1 может быть

<chunks>
  <chunk url="http://localhost/chunker?start=0&stop=100" />
  <chunk url="http://localhost/chunker?start=100&stop=200" />
  <chunk url="http://localhost/chunker?start=200&stop=300" />
  <chunk url="http://localhost/chunker?start=300&stop=400" />
  <chunk url="http://localhost/chunker?start=400&stop=500" />
  <chunk url="http://localhost/chunker?start=500&stop=600" />
</chunks>

с каждым URL-адресом чанка, что приводит к чему-то вроде

<items>
   <item data1="info1" />
   <item data1="info2" />
   <item data1="info3" />
   <item data1="info4" />
</iems>

Я работаю с 500+ миллионами записей, поэтому я думаю, что данные нужно будет разбить на части, чтобы избежать проблем с памятью (в это при использовании SQLEntityProcessor).Я также хотел бы избежать 500+ миллионов веб-запросов, так как это может дорого обойтись, я думаю

Ответы [ 2 ]

7 голосов
/ 14 мая 2011

Из-за отсутствия примеров в интернете я решил опубликовать то, что я в конечном итоге использовал

<?xml version="1.0" encoding="utf-8"?>
<result>
  <dataCollection func="chunked">
    <data info="test" info2="test" />
    <data info="test" info2="test" />
    <data info="test" info2="test" />
    <data info="test" info2="test" />
    <data info="test" info2="test" />
    <data info="test" info2="test" />
    <data hasmore="true" nexturl="http://server.domain.com/handler?start=0&amp;end=1000000000&amp;page=1&amp;pagesize=10"
  </dataCollection>
</result>

Важно отметить, что я использую, укажите, что есть больше на следующей странице и предоставьтеURL на следующую страницу.Это соответствует документации Solr для DataImportHandlers .Обратите внимание, что в документации указано, что разбитый на страницы фид должен сообщать системе, что у него больше и где взять следующую партию.

<dataConfig>
    <dataSource name="b" type="URLDataSource" baseUrl="http://server/" encoding="UTF-8" />
    <document>
        <entity name="continue"
                dataSource="b"
                url="handler?start=${dataimport.request.startrecord}&amp;end=${dataimport.request.stoprecord}&amp;pagesize=100000"
                stream="true"
                processor="XPathEntityProcessor"
                forEach="/result/dataCollection/data"
                transformer="DateFormatTransformer"
                connectionTimeout="120000"
                readTimeout="300000"
                >
            <field column="id"  xpath="/result/dataCollection/data/@info" />
            <field column="id"  xpath="/result/dataCollection/data/@info" />
            <field column="$hasMore" xpath="/result/dataCollection/data/@hasmore" />
            <field column="$nextUrl" xpath="/result/dataCollection/data/@nexturl" />
        </entity>
    </document>

Обратите внимание на поля $ hasMore и $ nextUrl.Вы можете разместить с таймаутами.Я также рекомендую разрешить указание размера страницы (это помогает с настройками настройки, чтобы получить оптимальную скорость обработки).Я индексирую @ около 12,5 тыс. Записей в секунду, используя многоядерный (3) экземпляр solr на одном сервере с четырехъядерным процессором Xeon и 32 ГБ оперативной памяти.

Приложение, разбивающее на страницы результаты, использует ту же системукак и сервер SQL, хранящий данные.Я также передаю начальную и конечную позиции, чтобы минимизировать изменения конфигурации, когда мы в конечном итоге загружаем балансировку сервера solr ....

1 голос
/ 26 марта 2012

Сущность может быть вложена, чтобы делать то, что вы хотели изначально.Внутренний объект может ссылаться на внешнее поле, например url="${chunk.link}", где chunk - имя внешнего объекта, а link - имя поля.

<?xml version="1.0" encoding="windows-1250"?>
<dataConfig>
  <dataSource name="b" type="URLDataSource" baseUrl="http://server/" encoding="UTF-8" />
  <document>
    <entity name="chunk"
      dataSource="b"
      url="path/to/chunk.xml"
      stream="true"
      processor="XPathEntityProcessor"
      forEach="/chunks/chunk"
      transformer="DateFormatTransformer"
      connectionTimeout="120000"
      readTimeout="300000" >
      <field column="link" xpath="/chunks/chunk/@url" />
      <entity name="item"
        dataSource="b"
        url="${chunk.link}"
        stream="true"
        processor="XPathEntityProcessor"
        forEach="/items/item"
        transformer="DateFormatTransformer"
        connectionTimeout="120000"
        readTimeout="300000" >
        <field column="info"  xpath="/items/item/@info" />
      </entity>
    </entity>
</document>
</dataConfig>
.
...