Wie finde ich heraus, welcher Java / Scala-Thread eine Datei gesperrt hat?

In Kürze

Wie finde ich heraus, welcher Java / Scala-Thread eine Datei gesperrt hat? Ich weiß, dass eine Klasse / ein Thread in JVM eine konkrete Datei gesperrt hat (überlappt einen Dateibereich), aber ich weiß nicht, wie. Es ist möglich herauszufinden, welche Klasse / welcher Thread dies tut, wenn ich die Anwendung im Haltepunkt beend

Der folgende Code wirft OverlappingFileLockException:

FileChannel.open(Paths.get("thisfile"), StandardOpenOption.APPEND).tryLock().isValid();
FileChannel.open(Paths.get("thisfile"), StandardOpenOption.APPEND).tryLock()..isShared();
Wie kann Java / Scala diese Datei sperren Funk)? Ich weiß, wie man Dateien mit java.nio.channels sperrt, habe aber in @ keinen passenden Aufruf gefundgithub Repository von Spark.

Mehr zu meinem Problem: 1. Wenn ich Spark unter Windows mit Hive ausführe, funktioniert es ordnungsgemäß. Bei jedem Herunterfahren von Spark kann jedoch kein temporäres Verzeichnis (davor wird das andere temporäre Verzeichnis ordnungsgemäß gelöscht) gelöscht werden, und es wird die folgende Ausnahme ausgegeben:

2015-12-11 15:04:36 [Thread-13] INFO  org.apache.spark.SparkContext - Successfully stopped SparkContext
2015-12-11 15:04:36 [Thread-13] INFO  o.a.spark.util.ShutdownHookManager - Shutdown hook called
2015-12-11 15:04:36 [Thread-13] INFO  o.a.spark.util.ShutdownHookManager - Deleting directory C:\Users\MyUser\AppData\Local\Temp\spark-9d564520-5370-4834-9946-ac5af3954032
2015-12-11 15:04:36 [Thread-13] INFO  o.a.spark.util.ShutdownHookManager - Deleting directory C:\Users\MyUser\AppData\Local\Temp\spark-42b70530-30d2-41dc-aff5-8d01aba38041
2015-12-11 15:04:36 [Thread-13] ERROR o.a.spark.util.ShutdownHookManager - Exception while deleting Spark temp dir: C:\Users\MyUser\AppData\Local\Temp\spark-42b70530-30d2-41dc-aff5-8d01aba38041
java.io.IOException: Failed to delete: C:\Users\MyUser\AppData\Local\Temp\spark-42b70530-30d2-41dc-aff5-8d01aba38041
    at org.apache.spark.util.Utils$.deleteRecursively(Utils.scala:884) [spark-core_2.11-1.5.0.jar:1.5.0]
    at org.apache.spark.util.ShutdownHookManager$anonfun$1$anonfun$apply$mcV$sp$3.apply(ShutdownHookManager.scala:63) [spark-core_2.11-1.5.0.jar:1.5.0]
    at org.apache.spark.util.ShutdownHookManager$anonfun$1$anonfun$apply$mcV$sp$3.apply(ShutdownHookManager.scala:60) [spark-core_2.11-1.5.0.jar:1.5.0]
    at scala.collection.mutable.HashSet.foreach(HashSet.scala:78) [scala-library-2.11.6.jar:na]
    at org.apache.spark.util.ShutdownHookManager$anonfun$1.apply$mcV$sp(ShutdownHookManager.scala:60) [spark-core_2.11-1.5.0.jar:1.5.0]
    at org.apache.spark.util.SparkShutdownHook.run(ShutdownHookManager.scala:264) [spark-core_2.11-1.5.0.jar:1.5.0]
    at org.apache.spark.util.SparkShutdownHookManager$anonfun$runAll$1$anonfun$apply$mcV$sp$1.apply$mcV$sp(ShutdownHookManager.scala:234) [spark-core_2.11-1.5.0.jar:1.5.0]
    at org.apache.spark.util.SparkShutdownHookManager$anonfun$runAll$1$anonfun$apply$mcV$sp$1.apply(ShutdownHookManager.scala:234) [spark-core_2.11-1.5.0.jar:1.5.0]
    at org.apache.spark.util.SparkShutdownHookManager$anonfun$runAll$1$anonfun$apply$mcV$sp$1.apply(ShutdownHookManager.scala:234) [spark-core_2.11-1.5.0.jar:1.5.0]
    at org.apache.spark.util.Utils$.logUncaughtExceptions(Utils.scala:1699) [spark-core_2.11-1.5.0.jar:1.5.0]
    at org.apache.spark.util.SparkShutdownHookManager$anonfun$runAll$1.apply$mcV$sp(ShutdownHookManager.scala:234) [spark-core_2.11-1.5.0.jar:1.5.0]
    at org.apache.spark.util.SparkShutdownHookManager$anonfun$runAll$1.apply(ShutdownHookManager.scala:234) [spark-core_2.11-1.5.0.jar:1.5.0]
    at org.apache.spark.util.SparkShutdownHookManager$anonfun$runAll$1.apply(ShutdownHookManager.scala:234) [spark-core_2.11-1.5.0.jar:1.5.0]
    at scala.util.Try$.apply(Try.scala:191) [scala-library-2.11.6.jar:na]
    at org.apache.spark.util.SparkShutdownHookManager.runAll(ShutdownHookManager.scala:234) [spark-core_2.11-1.5.0.jar:1.5.0]
    at org.apache.spark.util.SparkShutdownHookManager$anon$2.run(ShutdownHookManager.scala:216) [spark-core_2.11-1.5.0.jar:1.5.0]
    at org.apache.hadoop.util.ShutdownHookManager$1.run(ShutdownHookManager.java:54) [hadoop-common-2.4.1.jar:na]

Ich versuche im Internet zu suchen, habe aber nur @ gefundin Bearbeitun -Probleme in Spark (ein Benutzer versucht, Patches auszuführen, aber es funktioniert nicht, wenn ich den Kommentar zu dieser Pull-Anforderung richtig verstehe) und einige unbeantwortete Fragen in SO.

Es sieht so aus, als ob das Problem in der deleteRecursively () -Methode von @ lieg Utils.scala Klasse. Ich setze einen Haltepunkt für diese Methode und schreibe sie in Java um:

public class Test {
    public static void deleteRecursively(File file) {
        if (file != null) {
            try {
                if (file.isDirectory()) {
                    for (File child : listFilesSafely(file)) {
                        deleteRecursively(child);
                    }
                    //ShutdownHookManager.removeShutdownDeleteDir(file)
                }
            } finally {
                if (!file.delete()) {
                    if (file.exists()) {
                        throw new RuntimeException("Failed to delete: " + file.getAbsolutePath());
                    }
                }
            }
        }
    }

    private static List<File> listFilesSafely(File file) {
        if (file.exists()) {
            File[] files = file.listFiles();
            if (files == null) {
                throw new RuntimeException("Failed to list files for dir: " + file);
            }
            return Arrays.asList(files);
        } else {
            return Collections.emptyList();
        }
    }

    public static void main(String [] arg) {
        deleteRecursively(new File("C:\\Users\\MyUser\\AppData\\Local\\Temp\\spark-9ba0bb0c-1e20-455d-bc1f-86c696661ba3")); 
    }

WannFunk wird am Haltepunkt dieser Methode gestoppt, ich habe herausgefunden, dass JVM eines Threads vonFunk gesperrte Datei "C: \ Users \ MyUser \ AppData \ Local \ Temp \ spark-9ba0bb0c-1e20-455d-bc1f-86c696661ba3 \ metastore \ db.lck" und WindowsProcess Explore zeigt auch, dass Java diese Datei sperrt. FileChannel zeigt auch, dass die Datei in JVM gesperrt ist.

Nun muss ich:

Finde heraus, welcher Thread / welche Klasse diese Datei gesperrt hat

Finden Sie heraus, wie Sie Dateien sperren könnenFunk wird verwendet, um "metastore \ db.lck" zu sperren. Welche Klasse verwendet es und wie entsperrt man es vor dem Herunterfahren?

Tun Sie einige Pull-Anfrage anFunk oderBienenstoc um diese Datei ("metastore \ db.lck") vor einem Aufruf der deleteRecursively () -Methode freizugeben oder zumindest einen Kommentar zum Problem zu hinterlassen

Wenn Sie weitere Informationen benötigen, geben Sie diese bitte in den Kommentaren an.

Antworten auf die Frage(6)

Ihre Antwort auf die Frage