设为首页 收藏本站
查看: 950|回复: 0

[经验分享] hadoop下的程序测试及调试信息

[复制链接]

尚未签到

发表于 2016-12-12 08:27:37 | 显示全部楼层 |阅读模式
  今天不是什么新的内容,主要介绍下0.20版本下hadoop的调试、计数器、调试信息输出等内容。
  相信很多人学习hadoop都是从hadoop权威指南开始的,但权威指南使用的hadoop版本是0.19版本的,而有部分人(其中包括我)使用的0.20版本的。相信大家都知道0.20版本相对于0.19版本有了重大的改变。提供了一系列新的API。具体哪些我这里就不具体说了。其中一个跟测试、调试密切相关的就是在0.20版本出现了Context object(上下文对象).所以本篇日志就记录一下我在0.20版本下的测试、调试程序。这里有要特别提示下,这些方法都是我自己摸索的,不敢保证一定效果最好或者最简洁,比如计数器那个我也见过其他实现方法。所以如果有错请大家指出。先谢谢了。
  先来说说测试,老规矩直接上代码,注释在代码里:
  public class TestMapper {@Testpublic void processReduce() throws IOException{wordcountReduce reuder = new wordcountReduce();  //reduce测试LongWritable key = new LongWritable(1234);List<LongWritable> list = new ArrayList<LongWritable>();list.add(new LongWritable(10));list.add(new LongWritable(2));Iterable<LongWritable> values = list; //构造Iterable//OutputCollector<LongWritable, LongWritable> output = mock(OutputCollector.class); 老版本测试Reducer.Context context = mock(Reducer.Context.class); //这里要注明Reduce.context上下文对象try {//reude.reduce(key, values, output, null); 老版本测试reuder.reduce(key, values, context); //使用上下文对象代替上面的outputverify(context).write(new LongWritable(12), new LongWritable(1234));}catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}@Testpublic void processMap()throws IOException{wordcountMapper mapper = new wordcountMapper(); //map测试Text value = new Text("1234");LongWritable key = new LongWritable(1);//OutputCollector<LongWritable, Text> output = mock(OutputCollector.class); 老版本测试Mapper.Context context = mock(Mapper.Context.class);try{//mapper.map(key, value, output, null); 老版本测试mapper.map(key, value, context);verify(context).write(new LongWritable(1234), new LongWritable(1));} catch (InterruptedException e) {// TODO Auto-generated catch blocke.printStackTrace();}}public static  class wordcountMapper extendsMapper<LongWritable, Text, LongWritable, LongWritable>{public void map(LongWritable key, Text value, Context context)throws IOException, InterruptedException{String one = value.toString();context.write(new LongWritable(Integer.parseInt(one)) , key);}}public  class wordcountReduce extendsReducer<LongWritable, LongWritable, LongWritable, LongWritable>{public void reduce(LongWritable key, Iterable<LongWritable>values, Context context)throws IOException, InterruptedException{int sum = 0;for (LongWritable str : values){sum += str.get();}context.write(new LongWritable(sum), key );}}}
  接着来讨论下hadoopp的调试信息,我介绍两种:计数器、直接打印调试信息
  这里我只给出主要代码,main函数里面的代码十分简单,我就不给出了。
  public static  class wordcountMapper extendsMapper<LongWritable, Text, Text, IntWritable>{enum Temper{OVER_100} //使用权威指南里的方法定义枚举类型private final static IntWritable one = new IntWritable(1);private Text word = new Text();public void map(LongWritable key, Text value, Context context)throws IOException, InterruptedException{String line = value.toString();StringTokenizer itr = new StringTokenizer(line);while(itr.hasMoreElements()){word.set(itr.nextToken());context.write(word, one);}System.out.println("map"); //直接打印调试信息。context.setStatus("this kk!!"); //设置状态Counter c = context.getCounter(Temper.OVER_100); //通过context直接获取计数器这个跟0.19版不一样c.increment(1); //计数器加一}}public static  class wordcountReduce extendsReducer<Text, IntWritable, Text, IntWritable>{public void reduce(Text key, Iterable<IntWritable>values, Context context)throws IOException, InterruptedException{int sum = 0;for (IntWritable str : values){sum += str.get();}context.write(key, new IntWritable(sum));System.out.println("reduce"); //直接打印调试信息}}
  使用上面代码的效果,我现在来给大家指出:
  1:我们上面使用了计数器,当我们提交作业运行完成后,可以通过namenode返回的信息查看计数器的值
DSC0000.gif

  当然我也可以通过hadoop提供的web页面查看计数器的值
DSC0001.gif

  当然我们也可以查看每个map里计数器的取值。
  我前两天看了一篇文章,也是在0.20中使用计数器的,那篇文章中说的是可以直接使用
  Counter c = context.getCounter("Counter","Counter1");来设置计数器,应该有可以。这里就算多提供了一种使用计数器的方法。
  2: 我们程序中使用了System.out.println("map"); System.out.println("reduce"); //直接打印调试信息。
  这里我也有两种查看方式,一种是在web页面中查看
DSC0002.gif

  还有一种是直接在datanode的log目录下查看
  具体路径是 hadoop-0.20/logs/userlogs/attempt-*****-*****/stdout文件中查看
  3:程序中我们还使用了context.setStatus("this kk!!"); //设置状态
  这个也是在web中可以查看
DSC0003.gif

  今天这篇文章没什么技术含量。就当对新版本的学习了。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-312951-1-1.html 上篇帖子: Cloudera Impala:基于Hadoop的实时查询开源项目 下篇帖子: hadoop之在集群上跑Pig脚本语言
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表