yuanlihan commented on issue #9967:
URL: https://github.com/apache/druid/issues/9967#issuecomment-645764620


   Hi @liran-funaro, thanks for your work on this!
   
   I am so excited about this improvement that I tried to apply the patch and 
rebuilt modules(exclude the benchmark mudule) on on-prem cluster. And I got a 
OOM error related with direct memory allocation.
   ```
   2020-06-17T14:51:12,290 ERROR 
[[index_kafka_ds_name_a4e6ce8abc9e093_ofeaphml]-threading-task-runner-executor-4]
 org.apache.d
   ruid.indexing.overlord.ThreadingTaskRunner - Exception caught while running 
the task.
   java.lang.OutOfMemoryError: Direct buffer memory
           at java.nio.Bits.reserveMemory(Bits.java:695) ~[?:1.8.0_181]
           at java.nio.DirectByteBuffer.<init>(DirectByteBuffer.java:123) 
~[?:1.8.0_181]
           at java.nio.ByteBuffer.allocateDirect(ByteBuffer.java:311) 
~[?:1.8.0_181]
           at com.yahoo.oak.Block.<init>(Block.java:37) ~[oak-0.2.1.jar:?]
           at com.yahoo.oak.BlocksPool.prealloc(BlocksPool.java:143) 
~[oak-0.2.1.jar:?]
           at com.yahoo.oak.BlocksPool.getBlock(BlocksPool.java:100) 
~[oak-0.2.1.jar:?]
           at 
com.yahoo.oak.NativeMemoryAllocator.allocateNewCurrentBlock(NativeMemoryAllocator.java:213)
 ~[oak-0.2.1.jar:?]
           at 
com.yahoo.oak.NativeMemoryAllocator.<init>(NativeMemoryAllocator.java:64) 
~[oak-0.2.1.jar:?]
           at 
com.yahoo.oak.NativeMemoryAllocator.<init>(NativeMemoryAllocator.java:53) 
~[oak-0.2.1.jar:?]
           at com.yahoo.oak.OakMapBuilder.build(OakMapBuilder.java:84) 
~[oak-0.2.1.jar:?]
           at 
org.apache.druid.segment.incremental.OakIncrementalIndex$OakFactsHolder.<init>(OakIncrementalIndex.java:418)
 ~[druid-processing-0.18.1.jar:0
   .18.1]
           at 
org.apache.druid.segment.incremental.OakIncrementalIndex.<init>(OakIncrementalIndex.java:89)
 ~[druid-processing-0.18.1.jar:0.18.1]
           at 
org.apache.druid.segment.incremental.IncrementalIndex$Builder.buildOak(IncrementalIndex.java:512)
 ~[druid-processing-0.18.1.jar:0.18.1]
           at 
org.apache.druid.segment.incremental.IncrementalIndex$Builder.build(IncrementalIndex.java:458)
 ~[druid-processing-0.18.1.jar:0.18.1]
           at 
org.apache.druid.segment.incremental.IncrementalIndex$Builder.build(IncrementalIndex.java:445)
 ~[druid-processing-0.18.1.jar:0.18.1]
           at 
org.apache.druid.segment.realtime.plumber.Sink.makeNewCurrIndex(Sink.java:375) 
~[druid-server-0.18.1.jar:0.18.1]
           at 
org.apache.druid.segment.realtime.plumber.Sink.<init>(Sink.java:179) 
~[druid-server-0.18.1.jar:0.18.1]
           at 
org.apache.druid.segment.realtime.plumber.Sink.<init>(Sink.java:122) 
~[druid-server-0.18.1.jar:0.18.1]
           at 
org.apache.druid.segment.realtime.appenderator.AppenderatorImpl.getOrCreateSink(AppenderatorImpl.java:406)
 ~[druid-server-0.18.1.jar:0.18.1]
           at 
org.apache.druid.segment.realtime.appenderator.AppenderatorImpl.add(AppenderatorImpl.java:250)
 ~[druid-server-0.18.1.jar:0.18.1]
           at 
org.apache.druid.segment.realtime.appenderator.BaseAppenderatorDriver.append(BaseAppenderatorDriver.java:406)
 ~[druid-server-0.18.1.jar:0.18
   .1]
           at 
org.apache.druid.segment.realtime.appenderator.StreamAppenderatorDriver.add(StreamAppenderatorDriver.java:187)
 ~[druid-server-0.18.1.jar:0.1
   8.1]
           at 
org.apache.druid.indexing.seekablestream.SeekableStreamIndexTaskRunner.runInternal(SeekableStreamIndexTaskRunner.java:654)
 ~[druid-indexing-
   service-0.18.1.jar:0.18.1]
           at 
org.apache.druid.indexing.seekablestream.SeekableStreamIndexTaskRunner.run(SeekableStreamIndexTaskRunner.java:277)
 ~[druid-indexing-service-
   0.18.1.jar:0.18.1]
           at 
org.apache.druid.indexing.seekablestream.SeekableStreamIndexTask.run(SeekableStreamIndexTask.java:164)
 ~[druid-indexing-service-0.18.1.jar:0
   .18.1]
           at 
org.apache.druid.indexing.overlord.ThreadingTaskRunner$1.call(ThreadingTaskRunner.java:209)
 [druid-indexing-service-0.18.1.jar:0.18.1]
           at 
org.apache.druid.indexing.overlord.ThreadingTaskRunner$1.call(ThreadingTaskRunner.java:149)
 [druid-indexing-service-0.18.1.jar:0.18.1]
           at java.util.concurrent.FutureTask.run(FutureTask.java:266) 
[?:1.8.0_181]
           at 
java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) 
[?:1.8.0_181]
           at 
java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) 
[?:1.8.0_181]
           at java.lang.Thread.run(Thread.java:748) [?:1.8.0_181]
   ```
   
   It seems that the direct memory allocator of oak incremental index exceeds 
the `MaxDirectMemorySize` of the JVM process. Found that the `maxBytesInMemory` 
is calculated from heap memory by default while the oak incremental index will 
take it as available size of direct memory.
   
   I solved this OOM issue by increasing `MaxDirectMemorySize`. In my opinion, 
it will be nice to have additional docs about direct memory calculation when 
users choose `oak` type incremental index. And the `maxBytesInMemory` seems a 
little ambiguous. 
   
   
   
   


----------------------------------------------------------------
This is an automated message from the Apache Git Service.
To respond to the message, please log on to GitHub and use the
URL above to go to the specific comment.

For queries about this service, please contact Infrastructure at:
[email protected]



---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to