2017-07-11 129 views
0

我运行在Hadoop上的Java代码,但遇到这样的错误:JVM崩溃Hadoop的减速

# 
# A fatal error has been detected by the Java Runtime Environment: 
# 
# SIGSEGV (0xb) at pc=0x00007f2ffe7e1904, pid=31718, tid=139843231057664 
# 
# JRE version: Java(TM) SE Runtime Environment (8.0_72-b15) (build 1.8.0_72-b15) 
# Java VM: Java HotSpot(TM) 64-Bit Server VM (25.72-b15 mixed mode linux-amd64 compressed oops) 
# Problematic frame: 
# V [libjvm.so+0x813904] PhaseIdealLoop::build_loop_late_post(Node*)+0x144 
# 
# Failed to write core dump. Core dumps have been disabled. To enable core dumping, try "ulimit -c unlimited" before starting Java again 
# 
# An error report file with more information is saved as: 
# /hadoop/nm-local-dir/usercache/ihradmin/appcache/application_1479451766852_3736/container_1479451766852_3736_01_000144/hs_err_pid31718.log 
# 
# Compiler replay data is saved as: 
# /hadoop/nm-local-dir/usercache/ihradmin/appcache/application_1479451766852_3736/container_1479451766852_3736_01_000144/replay_pid31718.log 
# 
# If you would like to submit a bug report, please visit: 
# http://bugreport.java.com/bugreport/crash.jsp 

当我去到节点管理器,所有的日志,因为yarn.log-aggregation-enable is true聚集,并记录hs_err_pid31718.log和无法找到replay_pid31718.log。

通常情况下1)JVM在几分钟的减速器后崩溃,2)有时减速器的自动重试可以成功,3)有些减速器可以成功而不失败。

Hadoop版本是2.6.0,Java是Java8。这不是一个新的环境,我们有很多作业在集群上运行。

我的问题:

  1. 我能找到hs_err_pid31718.log纱线合计后的任意位置的日志,并删除该文件夹?或者是否有一个设置来保存所有本地日志,以便我可以检查hs_err_pid31718.log,同时通过纱线汇总日志?

  2. 什么是缩小深潜范围的常见步骤?由于jvm崩溃,我无法在代码中看到任何异常。我已经尝试过-XX:+HeapDumpOnOutOfMemoryError -XX:HeapDumpPath=/tmp这个参数,但是没有堆丢弃在主机上,没有减少任务。

感谢您的任何建议。

回答

1

答案

  1. 使用-XX:ErrorFile=<your prefered location>/hs_err_pid<pid>.log到hs_error文件位置设置为您的首选之一。
  2. 崩溃是由于JDK错误JDK-6675699,这已经在JDK9中修复,并且在JDK8更新74之后提供了backports。

您正在使用JDK8更新72 请从here升级到最新版本,以避免此崩溃。

+0

thx,我会试试看,并在这里更新。 –

+0

这很有效,当我们升级我们的hadoop环境的JDK时,JVM崩溃得到了解决,尽管我仍然想知道为什么每次都没有发生这种崩溃,因为我们使用相同的业务代码和输入。 –

+0

崩溃是由于编译器试图构建理想的图形,编译器会在运行时进行优化和内联,所以它不总是可重现的。我希望这将是明确的。 – Fairoz