当想要释放内存时,在火花结构化流中获取空指针异常

时间:2018-12-03 20:43:55

标签: spark-structured-streaming

我们开发了一种火花结构化流,每天运行数十亿条记录。由于某些原因,它有时会由于空指针异常而随机失败:

  

错误UnsafeShuffleWriter:除了在写入过程中失败之外,我们   清除期间失败。 java.lang.NullPointerException在   org.apache.spark.unsafe.memory.HeapMemoryAllocator.free(HeapMemoryAllocator.java:98)     在   org.apache.spark.memory.TaskMemoryManager.freePage(TaskMemoryManager.java:343)     在   org.apache.spark.memory.MemoryConsumer.freePage(MemoryConsumer.java:130)     在   org.apache.spark.shuffle.sort.ShuffleExternalSorter.freeMemory(ShuffleExternalSorter.java:300)     在   org.apache.spark.shuffle.sort.ShuffleExternalSorter.cleanupResources(ShuffleExternalSorter.java:312)     在   org.apache.spark.shuffle.sort.UnsafeShuffleWriter.write(UnsafeShuffleWriter.java:195)     在   org.apache.spark.scheduler.ShuffleMapTask.runTask(ShuffleMapTask.scala:96)     在   org.apache.spark.scheduler.ShuffleMapTask.runTask(ShuffleMapTask.scala:53)     在org.apache.spark.scheduler.Task.run(Task.scala:109)处   org.apache.spark.executor.Executor $ TaskRunner.run(Executor.scala:345)     在   java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)     在   java.util.concurrent.ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java:617)     在java.lang.Thread.run(Thread.java:745)

当我查看spark code时,它不应该给我们NPE,因为它已经在line 79中进行了检查。在我看来,这是一个同步问题,两个线程请求同一个内存块并通过无效检查行,然后其中一个通过调用null将obj设置为setObjAndOffset,而另一个失败,但是我不确定。解决该问题的任何解决方法将不胜感激。

0 个答案:

没有答案