对于大数据这方面的文章。我确实没怎么用心写,我就是把当成我的笔记了,方便我哪里忘了及时复习,前面比较忙,所以直接贴图,只有我自己看得懂。我觉得一是方便自己也方便他人,二是在学校实验室,有闲暇时间就来写文章吧
在上面14节中,配置环境已经搭好了
本次写的在我12节里12hadoop使用eclipse编程所需要的环境配置 - 简书的基础上进行,首先拷贝配置文件
最后文件情况如上图所示
然后开启hadoop
开启rm,node08和node09
编写单词统计代码
对于以上程序,我们需要注意setMapperClass()
和setReduceClass()
由于没有这两个类,所以我们应该创建
在创建的时候,我们应该了解他的原理,这样我们就能更好地理解了
重点介绍map
MapReduce计划分三个阶段执行,即映射阶段,shuffle阶段,合并减少阶段。
涉及到的角色:
1、客户端(client):编写mapreduce程序,配置作业,提交作业,这就是程序员完成的工作;
2、JobTracker:初始化作业,分配作业,与TaskTracker通信,协调整个作业的执行;
3、TaskTracker:保持与JobTracker的通信,在分配的数据片段上执行Map或Reduce任务,TaskTracker和JobTracker的不同有个很重要的方面,就是在执行任务时候TaskTracker可以有n多个,JobTracker则只会有一个(JobTracker只能有一个就和hdfs里namenode一样存在单点故障,我会在后面的mapreduce的相关问题里讲到这个问题的)
4、Hdfs:保存作业的数据、配置信息等等,最后的结果也是保存在hdfs上面
map阶段:映射或映射器的工作是处理输入数据。一般输入数据以存储在HDFS的文件或目录的形式,输入文件被传递到映射器功能线路,映射器处理该数据,并创建数据的若干小块。
reduce阶段:这个阶段是Shuffle阶段和Reduce阶段的组合。减速器的工作是处理该来自映射器中的数据。处理之后,它产生一组新的输出,这将被存储在HDFS。
Mapper任务的执行过程详解
每个Mapper任务是一个java进程,它会读取HDFS中的文件,解析成很多的键值对,经过我们覆盖的map方法处理后,转换为很多的键值对再输出。整个Mapper任务的处理过程又可以分为以下几个阶段,如图所示。
在上图中,把Mapper任务的运行过程分为六个阶段。
1.第一阶段是把输入文件按照一定的标准分片(InputSplit),每个输入片的大小是固定的。默认情况下,输入片(InputSplit)的大小与数据块(Block)的大小是相同的。如果数据块(Block)的大小是默认值64MB,输入文件有两个,一个是32MB,一个是72MB。那么小的文件是一个输入片,大文件会分为两个数据块,那么是两个输入片。一共产生三个输入片。每一个输入片由一个Mapper进程处理。这里的三个输入片,会有三个Mapper进程处理。
2.第二阶段是对输入片中的记录按照一定的规则解析成键值对。有个默认规则是把每一行文本内容解析成键值对。“键”是每一行的起始位置(单位是字节),“值”是本行的文本内容。
3.第三阶段是调用Mapper类中的map方法。第二阶段中解析出来的每一个键值对,调用一次map方法。如果有1000个键值对,就会调用1000次map方法。每一次调用map方法会输出零个或者多个键值对。
4.第四阶段是按照一定的规则对第三阶段输出的键值对进行分区。比较是基于键进行的。比如我们的键表示省份(如北京、上海、山东等),那么就可以按照不同省份进行分区,同一个省份的键值对划分到一个区中。默认是只有一个区。分区的数量就是Reducer任务运行的数量。默认只有一个Reducer任务。
5.第五阶段是对每个分区中的键值对进行排序。首先,按照键进行排序,对于键相同的键值对,按照值进行排序。比如三个键值对<2,2>、<1,3>、<2,1>,键和值分别是整数。那么排序后的结果是<1,3>、<2,1>、<2,2>。如果有第六阶段,那么进入第六阶段;如果没有,直接输出到本地的linux文件中。
6.第六阶段是对数据进行归约处理,也就是reduce处理。键相等的键值对会调用一次reduce方法。经过这一阶段,数据量会减少。归约后的数据输出到本地的linxu文件中。本阶段默认是没有的,需要用户自己增加这一阶段的代码。
摘自Hadoop MapReduce执行过程详解(带hadoop例子),reduce任务在文章中,就不赘述了
摘抄那么多文字的目的就是为了引出下面的程序
在这里主要分析extend的Mapper<>里的四个参数。四个参数分别为KEYIN,VALUEIN,KEYOUT,VALUEOUT
object(KEYIN)传进来的数据的索引,对应的是,在这就是int
第二阶段是对输入片中的记录按照一定的规则解析成键值对。有个默认规则是把每一行文本内容解析成键值对。“键”是每一行的起始位置(单位是字节),“值”是本行的文本内容。
Text(VALUEIN)进来的数据 就是“值”
Text(KEYOUT)输出的key,是字符串。
第四阶段是按照一定的规则对第三阶段输出的键值对进行分区。比较是基于键进行的。比如我们的键表示省份(如北京、上海、山东等),那么就可以按照不同省份进行分区,同一个省份的键值对划分到一个区中。默认是只有一个区。分区的数量就是Reducer任务运行的数量。默认只有一个Reducer任务。
IntWritable(VALUEOUT) 此时输出的值是value int类型,但是要包装,用hadoop里提供的IntWritable进行包装
对于reduce也是同样
接受map传入的值进行处理,所以in是text,IntWritable。处理后out输出也是text,IntWritable。就是输出到文件的类型
这里的reduce方法进行迭代计算,对value值进行加减。
这里返回的是int
注意这里是values,而只是key,因为这是传入的都是处理过后的。key值是相等的
这里还应该抛出异常
因为你传过去是序列化,hadoop自动帮你序列化了,但是反序列化必须要知道对象类型。所以有了
setMapOutKeyClass()
setMapOutValueClass()
将程序打包
hadoop jar wc.jar com.sxt.mr.wc.MyWc
在Linux上运行jar包
下面看一下源码
mapper类:输入KV通过map进行中间级的映射
map方法,通过调用run来运行
run方法通过nextkeyvalue来一行一行读取
setup()建立关系
cleanup()清理
这是reduce的run方法