SOLR Out Of Memory Ошибка при чтении / индексации большого индекса - PullRequest
3 голосов
/ 30 марта 2012

Я сталкиваюсь с ошибкой OOM в Solr при индексации больших объемов данных. Я знаю, что общий совет - разделить индекс на осколки, но на самом деле это уже так. Я индексирую осколки, и дальнейшее разделение на данный момент не вариант. Я хочу понять, что происходит, и почему я получаю эту ошибку, и если есть что-то, что я могу с этим поделать, кроме разделения или выделения большего количества оперативной памяти.

Мне было бы грустно, если бы в этом случае потребление оперативной памяти было линейным (или хуже), я бы предпочел, чтобы оно было сублинейным.

Дело в том, что я индексирую документы случайными строками (таким образом, словарь очень и очень большой). Каждый документ имеет пару полей по 20-30 символов и одно поле по 200-500 символов. Размер индекса в каждом фрагменте составляет около 250-260 ГБ, каждый экземпляр Solr, обрабатывающий этот индекс, имеет около 4 ГБ памяти. Когда произошло OOM, после его перезапуска Solr HeapDump выглядел примерно так же, так что он, вероятно, связан не с индексацией, а с Solr Searcher. Непосредственно перед OOM самые большие объекты heapdump выглядят следующим образом:

<tree type="Heap walker - Biggest objects">
  <object leaf="false" class="org.apache.solr.core.SolrCore" objectId="0xf02c" type="instance" retainedBytes="120456864" retainedPercent="97.4">
    <outgoing leaf="false" class="org.apache.solr.search.SolrIndexSearcher" objectId="0xfb52" type="instance" retainedBytes="120383232" retainedPercent="97.3" referenceType="not specified" referenceName="[transitive reference]">
      <outgoing leaf="false" class="org.apache.lucene.index.ReadOnlySegmentReader" objectId="0x1018e" type="instance" retainedBytes="8161688" retainedPercent="6.6" referenceType="not specified" referenceName="[transitive reference]"/>
      <outgoing leaf="false" class="org.apache.lucene.index.ReadOnlySegmentReader" objectId="0x10185" type="instance" retainedBytes="8148072" retainedPercent="6.6" referenceType="not specified" referenceName="[transitive reference]"/>
      <outgoing leaf="false" class="org.apache.lucene.index.ReadOnlySegmentReader" objectId="0x10188" type="instance" retainedBytes="8138232" retainedPercent="6.6" referenceType="not specified" referenceName="[transitive reference]"/>
      <outgoing leaf="false" class="org.apache.lucene.index.ReadOnlySegmentReader" objectId="0x10186" type="instance" retainedBytes="8129160" retainedPercent="6.6" referenceType="not specified" referenceName="[transitive reference]"/>
      <outgoing leaf="false" class="org.apache.lucene.index.ReadOnlySegmentReader" objectId="0x10191" type="instance" retainedBytes="8124608" retainedPercent="6.6" referenceType="not specified" referenceName="[transitive reference]"/>
      <outgoing leaf="false" class="org.apache.lucene.index.ReadOnlySegmentReader" objectId="0x1018a" type="instance" retainedBytes="8123144" retainedPercent="6.6" referenceType="not specified" referenceName="[transitive reference]"/>

      <outgoing leaf="false" class="org.apache.lucene.index.ReadOnlySegmentReader" objectId="0x10192" type="instance" retainedBytes="8100904" retainedPercent="6.5" referenceType="not specified" referenceName="[transitive reference]"/>
      <outgoing leaf="false" class="org.apache.lucene.index.ReadOnlySegmentReader" objectId="0x10190" type="instance" retainedBytes="8097984" retainedPercent="6.5" referenceType="not specified" referenceName="[transitive reference]"/>
      <outgoing leaf="false" class="org.apache.lucene.index.ReadOnlySegmentReader" objectId="0x1018b" type="instance" retainedBytes="8096160" retainedPercent="6.5" referenceType="not specified" referenceName="[transitive reference]"/>
      <outgoing leaf="false" class="org.apache.lucene.index.ReadOnlySegmentReader" objectId="0x1018d" type="instance" retainedBytes="8081656" retainedPercent="6.5" referenceType="not specified" referenceName="[transitive reference]"/>
      <outgoing leaf="false" class="org.apache.lucene.index.ReadOnlySegmentReader" objectId="0x10187" type="instance" retainedBytes="8042504" retainedPercent="6.5" referenceType="not specified" referenceName="[transitive reference]"/>
      <outgoing leaf="false" class="org.apache.lucene.index.ReadOnlySegmentReader" objectId="0x1018c" type="instance" retainedBytes="8039336" retainedPercent="6.5" referenceType="not specified" referenceName="[transitive reference]"/>
      <outgoing leaf="false" class="org.apache.lucene.index.ReadOnlySegmentReader" objectId="0x10189" type="instance" retainedBytes="8036952" retainedPercent="6.5" referenceType="not specified" referenceName="[transitive reference]"/>
      <outgoing leaf="false" class="org.apache.lucene.index.ReadOnlySegmentReader" objectId="0x1018f" type="instance" retainedBytes="7948568" retainedPercent="6.4" referenceType="not specified" referenceName="[transitive reference]"/>
      <outgoing leaf="false" class="org.apache.lucene.index.ReadOnlySegmentReader" objectId="0x10195" type="instance" retainedBytes="832448" retainedPercent="0.7" referenceType="not specified" referenceName="[transitive reference]"/>

      <outgoing leaf="false" class="org.apache.lucene.index.ReadOnlySegmentReader" objectId="0x10196" type="instance" retainedBytes="830584" retainedPercent="0.7" referenceType="not specified" referenceName="[transitive reference]"/>
      <outgoing leaf="false" class="org.apache.lucene.index.ReadOnlySegmentReader" objectId="0x10194" type="instance" retainedBytes="829232" retainedPercent="0.7" referenceType="not specified" referenceName="[transitive reference]"/>
      <outgoing leaf="false" class="org.apache.lucene.index.ReadOnlySegmentReader" objectId="0x10197" type="instance" retainedBytes="828808" retainedPercent="0.7" referenceType="not specified" referenceName="[transitive reference]"/>
      <outgoing leaf="false" class="org.apache.lucene.index.ReadOnlySegmentReader" objectId="0x10198" type="instance" retainedBytes="827312" retainedPercent="0.7" referenceType="not specified" referenceName="[transitive reference]"/>
      <outgoing leaf="false" class="org.apache.lucene.index.ReadOnlySegmentReader" objectId="0x10199" type="instance" retainedBytes="824736" retainedPercent="0.7" referenceType="not specified" referenceName="[transitive reference]"/>
      <outgoing leaf="false" class="org.apache.lucene.index.ReadOnlySegmentReader" objectId="0x1019a" type="instance" retainedBytes="822608" retainedPercent="0.7" referenceType="not specified" referenceName="[transitive reference]"/>
      <outgoing leaf="false" class="org.apache.lucene.index.ReadOnlySegmentReader" objectId="0x10193" type="instance" retainedBytes="783424" retainedPercent="0.6" referenceType="not specified" referenceName="[transitive reference]"/>
      <cutoff objectCount="96" totalSizeBytes="534976" maximumSingleSizeBytes="87560"/>
    </outgoing>

    <cutoff objectCount="53" totalSizeBytes="73496" maximumSingleSizeBytes="40992"/>
  </object>
  <object leaf="false" class="org.mortbay.jetty.webapp.WebAppClassLoader" objectId="0xdf88" type="instance" retainedBytes="420208" retainedPercent="0.3"/>
  <object leaf="false" class="org.apache.solr.core.SolrConfig" objectId="0xe5f5" type="instance" retainedBytes="184976" retainedPercent="0.1"/>
 ..... 

Простой дамп Jmap выглядит так:

Attaching to process ID 27000, please wait...
Debugger attached successfully.
Server compiler detected.
JVM version is 20.5-b03

using thread-local object allocation.
Parallel GC with 2 thread(s)

Heap Configuration:
   MinHeapFreeRatio = 40
   MaxHeapFreeRatio = 70
   MaxHeapSize      = 268435456 (256.0MB)
   NewSize          = 1310720 (1.25MB)
   MaxNewSize       = 17592186044415 MB
   OldSize          = 5439488 (5.1875MB)
   NewRatio         = 2
   SurvivorRatio    = 8
   PermSize         = 21757952 (20.75MB)
   MaxPermSize      = 85983232 (82.0MB)

Heap Usage:
PS Young Generation
Eden Space:
   capacity = 31719424 (30.25MB)
   used     = 17420488 (16.61347198486328MB)
   free     = 14298936 (13.636528015136719MB)
   54.92056854500258% used
From Space:
   capacity = 26673152 (25.4375MB)
   used     = 10550856 (10.062080383300781MB)
   free     = 16122296 (15.375419616699219MB)
   39.55608995892199% used
To Space:
   capacity = 27000832 (25.75MB)
   used     = 0 (0.0MB)
   free     = 27000832 (25.75MB)
   0.0% used
PS Old Generation
   capacity = 178978816 (170.6875MB)
   used     = 168585552 (160.7757110595703MB)
   free     = 10393264 (9.911788940429688MB)
   94.19302002757689% used
PS Perm Generation
   capacity = 42008576 (40.0625MB)
   used     = 41690016 (39.758697509765625MB)
   free     = 318560 (0.303802490234375MB)
   99.24167865152106% used

Я не вижу здесь ничего, что могло бы дать мне какие-либо подсказки относительно того, как с этим бороться, кроме как просто дать больше оперативной памяти, что в общем случае не является решением, я хотел бы знать, что происходит Почему Searcher и его ReadOnlySegmentReaders занимают всю память и действительно ли они должны, могу ли я что-то с этим сделать?

UPDATE: Я провел тест с гораздо меньшим словарем из 150 тысяч слов (не случайных слов), я достиг размера индекса около 350 ГБ и OOME не существует, так что это не связано напрямую с размером индекса, вероятно, это нужно сделать больше с размером вектора термина (уникальные термины). Но все же я хотел бы понять ограничения, которые у меня есть, и как я могу их обойти.

1 Ответ

0 голосов
/ 30 марта 2012

Все ваши документы индексируются в каждом «сегменте» вашей фермы серверов.Нет встроенной поддержки распределенной индексации, но ваш метод может быть таким же простым, как метод циклического перебора: индексировать каждый документ на следующем сервере в круге.Также будет работать простая система хеширования, и Solr Wiki предлагает uniqueId.hashCode ()% numServers в качестве адекватной функции хеширования.

Имейте в виду, что Solr не вычисляет универсальные частоты term / doc.В широком масштабе маловероятно, чтобы значение tf / idf рассчитывалось на уровне сегментов - однако, если ваша коллекция сильно перекошена при распределении по серверам, вы можете не согласиться с результатами релевантности.Вероятно, лучше всего случайным образом распространять документы на ваши осколки.note >>>>>>> попробуйте использовать хеш-код вместо случайных строк для индексации документов

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...