转载   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调试信息的输出

转载于:https://www.cnblogs.com/java20130722/p/3206906.html

Hadoop程序打印调试相关推荐

  1. MacOs Hadoop环境搭建 IDEA开发MapReduce程序及调试

    公司有个计算需求,由于不能通过连接公司的Hadoop集群进行本地编写MR程序进行调试 所以直接自己搭建一个本地Hadoop环境进行MR程序测试,然后再讲程序打包丢到公司Hadoop集群 别的不说,直接 ...

  2. 服务器发布程序打印不显示图片,用JAVA编写打印图片程序,调试的时候出现说“RPC 服务器不可用”,上面是具体的情况:(谢谢各位帮忙)...

    用JAVA编写打印图片程序,调试的时候出现说"RPC 服务器不可用",上面是具体的情况:(谢谢各位帮忙) 用JAVA编写打印图片程序,调试的时候出现说"RPC 服务器不可 ...

  3. 客户端dmesg_打印调试技术 printk klogd dmesg(解决打印信息的问题)

    4.2.1. printk #include printk(KERN_CRIT"error %s,%i",__FILE__,__LINE__); 注: 1). printk 函数中 ...

  4. hadoop程序运行

    hadoop命令的使用: Usage: hadoop [--config confdir] COMMAND 这里COMMAND为下列其中一个: 1 2 3 4 5 6 7 8 9 10 11 12 1 ...

  5. 7 php程序的调试方法_php程序调试方法总结

    相信很多朋友们都有调试程序的经历,然而很多时候调试程序是痛苦而又漫长的过程:它不仅需要细心,更需要耐心,切忌心浮气躁.但是当找出问题并顺利 解决它时,又会给人无比激动的喜悦.这里总结一下笔者在程序调试 ...

  6. STM32M CUBE实现printf打印调试信息以及实现单字节接收

    在写单片机程序时我们一般喜欢使用printf来通过串口打印调试信息,但这个函数是不能够直接使用的.必须做点对库函数的修改. 具体project下载地址: http://download.csdn.ne ...

  7. 如何在 SAP UI5 应用中集成第三方库 :一个在移动设备上查看 Web 应用打印调试信息的小技巧

    这是 Jerry 2021 年的第 43 篇文章,也是汪子熙公众号总共第 320 篇原创文章. 做 Web 开发的程序员,无论使用 SAP UI5,还是 Angular,React,Vue,每天都离不 ...

  8. 如何使用 dlv 结合 Goland 进行程序 debug 调试

    如何使用 dlv 结合 Goland 进行程序 debug 调试 相信很多 Golang 的初级玩家不会进行程序的 Debug 定位问题单纯的靠脑子,或者效率很低的不断的添加日志打印,别问我为什么知道 ...

  9. linux 程序退出 调试,linux驱动程序调试常用方法(printk,OOP,strace,hacking,ioctl,/proc,kgdb)...

    驱动程序开发的一个重大难点就是不易调试.本文目的就是介绍驱动开发中常用的几种直接和间接的调试手段,它们是: 利用printk 查看OOP消息 利用strace 利用内核内置的hacking选项 利用i ...

最新文章

  1. docker初体验:docker 自己定制镜像
  2. matlab无限循环怎么停下来,[求助] 关于matlab无限循环的问题
  3. poj2109 Power of Cryptography(数学题)
  4. 远古VOD存在严重注入漏洞!!
  5. 数博会重磅活动:第二届大数据科学与工程国际会议日程
  6. 目标检测之空间变形网络(STN)
  7. 疑似荣耀X10 Max巨屏新机入网:5000mAh电池+22.5W快充
  8. chmod是linux命令吗,Linux chmod命令怎么用
  9. Flutter实战一Flutter聊天应用(五)
  10. python串口操作_Python Serial串口基本操作(收发数据)
  11. 985翻译硕士都在找的这款软件
  12. css设置动画匀速运动,CSS3 transition动画
  13. jsp+ssm计算机毕业设计学校缴费系统【附源码】
  14. 【Java设计模式 经典设计原则】 八 经典设计原则小结
  15. 第十二章 项目采购管理第六版
  16. 读《张一鸣:我的大学四年收获及工作感悟》有感
  17. 团队管理的“五大核心要素”,非常重要!
  18. 数据分析(入门)纳米学位_tensorflow纳米级程序对机器学习入门的回顾
  19. Vivado仿真小技巧,让所有模块的波形都可以显示
  20. java时间段分割_任意一个起止时间段(如:20160101-20161009),用java将这个时间段拆分成一个个按自然周组成的时间段...

热门文章

  1. mysql 索引建立标准_mysql索引规范
  2. 如何给小朋友解释单摆运动_法国教育学者:如何培养儿童的逻辑思维和时间观念...
  3. 建模步骤_带你十个步骤学建模(二)
  4. java treeset排序_java TreeSet的排序之自然排序
  5. android webview内存泄漏,Android由webview引起的内存泄漏
  6. python一切都是对象 知乎_python一切皆对象
  7. 相机姿态估计(五)--DLS
  8. 系统学习深度学习(十一)--dropout,dropconect
  9. python 输出log_python:logging模块(记录打印日志)
  10. 安装node.jsvue3.0脚手架