我们开发了一种火花结构化流,每天运行数十亿条记录。由于某些原因,它有时会由于空指针异常而随机失败:
错误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
,而另一个失败,但是我不确定。解决该问题的任何解决方法将不胜感激。