#博学谷IT学习技术支持#
MapReduce入门
1-MapReduce介绍
- MapReduce的思 想核心是“分而治之”,适用于大量复杂的任务处理场景(大规模数据处理场景)。
- Map负责“分”,即把复杂的任务分解为若干个“简单的任务”来并行处理。可以进行拆 分的前提是这些小任务可以并行计算,彼此间几乎没有依赖关系。
- Reduce负责“合”,即对map阶段的结果进行全局汇总。
- MapReduce运行在yarn集群
-
- ResourceManager
-
- NodeManager
- NodeManager
-
MapReduce优缺点
优点:
- 易于编程:用户只关心业务逻辑,实现框架的接口
- 良好扩展性:可以动态增加服务器,解决计算资源不够问题。
- 高容错性:任何一台机器挂掉,可以将任务转移到其他节点。
- 适合海量数据计算(TB、PB)几千台服务器共同计算。 缺点:
- 不擅长实时计算:MR擅长处理分钟、小时级别任务
- 不擅长流式计算:Sparkstreaming、flink(擅长流式计算)
- 不擅长DAG有向无环图(spark擅长)
2-MapReduce的构思和框架结构
MapReduce是一个分布式运算程序的编程框架,核心功能是将用户编写的业务逻辑代码 和自带默认组件整合成一个完整的分布式运算程序,并发运行在Hadoop集群上。 既然是做计算的框架,那么表现形式就是有个输入(input),MapReduce操作这个输 入(input),通过本身定义好的计算模型,得到一个输出(output)。 Hadoop MapReduce构思:
- 分而治之
- 对相互间不具有计算依赖关系的大数据,实现并行最自然的办法就是采取分而治 之的策略。并行计算的第一个重要问题是如何划分计算任务或者计算数据以便对 划分的子任务或数据块同时进行计算。不可分拆的计算任务或相互间有依赖关系 的数据无法进行并行计算!
- 统一构架,隐藏系统层细节
- 如何提供统一的计算框架,如果没有统一封装底层细节,那么程序员则需要 考虑诸如数据存储、划分、分发、结果收集、错误恢复等诸多细节;为此, MapReduce设计并提供了统一的计算框架,为程序员隐藏了绝大多数系统 层面的处理细节。
- MapReduce最大的亮点在于通过抽象模型和计算框架把需要做什么(what need to do)与具体怎么做(how to do)分开了,为程序员提供一个抽象和高 层的编程接口和框架。程序员仅需要关心其应用层的具体计算问题,仅需编 写少量的处理应用本身计算问题的程序代码。如何具体完成这个并行计算任 务所相关的诸多系统层细节被隐藏起来,交给计算框架去处理:从分布代码的 执行,到大到数千小到单个节点集群的自动调度使用。
- 构建抽象模型:Map和Reduce
- MapReduce借鉴了函数式语言中的思想,用Map和Reduce两个函数提供了高层 的并行编程抽象模型
- Map: 对一组数据元素进行某种重复式的处理;
- Reduce: 对Map的中间结果进行某种进一步的结果整理。
- Map和Reduce为程序员提供了一个清晰的操作接口抽象描述。MapReduce 处理的数据类型是键值对。
- MapReduce中定义了如下的Map和Reduce两个抽象的编程接口,由用户去编程 实现
- Map:
(k1; v1) → [(k2; v2)] - Reduce:
(k2; [v2]) → [(k3; v3)]
- Map:
- MapReduce借鉴了函数式语言中的思想,用Map和Reduce两个函数提供了高层 的并行编程抽象模型
MapReduce 框架结构
一个完整的mapreduce程序在分布式运行时有三类实例进程:
-
- MRAppMaster 负责整个程序的过程调度及状态协调
-
- MapTask 负责map阶段的整个数据处理流程
-
- ReduceTask 负责reduce阶段的整个数据处理流程
- ReduceTask 负责reduce阶段的整个数据处理流程
3-MapReduce的编程规范
MapReduce 的开发一共有八个步骤, 其中 Map 阶段分为 2 个步骤,Shuffle 阶段 4 个步骤,Reduce 阶段分为 2 个步骤 Map 阶段 2 个步骤
-
- 设置 InputFormat 类, 将数据切分为 Key-Value(K1和V1) 对, 输入到第二步
-
- 自定义 Map 逻辑, 将第一步的结果转换成另外的 Key-Value(K2和V2) 对, 输出结果 Shuffle 阶段 4 个步骤
-
- 对输出的 Key-Value 对进行分区
-
- 对不同分区的数据按照相同的 Key 排序
-
- (可选) 对分组过的数据初步规约, 降低数据的网络拷贝
-
- 对数据进行分组, 相同 Key 的 Value 放入一个集合中 Reduce 阶段 2 个步骤
-
- 对多个 Map 任务的结果进行排序以及合并, 编写 Reduce 函数实现自己的逻辑, 对输 入的 Key-Value 进行处理, 转为新的 Key-Value(K3和V3)输出
-
- 设置 OutputFormat 处理并保存 Reduce 输出的 Key-Value 数据
10-MapReduce分区-原理
在 MapReduce 中, 通过我们指定分区, 会将同一个分区的数据发送到同一个 Reduce 当 中进行处理
例如: 为了数据的统计, 可以把一批类似的数据发送到同一个 Reduce 当中, 在同一个 Reduce 当中统计相同类型的数据, 就可以实现类似的数据分区和统计等
其实就是相同类型的数据, 有共性的数据, 送到一起去处理
Reduce 当中默认的分区只有一个
- Step 1. 定义 Mapper
- 这个 Mapper 程序不做任何逻辑, 也不对 Key-Value 做任何改变, 只是接收数据, 然后往下 发送
- Step 2. 定义 Reducer 逻辑
- 这个 Reducer 也不做任何处理, 将数据原封不动的输出即可
- Step 3. 自定义
- Partitioner 主要的逻辑就在这里, 这也是这个案例的意义, 通过 Partitioner 将数据分发给不同的
- Step 4. Main 入口
12-MapReduce排序-概述
- 序列化 (Serialization) 是指把结构化对象转化为字节流
- 反序列化 (Deserialization) 是序列化的逆过程. 把字节流转为结构化对象. 当要在进程间传递对象或持久化对象的时候, 就需要序列化对象成字节流, 反之当要将接收到或从 磁盘读取的字节流转换为对象, 就要进行反序列化
- Java 的序列化 (Serializable) 是一个重量级序列化框架, 一个对象被序列化后, 会附带 很多额外的信息 (各种校验信息, header, 继承体系等), 不便于在网络中高效传输. 所 以, Hadoop 自己开发了一套序列化机制(Writable), 精简高效. 不用像 Java 对象类一 样传输多层的父子关系, 需要哪个属性就传输哪个属性值, 大大的减少网络传输的开销
- Writable 是 Hadoop 的序列化格式, Hadoop 定义了这样一个 Writable 接口. 一个类 要支持可序列化只需实现这个接口即可
- 另外 Writable 有一个子接口是 WritableComparable, WritableComparable 是既可 实现序列化, 也可以对key进行比较, 我们这里可以通过自定义 Key 实现 WritableComparable 来实现我们的排序功能