几周前,我正在尝试将约6000万位数据最初导入Neo4j,但我们一直遇到一个问题,即导入过程似乎停滞了,什么也没导入。
很难分辨该过程中发生了什么—采取线程转储只是告诉我们它正在尝试处理CSV行中的一行,并且以某种方式无法执行。
一种帮助调试的方法是在处理过程中打印出CSV的每一行,然后观察它被卡在哪里,但这似乎有点过头了。 理想情况下,我们只希望打印出按需处理的行。
幸运的是,我们可以通过向我们的导入过程发送一个终止信号并将其打印出到达的位置来完成此操作。 我们必须确保选择了一个尚未由JVM处理的信号,并决定使用'SIGTRAP',即kill -5 [pid]
我们遇到了一个简洁的博客文章,该文章解释了如何将所有内容连接起来 ,然后创建自己的版本:
class Kill3Handler implements SignalHandler
{private AtomicInteger linesProcessed;private AtomicReference<Map<String, Object>> lastRowProcessed;public Kill3Handler( AtomicInteger linesProcessed, AtomicReference<Map<String, Object>> lastRowProcessed ){this.linesProcessed = linesProcessed;this.lastRowProcessed = lastRowProcessed;}@Overridepublic void handle( Signal signal ){System.out.println("Last Line Processed: " + linesProcessed.get() + " " + lastRowProcessed.get());}
}
然后,我们将其连接如下:
AtomicInteger linesProcessed = new AtomicInteger( 0 );
AtomicReference<Map<String, Object>> lastRowProcessed = new AtomicReference<>( );
Kill3Handler kill3Handler = new Kill3Handler( linesProcessed, lastRowProcessed );
Signal.handle(new Signal("TRAP"), kill3Handler);// as we iterate each line we update those variableslinesProcessed.incrementAndGet();
lastRowProcessed.getAndSet( properties ); // properties = a representation of the row we're processing
这对我们来说确实非常有效,并且我们能够得出结论,我们的CSV文件中的某些数据存在轻微问题,导致数据处理不正确。
由于CSV文件只有几GB的大小,因此我们无法通过肉眼观察到。 因此,我们仅略过几行作为健全性检查。
我什至不知道您可以做到这一点,但是请牢记这是一个巧妙的技巧–我确信它会再次有用。
翻译自: https://www.javacodegeeks.com/2014/07/java-determining-the-status-of-data-import-using-kill-signals.html