JVM 关闭挂钩意外退出
JVM shutdown hook quits unexpectedly
我正在使用 Java 代理对 Hadoop 任务进行 JVM 分析,如 https://github.com/etsy/statsd-jvm-profiler 中所示。分析器注册关闭挂钩,将配置文件保存到 HDFS。但目前钩子在完成之前就被终止了。我确定它们已执行,因为我可以看到挂钩的一些输出。
根据 JavaDoc:
Shutdown hooks should also finish their work quickly. When a program
invokes exit the expectation is that the
virtual machine will promptly shut down and exit. ... It is therefore inadvisable to attempt
any user interaction or to perform a long-running computation in a
shutdown hook.
这意味着你只有不到一秒的时间来完成你的任务(确切的值取决于平台)。另外值得注意的是:
In rare circumstances the virtual machine may abort, that is, stop running without shutting down cleanly. ... If the virtual machine aborts then no guarantee can be made about whether or not any shutdown hooks will be run.
您是否看到任何 IOExceptions 或文件系统关闭错误。如果是这样,那么禁用 hdfs 关闭挂钩会有所帮助。
Hdfs 客户端还注册了关闭挂钩,以便能够正确关闭 hdfs 连接。不保证调用关闭挂钩的顺序。 Hdfs 挂钩可能会先于其他挂钩被调用。您可以尝试禁用关闭挂钩。这也意味着您需要在代码中关闭连接。
创建 hdfs 客户端实例:
Configuration conf = new Configuration();
conf.setBoolean("fs.automatic.close", false);
filesystem = FileSystem.get(nnURI, conf)
在关闭挂钩中:
fileSystem.close();
我正在使用 Java 代理对 Hadoop 任务进行 JVM 分析,如 https://github.com/etsy/statsd-jvm-profiler 中所示。分析器注册关闭挂钩,将配置文件保存到 HDFS。但目前钩子在完成之前就被终止了。我确定它们已执行,因为我可以看到挂钩的一些输出。
根据 JavaDoc:
Shutdown hooks should also finish their work quickly. When a program invokes exit the expectation is that the virtual machine will promptly shut down and exit. ... It is therefore inadvisable to attempt any user interaction or to perform a long-running computation in a shutdown hook.
这意味着你只有不到一秒的时间来完成你的任务(确切的值取决于平台)。另外值得注意的是:
In rare circumstances the virtual machine may abort, that is, stop running without shutting down cleanly. ... If the virtual machine aborts then no guarantee can be made about whether or not any shutdown hooks will be run.
您是否看到任何 IOExceptions 或文件系统关闭错误。如果是这样,那么禁用 hdfs 关闭挂钩会有所帮助。
Hdfs 客户端还注册了关闭挂钩,以便能够正确关闭 hdfs 连接。不保证调用关闭挂钩的顺序。 Hdfs 挂钩可能会先于其他挂钩被调用。您可以尝试禁用关闭挂钩。这也意味着您需要在代码中关闭连接。
创建 hdfs 客户端实例:
Configuration conf = new Configuration();
conf.setBoolean("fs.automatic.close", false);
filesystem = FileSystem.get(nnURI, conf)
在关闭挂钩中:
fileSystem.close();