Erro Solr durante carregamento em massa - org.apache.lucene.index.MergePolicy$MergeException
-
21-12-2019 - |
Pergunta
Estou recebendo muitas das seguintes exceções ao carregar milhões de registros em massa via sstableloader:
ERROR [Lucene Merge Thread #132642] 2014-07-29 00:35:01,252 CassandraDaemon.java (line 199) Exception in thread Thread[Lucene Merge Thread #132642,6,main]
org.apache.lucene.index.MergePolicy$MergeException: java.lang.IllegalStateException: failed
at org.apache.lucene.index.ConcurrentMergeScheduler.handleMergeException(ConcurrentMergeScheduler.java:545)
at org.apache.lucene.index.ConcurrentMergeScheduler$MergeThread.run(ConcurrentMergeScheduler.java:518)
Caused by: java.lang.IllegalStateException: failed
at org.apache.lucene.util.packed.DirectPackedReader.get(DirectPackedReader.java:93)
at org.apache.lucene.util.packed.BlockPackedReader.get(BlockPackedReader.java:86)
at org.apache.lucene.util.LongValues.get(LongValues.java:35)
at org.apache.lucene.codecs.lucene45.Lucene45DocValuesProducer$5.getOrd(Lucene45DocValuesProducer.java:459)
at org.apache.lucene.codecs.DocValuesConsumer$4$1.setNext(DocValuesConsumer.java:389)
at org.apache.lucene.codecs.DocValuesConsumer$4$1.hasNext(DocValuesConsumer.java:352)
at org.apache.lucene.codecs.lucene45.Lucene45DocValuesConsumer.addNumericField(Lucene45DocValuesConsumer.java:141)
at org.apache.lucene.codecs.lucene45.Lucene45DocValuesConsumer.addSortedField(Lucene45DocValuesConsumer.java:350)
at org.apache.lucene.codecs.perfield.PerFieldDocValuesFormat$FieldsWriter.addSortedField(PerFieldDocValuesFormat.java:116)
at org.apache.lucene.codecs.DocValuesConsumer.mergeSortedField(DocValuesConsumer.java:305)
at org.apache.lucene.index.SegmentMerger.mergeDocValues(SegmentMerger.java:197)
at org.apache.lucene.index.SegmentMerger.merge(SegmentMerger.java:116)
at org.apache.lucene.index.IndexWriter.mergeMiddle(IndexWriter.java:4058)
at org.apache.lucene.index.IndexWriter.merge(IndexWriter.java:3655)
at org.apache.lucene.index.ConcurrentMergeScheduler.doMerge(ConcurrentMergeScheduler.java:405)
at org.apache.lucene.index.ConcurrentMergeScheduler$MergeThread.run(ConcurrentMergeScheduler.java:482)
Caused by: java.io.EOFException: Read past EOF (resource: BBIndexInput(name=_13ms5_Lucene45_0.dvd))
at com.datastax.bdp.search.lucene.store.bytebuffer.ByteBufferIndexInput.switchCurrentBuffer(ByteBufferIndexInput.java:188)
at com.datastax.bdp.search.lucene.store.bytebuffer.ByteBufferIndexInput.readByte(ByteBufferIndexInput.java:129)
at org.apache.lucene.store.DataInput.readShort(DataInput.java:77)
at com.datastax.bdp.search.lucene.store.bytebuffer.ByteBufferIndexInput.readShort(ByteBufferIndexInput.java:89)
at org.apache.lucene.util.packed.DirectPackedReader.get(DirectPackedReader.java:64)
... 15 more
Vejo pelo rastreamento de exceção que tem algo a ver com valores longos e EOF.No entanto, não tenho ideia do que está provocando o erro.Os arquivos SSTable que estou tentando importar foram gerados por um programa Java (escrito por mim) que usa org.apache.cassandra.io.sstable.CQLSSTableWriter.
O esquema CF, o esquema Solr e o código do gerador SSTable podem ser encontrados aqui: https://www.dropbox.com/sh/1rpo3ixmz1bg9y2/AAA3aqlfzWEsNIwy79G9dASba
PS:
- Atualizei recentemente do DSE 4.1.3 para 4.5.1.Não me lembro de ter visto esse erro antes da atualização
- A biblioteca cassandra incluída no caminho de classe do gerador é a versão 2.0.8.Antes da atualização do DSE, ele usa bibliotecas da versão 2.0.5
- Topologia DSE:1 DC, 6 nós solr (vnodes desabilitados), RF 2
- Outra configuração DSE:LeveledCompaction, compactação LZ4, GossipingPropertyFileSnitch
- Especificações da máquina:CentOS 6.5 x64, JDK 1.7.0_55, hexacore, tamanho de heap 120 GB (temos consultas específicas que exigem isso), 128 GB de RAM total
Encontrei o erro inicialmente em 3 de 6 nós.Reiniciei todos eles e consegui importar mais de 150 milhões de registros sem erros.Mas quando deixei as importações sem supervisão enquanto durmo, foi quando o erro reapareceu em 1 de 6 nós.
Estou ficando bastante alarmado agora porque o número de registros indexados em cada nó (de acordo com a interface de administração do Solr) é menor em aproximadamente 60.000 registros em comparação com o número de linhas do Cassandra (de acordo com nodetool cfstats)
ATUALIZAR:
Ainda continuando a experimentar isso.A discrepância entre o número de documentos indexados (Solr) e documentos armazenados (Cassandra cfstats) está aumentando a cada dia
ATUALIZAÇÃO (13/08/2014):
Alterado o diretório de fábrica conforme sugerido por Rock Brain;mas o erro ocorreu novamente algumas horas após a importação contínua via sstableloader
ATUALIZAÇÃO (14/08/2014):
Curiosamente, percebi que na verdade estou recebendo duas exceções semelhantes (com a diferença sendo apenas o rastreamento de pilha do último "causado por":
Exceção 1:
ERROR [Lucene Merge Thread #24937] 2014-08-14 06:20:32,270 CassandraDaemon.java (line 199) Exception in thread Thread[Lucene Merge Thread #24937,6,main]
org.apache.lucene.index.MergePolicy$MergeException: java.lang.IllegalStateException: failed
at org.apache.lucene.index.ConcurrentMergeScheduler.handleMergeException(ConcurrentMergeScheduler.java:545)
at org.apache.lucene.index.ConcurrentMergeScheduler$MergeThread.run(ConcurrentMergeScheduler.java:518)
Caused by: java.lang.IllegalStateException: failed
at org.apache.lucene.util.packed.DirectPackedReader.get(DirectPackedReader.java:93)
at org.apache.lucene.util.packed.BlockPackedReader.get(BlockPackedReader.java:86)
at org.apache.lucene.util.LongValues.get(LongValues.java:35)
at org.apache.lucene.codecs.lucene45.Lucene45DocValuesProducer$5.getOrd(Lucene45DocValuesProducer.java:459)
at org.apache.lucene.codecs.DocValuesConsumer$4$1.setNext(DocValuesConsumer.java:389)
at org.apache.lucene.codecs.DocValuesConsumer$4$1.hasNext(DocValuesConsumer.java:352)
at org.apache.lucene.codecs.lucene45.Lucene45DocValuesConsumer.addNumericField(Lucene45DocValuesConsumer.java:141)
at org.apache.lucene.codecs.lucene45.Lucene45DocValuesConsumer.addSortedField(Lucene45DocValuesConsumer.java:350)
at org.apache.lucene.codecs.perfield.PerFieldDocValuesFormat$FieldsWriter.addSortedField(PerFieldDocValuesFormat.java:116)
at org.apache.lucene.codecs.DocValuesConsumer.mergeSortedField(DocValuesConsumer.java:305)
at org.apache.lucene.index.SegmentMerger.mergeDocValues(SegmentMerger.java:197)
at org.apache.lucene.index.SegmentMerger.merge(SegmentMerger.java:116)
at org.apache.lucene.index.IndexWriter.mergeMiddle(IndexWriter.java:4058)
at org.apache.lucene.index.IndexWriter.merge(IndexWriter.java:3655)
at org.apache.lucene.index.ConcurrentMergeScheduler.doMerge(ConcurrentMergeScheduler.java:405)
at org.apache.lucene.index.ConcurrentMergeScheduler$MergeThread.run(ConcurrentMergeScheduler.java:482)
Caused by: java.io.EOFException: Read past EOF (resource: BBIndexInput(name=_67nex_Lucene45_0.dvd))
at com.datastax.bdp.search.lucene.store.bytebuffer.ByteBufferIndexInput.switchCurrentBuffer(ByteBufferIndexInput.java:188)
at com.datastax.bdp.search.lucene.store.bytebuffer.ByteBufferIndexInput.readByte(ByteBufferIndexInput.java:129)
at org.apache.lucene.util.packed.DirectPackedReader.get(DirectPackedReader.java:64)
... 15 more
Exceção 2 (exatamente igual à exceção original no topo desta postagem):
ERROR [Lucene Merge Thread #24936] 2014-08-14 06:20:34,694 CassandraDaemon.java (line 199) Exception in thread Thread[Lucene Merge Thread #24936,6,main]
org.apache.lucene.index.MergePolicy$MergeException: java.lang.IllegalStateException: failed
at org.apache.lucene.index.ConcurrentMergeScheduler.handleMergeException(ConcurrentMergeScheduler.java:545)
at org.apache.lucene.index.ConcurrentMergeScheduler$MergeThread.run(ConcurrentMergeScheduler.java:518)
Caused by: java.lang.IllegalStateException: failed
at org.apache.lucene.util.packed.DirectPackedReader.get(DirectPackedReader.java:93)
at org.apache.lucene.util.packed.BlockPackedReader.get(BlockPackedReader.java:86)
at org.apache.lucene.util.LongValues.get(LongValues.java:35)
at org.apache.lucene.codecs.lucene45.Lucene45DocValuesProducer$5.getOrd(Lucene45DocValuesProducer.java:459)
at org.apache.lucene.codecs.DocValuesConsumer$4$1.setNext(DocValuesConsumer.java:389)
at org.apache.lucene.codecs.DocValuesConsumer$4$1.hasNext(DocValuesConsumer.java:352)
at org.apache.lucene.codecs.lucene45.Lucene45DocValuesConsumer.addNumericField(Lucene45DocValuesConsumer.java:141)
at org.apache.lucene.codecs.lucene45.Lucene45DocValuesConsumer.addSortedField(Lucene45DocValuesConsumer.java:350)
at org.apache.lucene.codecs.perfield.PerFieldDocValuesFormat$FieldsWriter.addSortedField(PerFieldDocValuesFormat.java:116)
at org.apache.lucene.codecs.DocValuesConsumer.mergeSortedField(DocValuesConsumer.java:305)
at org.apache.lucene.index.SegmentMerger.mergeDocValues(SegmentMerger.java:197)
at org.apache.lucene.index.SegmentMerger.merge(SegmentMerger.java:116)
at org.apache.lucene.index.IndexWriter.mergeMiddle(IndexWriter.java:4058)
at org.apache.lucene.index.IndexWriter.merge(IndexWriter.java:3655)
at org.apache.lucene.index.ConcurrentMergeScheduler.doMerge(ConcurrentMergeScheduler.java:405)
at org.apache.lucene.index.ConcurrentMergeScheduler$MergeThread.run(ConcurrentMergeScheduler.java:482)
Caused by: java.io.EOFException: Read past EOF (resource: BBIndexInput(name=_67fvk_Lucene45_0.dvd))
at com.datastax.bdp.search.lucene.store.bytebuffer.ByteBufferIndexInput.switchCurrentBuffer(ByteBufferIndexInput.java:188)
at com.datastax.bdp.search.lucene.store.bytebuffer.ByteBufferIndexInput.readByte(ByteBufferIndexInput.java:129)
at org.apache.lucene.store.DataInput.readShort(DataInput.java:77)
at com.datastax.bdp.search.lucene.store.bytebuffer.ByteBufferIndexInput.readShort(ByteBufferIndexInput.java:89)
at org.apache.lucene.util.packed.DirectPackedReader.get(DirectPackedReader.java:64)
... 15 more
ATUALIZAÇÃO parte 2 (14/08/2014):
exemplo de aviso RELOAD:
WARN [http-8983-2] 2014-08-14 08:31:28,828 CassandraCoreContainer.java (line 739) Too much waiting for new searcher...
WARN [http-8983-2] 2014-08-14 08:31:28,831 SolrCores.java (line 375) Tried to remove core myks.mycf from pendingCoreOps and it wasn't there.
INFO [http-8983-2] 2014-08-14 08:31:28,832 StorageService.java (line 2644) Starting repair command #3, repairing 0 ranges for keyspace solr_admin
INFO [http-8983-2] 2014-08-14 08:31:28,835 SolrDispatchFilter.java (line 672) [admin] webapp=null path=/admin/cores params={slave=true&deleteAll=false&name=myks.mycf&distributed=false&action=RELOAD&reindex=false&core=myks.mycf&wt=javabin&version=2} status=0 QTime=61640
ATUALIZAÇÃO (23/08/2014):
Não consegui mais reproduzir a exceção depois de refazer o sugerido Gambiarra
Solução
Atualize seu solrconfig.xml para todos os seus núcleos:troque o directoryFactory
de com.datastax.bdp.cassandra.index.solr.DSENRTCachingDirectoryFactory
para solr.MMapDirectoryFactory
.
Além disso, qual sistema operacional, versão da JVM está sendo usado, quantas CPUs, tamanho de heap, memória total disponível.Em quantos minutos/horas de carregamento o erro ocorre.