1. import java.io.IOException;
  2. import java.text.DateFormat;
  3. import java.text.SimpleDateFormat;
  4. import java.util.Date;
  5.  
  6. import org.apache.hadoop.conf.Configuration;
  7. import org.apache.hadoop.conf.Configured;
  8. import org.apache.hadoop.fs.Path;
  9. import org.apache.hadoop.io.*;
  10. import org.apache.hadoop.mapreduce.*;
  11. import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
  12. import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
  13. import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;
  14. import org.apache.hadoop.util.Tool;
  15. import org.apache.hadoop.util.ToolRunner;
  16.  
  17. /**
  18. * map就是把key先分出来。系统会自己主动把同样key的value放到一个iterator里面,reduce就是去处理key和已经归并好的iterator
  19. */
  20. public class Template extends Configured implements Tool {
  21.  
  22. /**
  23. * 计数器
  24. * 用于计数各种异常数据
  25. */
  26. enum Counter
  27. {
  28. LINESKIP, //出错的行
  29. }
  30.  
  31. /**
  32. * MAP任务
  33. */
  34. public static class Map extends Mapper<LongWritable, Text, Text, Text> //输入的key(详细是什么由job.setInputFormatClass决定),输入的value,输出的key,输出的value
  35. {
  36. public void map ( LongWritable key, Text value, Context context ) throws IOException, InterruptedException
  37. {
  38. String line = value.toString(); //读取源数据
  39.  
  40. try
  41. {
  42. //数据处理
  43. String [] lineSplit = line.split(" ");
  44. String anum = lineSplit[0];
  45. String bnum = lineSplit[1];
  46.  
  47. context.write( new Text(bnum), new Text(anum) ); //输出
  48. }
  49. catch ( java.lang.ArrayIndexOutOfBoundsException e )
  50. {
  51. context.getCounter(Counter.LINESKIP).increment(1); //出错令计数器+1
  52. return;
  53. }
  54. }
  55. }
  56.  
  57. /**
  58. * REDUCE任务
  59. */
  60. public static class Reduce extends Reducer<Text, Text, Text, Text>
  61. {
  62. public void reduce ( Text key, Iterable<Text> values, Context context ) throws IOException, InterruptedException
  63. {
  64. String valueString;
  65. String out = "";
  66.  
  67. for ( Text value : values )
  68. {
  69. valueString = value.toString();
  70. out += valueString + "|";
  71. }
  72.  
  73. context.write( key, new Text(out) );
  74. }
  75. }
  76.  
  77. @Override
  78. public int run(String[] args) throws Exception
  79. {
  80. Configuration conf = getConf();
  81.  
  82. Job job = new Job(conf, "Test_2"); //任务名
  83. job.setJarByClass(Test_2.class); //指定Class
  84.  
  85. FileInputFormat.addInputPath( job, new Path(args[0]) ); //输入路径
  86. FileOutputFormat.setOutputPath( job, new Path(args[1]) ); //输出路径
  87.  
  88. job.setMapperClass( Map.class ); //调用上面Map类作为Map任务代码
  89. job.setReducerClass ( Reduce.class ); //调用上面Reduce类作为Reduce任务代码,没有这行就调用默认的reduce
  90. job.setOutputFormatClass( TextOutputFormat.class );
  91. job.setOutputKeyClass( Text.class ); //指定输出的KEY的格式
  92. job.setOutputValueClass( Text.class ); //指定输出的VALUE的格式
  93.  
  94. job.waitForCompletion(true);
  95.  
  96. //输出任务完毕情况
  97. System.out.println( "任务名称:" + job.getJobName() );
  98. System.out.println( "任务成功:" + ( job.isSuccessful()?
  99.  
  100. "是":"否" ) );
  101. System.out.println( "输入行数:" + job.getCounters().findCounter("org.apache.hadoop.mapred.Task$Counter", "MAP_INPUT_RECORDS").getValue() );
  102. System.out.println( "输出行数:" + job.getCounters().findCounter("org.apache.hadoop.mapred.Task$Counter", "MAP_OUTPUT_RECORDS").getValue() );
  103. System.out.println( "跳过的行:" + job.getCounters().findCounter(Counter.LINESKIP).getValue() );
  104.  
  105. return job.isSuccessful() ? 0 : 1;
  106. }
  107.  
  108. /**
  109. * 设置系统说明
  110. * 设置MapReduce任务
  111. */
  112. public static void main(String[] args) throws Exception
  113. {
  114.  
  115. //推断參数个数是否正确
  116. //假设无參数执行则显示以作程序说明
  117. if ( args.length != 2 )
  118. {
  119. System.err.println("");
  120. System.err.println("Usage: Test_2 < input path > < output path > ");
  121. System.err.println("Example: hadoop jar ~/Test_2.jar hdfs://localhost:9000/home/james/Test_2 hdfs://localhost:9000/home/james/output");
  122. System.err.println("Counter:");
  123. System.err.println("\t"+"LINESKIP"+"\t"+"Lines which are too short");
  124. System.exit(-1);
  125. }
  126.  
  127. //记录開始时间
  128. DateFormat formatter = new SimpleDateFormat( "yyyy-MM-dd HH:mm:ss" );
  129. Date start = new Date();
  130.  
  131. //执行任务
  132. int res = ToolRunner.run(new Configuration(), new Test_2(), args);
  133.  
  134. //输出任务耗时
  135. Date end = new Date();
  136. float time = (float) (( end.getTime() - start.getTime() ) / 60000.0) ;
  137. System.out.println( "任务開始:" + formatter.format(start) );
  138. System.out.println( "任务结束:" + formatter.format(end) );
  139. System.out.println( "任务耗时:" + String.valueOf( time ) + " 分钟" );
  140.  
  141. System.exit(res);
  142. }
  143. }

mapreduce的一个模版的更多相关文章

  1. mapreduce中一个map多个输入路径

    package duogemap; import java.io.IOException; import java.util.ArrayList; import java.util.List; imp ...

  2. 导出Excel(导出一个模版)

    有时,客户需要一个标准的模板来填东西,然后在导入 这时可以弄好excel模板,供导出 /** * 导出excel模板文件 * @param request * @param response * @r ...

  3. MapReduce: 一个巨大的倒退

    前言 databasecolumn 的数据库大牛们(其中包括PostgreSQL的最初伯克利领导:Michael Stonebraker)最近写了一篇评论当前如日中天的MapReduce 技术的文章, ...

  4. 使用mapreduce计算环比的实例

    最近做了一个小的mapreduce程序,主要目的是计算环比值最高的前5名,本来打算使用spark计算,可是本人目前spark还只是简单看了下,因此就先改用mapreduce计算了,今天和大家分享下这个 ...

  5. MapReduce剖析笔记之八: Map输出数据的处理类MapOutputBuffer分析

    在上一节我们分析了Child子进程启动,处理Map.Reduce任务的主要过程,但对于一些细节没有分析,这一节主要对MapOutputBuffer这个关键类进行分析. MapOutputBuffer顾 ...

  6. 04 MapReduce原理介绍

    大数据实战(上) # MapReduce原理介绍 大纲: * Mapreduce介绍 * MapReduce2运行原理 * shuffle及排序    定义 * Mapreduce 最早是由googl ...

  7. Linux上搭建Hadoop2.6.3集群以及WIN7通过Eclipse开发MapReduce的demo

    近期为了分析国内航空旅游业常见安全漏洞,想到了用大数据来分析,其实数据也不大,只是生产项目没有使用Hadoop,因此这里实际使用一次. 先看一下通过hadoop分析后的结果吧,最终通过hadoop分析 ...

  8. Hadoop学习笔记—4.初识MapReduce

    一.神马是高大上的MapReduce MapReduce是Google的一项重要技术,它首先是一个编程模型,用以进行大数据量的计算.对于大数据量的计算,通常采用的处理手法就是并行计算.但对许多开发者来 ...

  9. MapReduce剖析笔记之二:Job提交的过程

    上一节以WordCount分析了MapReduce的基本执行流程,但并没有从框架上进行分析,这一部分工作在后续慢慢补充.这一节,先剖析一下作业提交过程. 在分析之前,我们先进行一下粗略的思考,如果要我 ...

随机推荐

  1. List与set

    1,List与set的区别? List:元素是有序的,元素可以重复,因为集合体系有索引 set:元素是无序的,元素不可以重复,集合体系没有索引 2,list里面特有的方法: 在制定的位置添加元素add ...

  2. linux下内存

    MMU由一个或一组芯片组成.其功能是把逻辑地址映射为物理地址,进行地址转换(MMU是CPU的一部分) 机器指令仍然用逻辑地址指定一个操作数的地址或一条指令的地址 每个逻辑地址都由一个段选择符(16位) ...

  3. 【Python】向函数传递列表

    向函数传递列表 在实际使用中你会发现,向函数传递列表是比较实用的,这种列表可能包含名字.数字.可能更复杂的对象(字典) 假设向一个函数传递一堆水果,我们说出我们喜欢所有的水果 def Obj(frui ...

  4. vs2010 assistx安装教程

    参照此篇教程. 安装目录你可能找不到,因为那些文件是系统隐藏文件,打开隐藏即可. 然后,将此.exe安装到上面的目录下,然后,还需要进行一个破解,即需要将从网上下载的补丁放进去. 把目录下的VA_X. ...

  5. pom.xml基础配置

    pom.xml基础配置: maven中,最让我迷惑的还是那一堆配置! 就拿这个属性配置来说: 我需要让整个项目统一字符集编码,就需要设定 <project.build.sourceEncodin ...

  6. 微信小程序实战 购物车功能

    代码地址如下:http://www.demodashi.com/demo/12400.html 一.准备工作 软件环境:微信开发者工具 官方下载地址:https://mp.weixin.qq.com/ ...

  7. Redis(六):java里常用的redis客户端(Jedis和Redisson)

    Redis的各种语言客户端列表,请参见Redis Client.其中Java客户端在github上start最高的是Jedis和Redisson.Jedis提供了完整Redis命令,而Redisson ...

  8. linux的MACHINE_START-MACHINE_END(转)

    转自: http://blog.sina.com.cn/s/blog_753fd0b00100t8js.html 在友善mini2440提供的linux2.6.32.2内核中,有如下定义: MACHI ...

  9. js 第二篇 (DOM 操作)

    DOM 节点含有:元素节点,属性节点,文本节点. document.getElementById("id") //通过页面元素ID 值 捕获元素对象,得到的值为一个object 1 ...

  10. mapreduce代码实现入门

    mapreduce代码主要包括三个类,map类.reduce类以及测试类! 以wordcount为例, map类为: static class WordMapper extends Mapper< ...