Hadoop运行时错误:Task process exit with nonzero status of 1

2019-03-28 14:03|来源: 网络

之前写好的一个 Hadoop代码,昨天晚上执行时报错了,查了半天没查出来,网上的方法都试了还是不行,报错信息:

2011-11-17 11:11:26,821 INFO org.apache.hadoop.mapred.JvmManager: JVM : jvm_201111071540_0140_m_-855804511 exited. Number of tasks it ran: 1
2011-11-17 11:11:26,992 INFO org.apache.hadoop.mapred.TaskTracker: attempt_201111071540_0140_m_000005_0 0.8166969%
2011-11-17 11:11:28,713 INFO org.apache.hadoop.mapred.TaskTracker: org.apache.hadoop.util.DiskChecker$DiskErrorException: Could not find taskTracker/jobcache/job_201111071540_0140/attempt_2011
11071540_0140_m_000003_0/output/file.out in any of the configured local directories

----------------------------------------------------------

11/11/17 10:42:57 INFO mapred.JobClient: Task Id : attempt_201111071540_0137_m_000004_2, Status : FAILED
Error: java.lang.Exception.getMessage()Ljava/lang/String;

----------------------------------------------------------

java.io.IOException: Task process exit with nonzero status of 1.
 at org.apache.hadoop.mapred.TaskRunner.run(TaskRunner.java:418)

----------------------------------------------------------

网上给出的解决方案:

1、hadoop把/tmp文件夹给塞满了。只要把/tmp/hadoop-root/mapred 文件夹删除即可。再重新运行就不会出错了。

2、主要由hadoop的logs目录无法继续写入新文件造成,清理master和slaver上的logs文件夹后再次下发任务,正常运行。

其他、

    第一,查看网络节点是否在同一个交换机;
    第二,检查reduce分块是不是超出datanode的限度,实际上并不是每个核都可以利用起来。
    第三,自身程序是不是对传入数据进行了校验,有些输入文件是有问题的。

最终原因:  

      原来是要分析的日志中有不规范的数据,程序处理出现异常,处理后解决。所以大家出现上面的错误后,请检查自己的代码是否有问题,说不定会找到原因。

相关问答

更多
  • 尽管关于这个的文档非常薄,但是! 被设置为发生的最后一个异常,并且在exit()调用之后,这是一个SystemExit异常。 把这两个放在一起你会得到这个: at_exit do if ($!.success?) print 'Success' else print 'Failure' end end using idea from tadman at_exit do if $!.nil? || $!.is_a?(SystemExit) && $!.success? ...
  • 您可以通过wait()的第一个参数或waitpid()的第二个参数来获取子waitpid()的退出状态,然后使用宏WIFEXITED和WEXITSTATUS 。 例如: pid_t ret = c2b_popen4("myprog", pin, pout, perr, 0); if ( ret > 0 ) { int status; if ( waitpid(ret, &status, 0) == -1 ) { perror("waitpid() failed"); ...
  • TLDP的ABS的有效性值得怀疑(因为它经常使用,没有评论,不合格的做法),所以我不会把它作为关于此的正确性的特定基础。 这就是说有效的命令返回码在0和255之间, 0表示“成功”。 所以是的, 1是一个完全有效的(和常见的)错误代码。 显然,我不能肯定地说为什么其他人这么做,但我对这个话题有两点想法。 上下文切换失败(可能与缺乏领域知识相结合)。 在很多语言中,函数的返回值-1是一个完全有效的值,并且可以从所有可能(通常假定)返回的正值中脱颖而出。 所以试图将这种模式(作者随着时间的推移)延伸到shell ...
  • 我认为你需要使用lineStream_! 方法,而不是! 。 使用作为diff命令输出的行流,您可以执行任何操作:打印,将其转换为列表,转换为数组或其他任何需要的内容。 val st = "diff input.txt output.txt" lineStream_! // now st is a Stream[String] println(st.mkString("\n")) 编辑:我相信该方法在lines_!之前lines_! 。 现在它被弃用了。 以防万一你使用旧的Scala版本。 I think ...
  • “退出”状态由“退出代码”属性(由GetExitCodeProcess()本机返回)表示。 在PS中,它由Get-Process的HasExited和ExitCode字段反映(别名ps )。 ps | where {$_.Id -eq } | select HasExited,ExitCode Windows中的“running / wait / suspended”是线程的状态而不是进程(“suspend”是几个Wait子状态之一 )。 我没有找到任何关于通过PS的内置方法获取线程信息的信息 ...
  • 我偶然发现了同样的问题。 它实际上是较新版本的OMNeT ++中的一个错误/功能,其中信号处理得到了改进。 我刚刚在邮件列表上与AttilaTörök讨论了这个问题。 如果在静态初始化期间在外部库中注册了信号,则会发生这种情况。 三种可能的解决方 引用Attila:插入EXECUTE_ON_STARTUP(cComponent::clearSignalState()); 进入ccomponent.cc ,在cComponent::signalListenerCount定义之后,然后重建OMNeT ++。 将 ...
  • 您应该使用Seq[String]变体,因为您的args中有空格字符可能用于错误地分隔参数。 尝试 Seq("git", "--git-dir", s"${repository.localLocation.get.path}/.git", "log", "--format='%h %at %s'", "--no-decorate").!! 另请注意,您将在输出中看到单个刻度'。 你可能想要"--format=%h %at %s" 。 You should probably use the Seq[Str ...
  • 只看你的代码,第一件让我感到震惊的是你实际上没有测试“ec”变量,该变量说明在调用wait_for_exit()之后execute()是否成功。 如果你使用无效的子进程调用wait_for_exit(),那么它会崩溃是完全可以理解的。 首先在调用wait_for_exit()之前检查“ec”。 So the problem was that Boost.Test modifies the signals stack in some way. This signal stack modification ha ...
  • 你可以简单地做一个echo $? 执行命令/ bash后,将输出程序的退出代码。 每个命令都返回退出状态(有时称为返回状态或退出代码)。 成功的命令返回0 ,而不成功的命令返回非零值,通常可以将其解释为错误代码。 良好的UNIX命令,程序和实用程序在成功完成后返回0退出代码,但有一些例外。 echo $? # Non-zero exit status returned -- command failed to execute. echo exit 113 # Will return 113 t ...
  • 在孩子退出后调用wait (通过调用exit或获取致命信号)时,父级将获得退出状态。 exec无关紧要。 The parent will get the exit status when it calls wait after the child has exited (either by calling exit or getting a fatal signal). exec is irrelevant.