目录
MapReduce是Hadoop系统核心组件之一,是一种可用于大数据并行处理的计算模型、框架和平台,主要解决海量数据的计算,是目前分布式计算模型中应用较为广泛的一种。
一、MapReduce核心思想:分而治之
使用MapReduce操作海量数据时步骤:
- 每个MapReduce程序被初始化为一个工作任务
- 每个工作任务可以分为Map和Reduce l两个阶段
- Map阶段:负责将任务分解,即把负责的任务分解成若干个简单任务来并行处理,但前提是这些任务没有必然的依赖关系,可以单独执行任务。
- Reduce阶段:负责将任务合并,即把Map阶段的结果进行全局汇总。
二、MapReduce编程模型:用于处理大规模数据集的并行运算
其编程思想实现过程通过map()和reduce() 函数来完成
从数据格式上来看,map()函数接收的数据格式是键值对,产生输出结果也是键值对形式;reduce()函数会将map()函数输出的键值对作为输入,把相同key值的value进行汇总,输出新的键值对。(整个过程相当于键值对转换的过程)
具体MapReduce简易数据模型:
- 将原始数据处理成键值对<K1, V1>形式
- 将解析后的键值对<K1, V1>传给map()函数,map()函数会根据映射规则,将键值对<K1, V1>映射为一系列中间结果形式的键值对<K2, V2>
- 将中间形式的键值对<K2, V2>形成<K2, {V2, …}>形式传给reduce()函数处理,把具有相同key的value合并在一起,产生新的键值对<K3, V3>,此时的键值对<K3, V3>就是最终输出结果
注意:可以有Map过程,没有Reduce过程,Map过程产生的数据可以直接写入到HDFS中,当然如果任务复杂,也可以有多个Reduce过程。
三、MapReduce体系结构主要组成部分
- client
- JobTracker
- TaskTracker
- Task
四、MapReduce运行模式
- 本地运行模式:在当前的开发环境模拟MapReduce执行环境,处理的数据及输出结果在本地操作系统(不需要搭建集群)
- 集群运行模式:把MapReduce程序打成一个jar包,提交到yarn集群上去运行任务。由于yarn集群负责资源管理和任务调度,程序会被框架分发到集群中的节点上并发的执行,因此处理的数据和输出结果都在HDFS文件系统中
五、MapReduce编程实例:词频统计
词频统计原理图:
具体步骤:
六、MapReduce基本数据类型的序列化
MapReduce中的数据类型都要实现Writable接口,以便用这些类型定义的数据可以被序列化进行网络传输和文件存储,效率比java中序列化高效。
- Boolean => BooleanWritable
- Byte => ByteWritable
- Double => DoubleWritable
- Float => FloatWritable
- Integer => IntWritable
- Long => LongWritable
- String => Text
- Null => NullWritable
注意:应用过程中也可以使用自定义的序列化类型对象(implements Writable)
七、MapReduce工作原理
- 分片、格式化数据源
- 分片操作:将源文件划分为大小相等的小数据块(2.x默认128M),也就是分片,Hadoop会为每一个分片构建一个Map任务,并由该任务运行自定义的map()函数,从而处理分片里的每一条记录
- 格式化操作:将划分好的分片格式化为键值对(key代表偏移量,value代表每一行内容)
- 执行MapTask:每个Map任务都有一个内存缓冲区(默认大小100M),输入的分片数据经过Map任务处理后的中间结果,会写入内存缓冲区中,如果写入的数据达到内存缓冲的阈值(80M),会启动一个线程将内存中溢出的数据写入磁盘,同时不影响map中间结果继续写入缓冲区。在溢出过程中,MapReduce框架会对key进行排序,如果中间结果比较大,会形成多个溢出文件,最后缓冲区数据也会全部溢出写入磁盘形成一个溢出文件,如果是多个溢写文件,则最后合并所有的溢写文件为一个文件。
- 执行Shuffle过程:Shuffle会将MapTask输出的处理结果数据,分发给ReduceTask,并在分发的过程中,对数据按key进行分区和排序
- 执行ReduceTask
- 写入文件
1. MapTask工作过程
分为五个阶段:
- Read阶段
- Map阶段
- Collect阶段
- Spill阶段
- Combiner阶段
2. ReduceTask工作过程
分为五个阶段:
- Copy阶段
- Merge阶段
- Sort阶段
- Reduce阶段
- Write阶段
3. Shuffle工作过程
shuffle是MapReduce的核心,用来确保每个reduce的输入都是按键排序的。它的性能高低直接决定了整个MapReduce程序性能的高低,map和reduce阶段都涉及到shuffle机制,主要作用是处理“中间结果”。
shuffle过程:
- Combine(合并操作):所有Combine在map所做的事,减轻了reduce的事情
- Partition(分区操作):数据归类
MapReduce使用哈希HashPartitioner归类,也可以自定义
八、MapReduce编程组件
- InputFormat组件: 主要用于描述输入数据的格式,它提供两个功能,分别是数据切分和为Mapper提供输入数据。
- addInputPath()
- addInputPaths()
- setInputPaths()
- setInputPaths()
- Mapper组件:Hadoop提供的Mapper类是实现Map任务的一个抽象基类,该基类提供了一个map()方法。
- Reducer组件:Map过程输出的键值对,将由Reducer组件进行合并处理,最终以某种形式的结果输出。
- Partitioner组件:Partitioner组件可以躺Map对Key进行分区,从而可以根据不同的key分发到不同的Reduce中去处理,其目的就是将key均匀分布在ReduceTask上。
- Combiner组件:Combiner组件的作用就是对Map阶段的输出的重复数据先做一次合并计算,然后把新的(key,value)作为你Reduce阶段输出。
- OutputFormat组件:OutputFormat是一个用于描述MapReduce程序输出格式和规范的抽象类