MapReduce主要包括两个阶段:一个是Map,一个是Reduce. 每一步都有key-value对作为输入和输出。

  Map阶段的key-value对的格式是由输入的格式决定的,如果是默认的TextInputFormat,则每行作为一个记录进程处理,其中key为此行的开头相对文件的起始位置,value就是此行的字符文本。Map阶段的输出的key-value对的格式必须同reduce阶段的输入key-value对的格式相对应。

下面开始尝试,假设我们需要处理一批有关天气的数据,其格式如下:

按照ASCII码存储,每行一条记录
    每一行字符从0开始计数,第15个到第18个字符为年
    第25个到第29个字符为温度,其中第25位是符号+/-

Text文本样例:

  1. 0067011990999991950051507+0000+
  2. 0043011990999991950051512+0022+
  3. 0043011990999991950051518-0011+
  4. 0043012650999991949032412+0111+
  5. 0043012650999991949032418+0078+
  6. 0067011990999991937051507+0001+
  7. 0043011990999991937051512-0002+
  8. 0043011990999991945051518+0001+
  9. 0043012650999991945032412+0002+
  10. 0043012650999991945032418+0078+

上代码啦:

  1. package Hadoop;
  2.  
  3. import java.io.IOException;
  4. import java.util.StringTokenizer;
  5. import org.apache.hadoop.conf.Configured;
  6. import org.apache.hadoop.fs.Path;
  7. import org.apache.hadoop.io.IntWritable;
  8. import org.apache.hadoop.io.LongWritable;
  9. import org.apache.hadoop.io.Text;
  10. import org.apache.hadoop.mapreduce.Job;
  11. import org.apache.hadoop.mapreduce.Mapper;
  12. import org.apache.hadoop.mapreduce.Reducer;
  13. import org.apache.hadoop.mapreduce.Reducer.Context;
  14. import org.apache.hadoop.mapreduce.lib.input.FileInputFormat;
  15. import org.apache.hadoop.mapreduce.lib.input.TextInputFormat;
  16. import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat;
  17. import org.apache.hadoop.mapreduce.lib.output.TextOutputFormat;
  18. import org.apache.hadoop.util.Tool;
  19. import org.apache.hadoop.util.ToolRunner;
  20.  
  21. import java.io.IOException;
  22. import java.util.StringTokenizer;
  23.  
  24. /**
  25. * Created by root on 4/23/16.
  26. */
  27. public class hadoopTest extends Configured implements Tool{
  28.    //map将输入中的value复制到输出数据的key上,并直接输出
  29. public static class Map extends Mapper<LongWritable, Text, Text, IntWritable> {
  30.  
  31.      //实现map函数
  32. @Override
  33. public void map(LongWritable key, Text value, Context context) throws IOException, InterruptedException {
  34. String line = value.toString();
  35. String year = line.substring(15, 19);
  36. int airTemperature;
  37.  
  38. if (line.charAt(25) == '+') {
  39.  
  40. airTemperature = Integer.parseInt(line.substring(26, 30));
  41.  
  42. } else {
  43.  
  44. airTemperature = Integer.parseInt(line.substring(25, 30));
  45.  
  46. }
  47. context.write(new Text(year), new IntWritable(airTemperature));
  48. }
  49.  
  50. }

  51.      //reduce将输入中的key复制到输出数据的key上,并直接输出
  52. public static class Reduce extends Reducer<Text, IntWritable, Text, IntWritable> {
  53. public void reduce(Text key, Iterable<IntWritable> values, Context context)
  54. throws IOException, InterruptedException {
  55.  
  56. int maxValue = Integer.MIN_VALUE;
  57. for (IntWritable sorce : values) {
  58. maxValue = Math.max(maxValue, sorce.get());
  59. }
  60.  
  61. context.write(key, new IntWritable(maxValue));
  62. }
  63. }
  64.  
  65. @Override
  66. public int run(String[] arg0) throws Exception {
            //这里测试用,传入的路径直接赋值
  67. String InputParths = "/usr/local/hadooptext.txt";
  68. String OutputPath = "/usr/local/hadoopOut";
            //声明一个job对象,这里的getConf是获取hadoop的配置信息,需要继承Configured.
  69. Job job = new Job(getConf());
           //设置job名称
  70. job.setJobName("AvgSorce");
    //设置mapper输出的key-value对的格式
  71. job.setOutputKeyClass(Text.class);
           
            //设置Mapper,默认为IdentityMapper,这里设置的代码中的Mapper
  72. job.setMapperClass(hadoopTest.Map.class);
           //Combiner可以理解为小的Reducer,为了降低网络传输负载和后续Reducer的计算压力 可以单独写一个方法进行调用
  73. job.setCombinerClass(Reduce.class);
            //设置reduce输出的key-value对的格式
    job.setOutputValueClass(IntWritable.class);
    //设置输入格式
  74. job.setInputFormatClass(TextInputFormat.class);
    //设置输入输出目录
  75. FileInputFormat.setInputPaths(job, new Path(InputParths));
  76. FileOutputFormat.setOutputPath(job, new Path(OutputPath));
  77. boolean success = job.waitForCompletion(true);
  78. return success ? 0 : 1;
  79. }
  80.  
  81. public static void main(String[] args) throws Exception {
  82. int ret = ToolRunner.run(new hadoopTest(), args);
  83. System.exit(ret);
  84. }
  85. }

Map函数继承自MapReduceBase,它实现了Mapper接口,此接口是一个范型类型,它有4种形式的参数,分别用来指定map的输入key值类型、输入value值类型、输出key值类型和输出value值类型。这里使用的是TextInputFormat,它的输出key值是LongWritable类型,输出value是Text类型。因为需要输出<word,1>形式,因此输出的key值类型是Text,输出的value值类型是IntWritable

InputFormat()和inputSplit

  InputSplit是Hadoop定义的用来传输给每个单独的map的数据,InputSplit存储的并非数据本身,而是一个分片长度和一个记录数据位置的数组。生成InputSplit的方法可以通过InputFormat()来设置。当数据传输给map时,map会将输入分片传送到InputFormat上,InputFormat调用getRecordReader()方法生成RecordReader,RecordReader再通过creatKey()、creatValue()方法创建可供map处理的<key,value>对,即<k1,v1>,InputFormat()方法是用来生成可供map处理的<key,value>对的。

TextInputFormat是Hadoop默认的输入方法,在TextInputFormat中,每个文件都会单独地作为map的输入,而这是继承自FileInputFormat的,之后,每行数据都会生成一条记录,每条记录则表示成<key,value>形式。

这里的key是每个数据的记录在数据分片中的字节偏移量,数据类型是LongWritable.

value值是每行的内容,数据类型是Text.

执行结果:

MapReduce编程实现学习的更多相关文章

  1. mapreduce编程--(准备篇)

    mapreduce编程准备 学习mapreduce编程之前需要做一些概念性的了解,这是做的一些课程学习笔记,以便以后时不时的翻出来学习下,之前看过一篇文章大神们都是时不时的翻出基础知识复习下,我也做点 ...

  2. [Hadoop入门] - 1 Ubuntu系统 Hadoop介绍 MapReduce编程思想

    Ubuntu系统 (我用到版本号是140.4) ubuntu系统是一个以桌面应用为主的Linux操作系统,Ubuntu基于Debian发行版和GNOME桌面环境.Ubuntu的目标在于为一般用户提供一 ...

  3. mapreduce编程模型你知道多少?

    上次新霸哥给大家介绍了一些hadoop的相关知识,发现大家对hadoop有了一定的了解,但是还有很多的朋友对mapreduce很模糊,下面新霸哥将带你共同学习mapreduce编程模型. mapred ...

  4. 指导手册05:MapReduce编程入门

    指导手册05:MapReduce编程入门   Part 1:使用Eclipse创建MapReduce工程 操作系统: Centos 6.8, hadoop 2.6.4 情景描述: 因为Hadoop本身 ...

  5. MapReduce编程基础

    MapReduce编程基础 1. WordCount示例及MapReduce程序框架 2.  MapReduce程序执行流程 3.  深入学习MapReduce编程(1) 4. 参考资料及代码下载 & ...

  6. Hadoop MapReduce编程 API入门系列之压缩和计数器(三十)

    不多说,直接上代码. Hadoop MapReduce编程 API入门系列之小文件合并(二十九) 生成的结果,作为输入源. 代码 package zhouls.bigdata.myMapReduce. ...

  7. pthread多线程编程的学习小结

    pthread多线程编程的学习小结  pthread 同步3种方法: 1 mutex 2 条件变量 3 读写锁:支持多个线程同时读,或者一个线程写     程序员必上的开发者服务平台 —— DevSt ...

  8. C++编程开发学习的50条建议(转)

    每个从事C++开发的朋友相信都能给后来者一些建议,但是真正为此进行大致总结的很少.本文就给出了网上流传的对C++编程开发学习的50条建议,总结的还是相当不错的,编程学习者(不仅限于C++学习者)如果真 ...

  9. hadoop2.2编程:使用MapReduce编程实例(转)

    原文链接:http://www.cnblogs.com/xia520pi/archive/2012/06/04/2534533.html 从网上搜到的一篇hadoop的编程实例,对于初学者真是帮助太大 ...

随机推荐

  1. python--函数式编程--9

    原创博文,转载请标明出处--周学伟http://www.cnblogs.com/zxouxuewei/ http://www.imooc.com/learn/317 一.把函数作为参数 编写了一个简单 ...

  2. jqueryflot图表x轴坐标过长完美解决方案(转)

    近段时间,项目中使用到了flot这个图表工具,在实际使用的过程中,遇到了一个看似很简单的问题:当坐标的刻度如果过长时,会重叠在一起,影响阅读: 看到这个效果后的第一反应就是,能不能让坐标斜着显示啊?去 ...

  3. DBN(深度信念网络)

    DBN运用CD算法逐层进行训练,得到每一层的参数Wi和ci用于初始化DBN,之后再用监督学习算法对参数进行微调.本例中采用softmax分类器(下一篇随笔中)作为监督学习算法. RBM与上一篇随笔中一 ...

  4. js中退出语句break,continue和return 比较

    js中退出语句break,continue和return 比较 在 break,continue和return 三个关键字中, break,continue是一起的,return 是函数返回语句,但是 ...

  5. easyUI之window

    window组件是一个可拖动.浮动的面板,用于显示信息.内容可用 href或ajax获取. window是一个显示窗口,同时也可以显示layout的功能(也就是创建复合的组合窗口),如 <div ...

  6. 开发环境安装 Java Mysql MyEclipse Android Adt

    一.安装 JDK 1.官网下载JDK最新版本,下载地址如下: http://www.oracle.com/technetwork/java/javase/downloads/index.html 这里 ...

  7. C# 中DataTable转成模型List

    C# 中DataTable转成模型List 引入using System.Reflection; 命名空间 使用注意实体类的属性名必须和DataTable的列名一致 使用: DBList<Sto ...

  8. 在svg里面画虚线

    使用stroke-dasharray="3 2"  属性,其中3和2分别表示画的长度和间隙的长度 比如 <line x1="0" y1="5&q ...

  9. linux服务之vnc和x2go

    三种方式连接linux桌面 1.传统的vnc linux桌面上安装vncserver windows桌面上安装vncviewer 2.x2go 在linux桌面上安装x2goserver与x2gose ...

  10. 使用prototype 对象定义类成员

    使用prototype 对象定义类成员上一节介绍了类的实现机制以及构造函数的实现,现在介绍另一种为类添加成员的机制:prototype 对象.当new 一个function 时,该对象的成员将自动赋给 ...