一、MapReduce简述
MapReduce是一种编程模型,用于大规模数据集(大于1TB)的并行运算,MapReduce是面向大数据并行处理的计算模型、框架和平台,作用为拆分数据,合并数据。
MapReduce的组成
1、JobTracker/ResourceManager:管理任务
2、TaskTracker/NodeManager:执行任务
二、序列化/反序列化机制.
当自定义一个类之后,如果想要产生的对象在hadoop中进行传输,那么需要这个类实现Writable的接口进行序列化/反序列化
三、分区 - Partitioner
1、分区操作是shuffle操作中的一个重要过程,作用就是将map的结果按照规则分发到不同reduce中进行处理,从而按照分区得到多个输出结果。
2、Partitioner是partitioner的基类,如果需要定制partitioner也需要继承该类。
3、HashPartitioner是mapreduce的默认partitioner。计算方法是:which reducer=(key.hashCode() & Integer.MAX_VALUE) % numReduceTasks。
注:默认情况下,reduceTask数量为1
很多时候MR自带的分区规则并不能满足我们需求,为了实现特定的效果,可以需要自己来定义分区规则。
四、Combiner - 合并
在Map任务结束后,会产生大量的数据,如果将这些数据直接交给reduce会增加reduce的任务量,所以可以先将map之后的数据进行一次合并,再交给reduce进行最后的规约
五、排序
在Hadoop中, 在Map任务结束后,会按照键进行排序,如果需要手动指定排序规则,那么就需要对象对应的类实现Comparable接口
六、Map任务
1、读取输入文件内容,解析成key、value对。对输入文件的每一行,解析成key、value对。每一个键值对调用一次map函数。
2、写自己的逻辑,对输入的key、value处理,转换成新的key、value输出。
3、对输出的key、value进行分区。
4、对相同分区的数据,按照key进行排序(默认按照字典顺序进行排序)、分组。相同key的value放到一个集合中。
5、(可选)分组后的数据进行归约。
注意:在MapReduce中,Mapper可以单独存在,但是Reducer不能存在
七、Reducer任务
1、对多个map任务的输出,按照不同的分区,通过网络copy到不同的reduce节点。这个过程并不是map将数据发送给reduce,而是reduce主动去获取数据。— Reducer的个数 >= 分区的数量
2、对多个map任务的输出进行合并、排序。写reduce函数自己的逻辑,对输入的key、value处理,转换成新的key、value输出。
把reduce的输出保存到文件中。
八、MapReduce的执行流程
1、run job:客户端提交一个mr的jar包给JobClient(提交方式:hadoop jar …。
a、做job环境信息的收集,比如各个组件类,输入输出的kv类型等,检测是否合法
b、检测输入输出的路径是否合法
2、JobClient通过RPC和ResourceManager进行通信,返回一个存放jar包的地址(HDFS)和jobId。jobID是全局唯一的,用于标识该job
3、client将jar包写入到HDFS当中(path = hdfs上的地址 + jobId)
4、开始提交任务(任务的描述信息,不是jar, 包括jobid,jar存放的位置,配置信息等等)
5、JobTracker进行初始化任务
6、读取HDFS上的要处理的文件,开始计算输入切片,每一个切片对应一个MapperTask。注意,切片是一个对象,存储的是这个切片的数据描述信息;切块是文件块(数据块),里面存储的是真正的文件数据。
7、TaskTracker通过心跳机制领取任务(任务的描述信息)。切片一般和切块是一样的,即在实际开发中,切块和切片认为是相同的。在领取到任务之后,要满足数据本地化策略。
8、下载所需的jar,配置文件等。体现的思想:移动的是运算/逻辑,而不是数据。
9、TaskTracker启动一个java child子进程,用来执行具体的任务(MapperTask或ReducerTask)
将结果写入到HDFS当中