我正在使用Java代理对Hadoop任务进行JVM分析,如https://github.com/etsy/statsd-jvm-profiler中所述。探查器注册关闭挂钩,将配置文件保存到HDFS。但是目前钩子在它们完成之前就被终止了。我确定它们已被执行,因为我可以从钩子中看到一些输出。
答案 0 :(得分:2)
您是否看到任何IOExceptions或FileSystem已关闭错误。如果是这样,那么禁用hdfs shutdown hooks可以提供帮助。
Hdfs Client还注册了shutdown hooks,以便能够正确关闭hdfs连接。不保证调用关闭挂钩的顺序。可以在其他人之前调用Hdfs钩子。您可以尝试禁用关闭挂钩。这也意味着您需要关闭代码中的连接。
创建hdfs客户端实例:
Configuration conf = new Configuration();
conf.setBoolean("fs.automatic.close", false);
filesystem = FileSystem.get(nnURI, conf)
在关机钩子中:
fileSystem.close();
答案 1 :(得分:1)
根据JavaDoc:
关机挂钩也应该快速完成工作。当一个程序 调用退出期望就是那个 虚拟机会立即关闭并退出。 ... 因此不宜尝试 任何用户交互或执行长时间运行的计算 关机钩。
这意味着您完成任务的时间不到一秒(确切的值实际上取决于平台)。另外值得注意的是:
在极少数情况下,虚拟机可能中止,即停止运行而不会干净地关闭。 ...如果虚拟机中止,则无法保证是否将运行任何关闭挂钩。