Hadoop程序打印调试

                                               转载   Hadoop程序打印调试

1. System.out 和 System.err

Main

Main函数里使用System.out标准输出和System.err标准错误输出,输出定向到执行程序节点的终端上。即在完全分布的Hadoop部署中,输出会定向到启动程序的节点的终端上。

Mapper

针对每个split,会实例化一个Mapper对象作为一个task,在Hadoop集群中的某个机器中的某个Map槽上执行。Mapper对象中的map函数和configure函数会被主程序以RPC方式调用。因此,在Mapper对象中System.outSystem.err输出的结果并不会定向到执行程序节点的终端上。这样的话,查看Mapper中的输出只有以下两种方法:

  1. 在jobtracker的Web页面查看,默认绑定到50030端口。然后根据jobid进入job详情页面,然后进入map详情的页面,可以看到本次job执行的map task的列表。进入任意一个然后查看Task Logs可以看到对应的map task的stdout logs和stderr logs,分别就是System.outSystem.err输出的内容。

  2. 进入执行某个map任务的节点,在<mapred.local.dir>/userlogs/job_<jobid>/attempt_<taskid>/目录中,stdout文件和stderr文件分别就是System.outSystem.err输出的内容。这种方法需要节点主机的访问权限,不是很方便。

Reducer

Reducer的情况和Mapper差不多,参照Mapper的方法查看。

Eclipse

在使用eclipse和本地搭建的伪分布环境中调试程序,System.outSystem.err输出都会定向到eclipse的终端中。但在本地伪分布环境中直接jar执行时只显示main的输出。可能eclipse的hadoop插件使用了某种方法,尚未分析。

2. 计数器

对于大型分布式作业而言,使用计数器更为方便,因为:

  1. 获取计数器值比输出日志更方便。
  2. 根据计数器值统计特定事件的发生次数要比分析一堆日志文件容易的多。

计数器由其关联任务维护,并定期传到tasktracker,再由tasktracker传给jobtracker。因此,计数器能够被全局地聚集。一个task的局部计数器值每次都是完整的汇报,而不是在上次汇报的基础上再汇报当前的增量,这样以避免由于消息丢失而引发的错误。并且,当task失败时,全局计数器就会减去失败task的局部计数器的值。近当一个task执行成功后,其局部计数器的值才是完整可靠的。

Hadoop本身为每个job维护若干个内置计数器,以描述该作业的各项指标。

用户定义计数器

用户可编写程序定义自己的计数器,计数器的值可在mapperreducer中增加。一组计数器可由枚举类型定义,枚举类型的名称即为组的名称。组内的若干个计数器可由枚举类型的字段定义,字段名就是计数器的名称。

如下在全局定义一组计数器Temperature,组内有两个计数器MISSINGMALFORMED

enum Temperature {
    MISSING,
    MALFORMED
}

然后在mapperMALFORMED中可以使用Reporter

public void incrCounter(String group, String counter, long amount)
方法增加计数器的值:
reporter.incrCounter(Temperature.MISSING, 1);
reporter.incrCounter(Temperature.MALFROMED, 1);
动态计数器

动态计数器不必使用枚举类型预先定义计数器,而只要在执行的时候动态的创建计数器。这只需使用Reporter

public void incrCounter(String group, String counter, long amount)
方法即可。
计数器值的获取

Hadoop作业执行时,mapperreducer可使用Reporter的以下两个方法获取当前计数器。

public Counter getCounter(Enum<?> name);
public Counter getCounter(String group, String name);

Hadoop作业执行完毕后,终端中会返回程序的各个计数器的值。此外,还有两种方法获取到计数器的值:

  1. 在jobtracker的Web页面中查看每个job和job中的每个task的计数器值。

  2. 使用命令获取计数器的值:

    hadoop job -counter [-counter   ]

3. 设置状态

MapReduce中可使用reporter.setStatus("Error")设置每个task状态,这在jobtracker Web中可以查看。

4. 使用输出文件输出调试信息

还有一种方法,就是利用Reducer的输出,利用中的key来区分正常输出和调试输出,把调试信息输出到文件里。详见参考3.

参考

  1. Hadoop: The Definitive Guide
  2. Hadoop – MapReduce过程
  3. Hadoop调试信息的输出

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值