mapreduce出core处理

本文介绍了如何在Hadoop MapReduce任务出错时,利用-mapdebug选项配合自定义脚本来处理错误。通过设置`mapred.map.task.debug.script`,当任务出错时调用shell脚本,例如`debug.sh`,在脚本中实现上传core文件以便于后续的调试分析。
     我们在使用hadoop的时候,会经常遇到程序崩溃的情况,比如程序出core(出core的时候会报134错误)。程序出core之后,我们希望得到程序的core文件,或者是错误日志。但是hadoop程序的运行时环境,一般在程序结束后,就会自动删除,所以很难直接得到core文件。 这里介绍几种方法,用于获取core文件:
(1) 保留出错现场
     设置hadoop的jobconf参数keep.failed.task.files=true,当程序出错时,可以保留现以供debug使用。保留现场之后,通过job信息,可以找到出core的task所在节点,然后使用lftp登陆节点,就可以将core下载下来了。
(2)使用debug脚本

     hadoop提供了设置出错脚本的方法,可以通过 -mapdebug "sh debug.sh" (或者使用mapred.map.task.debug.script来指定) 来指定程序出错后进行处理的脚本。在脚本中添加上传core文件的代码即可,示例代码如下:

#!/bin/bash
CUR_PATH=`pwd`
JOBID=`echo ${CUR_PATH} |awk -F"/" '{print \$(NF-2)}'`
ATTEMP=`echo ${CUR_PATH} |awk -F"/" '{print \$(NF-1)}'`
CORE_PATH="/user/xlord/temp/mapreduce_core_dir/${JOB_ID}/${ATTEMP}/"
echo "${HADOOP_HOME}/bin/hadoop --config ./ dfs -put core.* ${CORE_PATH}" >&2
${HADOOP_HOME}/bin/hadoop --config ./ dfs -mkdir ${CORE_PATH}
${HADOOP_HOME}/bin/hadoop --config ./ dfs -put core.* ${CORE_PATH}
${HADOOP_HOME}/bin/hadoop --config ./ dfs -put ./log/hadoop.log.wf ${CORE_PATH}

但是我们在使用的时候会发现一个问题,就是有的hadoop节点不支持产生core文件。需要我们添加支持产生core文件的代码。可以在脚本中添加:ulimit -c 或者使用c++代码:
struct rlimit limit;
limit.rlim_cur = 65535;
limit.rlim_max = 65535;
if (setrlimit(RLIMIT_CORE, &limit) != 0) {
    printf("setrlimit() failed with errno=%s\n", strerror(errno));
    exit(1);
}
    我们在执行hadoop程序的时候,一般会打印日志,然后在程序结束的时候,将日志上传到集群中。但是在很多情况下,程序会崩溃,然后上传日志的代码就得不到执行。这个时候,也可以使用-mapdebug 来解决这个问题,使用出错处理脚本上传日志。
(3)使用本地执行
可以在本地模拟mapreduce的执行环境,很容易得到core文件。如果是reduce阶段出core,可以在集群上跑完map程序,得到map的结果,在本地执行。



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值