MapReduce 总结
-
1:mapReduce 优点
《具有 易于编程、高容错性和高扩展性等优点》。
-
1:高容错性:Mapreduce的设计初衷就是使程序能够部署在廉价的pc机器上,这就要求它具有很高的容错性。比如一个机器挂了,它可以把上面的计算任务转移到另一个节点上运行,不至于这个任务运行失败,而且这个过程不需要人工参与,而完全是由hadoop内部完成的
-
2:高扩展性: 项目当你的计算资源得不到满足的时候,你可以通过简单的通过增加机器来扩展它的计算能力
-
3:易编程:它简单的实现一些接口,就可以完成一个分布式程序,这个程序可以分布到大量的廉价的pc机器上运行。也就是说你写一个分布式程序,跟写一个简单的串行程序是一模一样的。就是因为这个特性使的Mapreduce编程变得非常流行。
-
2:mapReduce 缺点:
《不擅长实时计算 不擅长流式计算 不擅长DAG(有向图)计算》
-
1:不擅长实时计算:Mapreduce无法做到像Mysql那样做到毫秒或者秒级的返回结果
-
2:不擅长流式计算:流式计算的输入数据是动态的,而Mapreduce的输入数据集是静态的,不能流态变化。这是Mapreduce自身的设计特点决定了数据源必须是静态的。
-
3:不擅长DAG: 多个应用程序存在依赖关系,后一个应用程序的输入为前一个应用程序的输出,在这种情况下,Mapreduce并不是不能做,而是使用后每个Mapreduce作业的输出结果都会写入到磁盘,会造成大量的磁盘IO,导致性能非常低下。
3:分布式计算框架MapReduce
- 分布式计算框架(计算向数据移动)
-
理解MapReduce
1:map:
— 读懂数据,映射为KV模型,并行分布式。
2:Reduce:
— 数据全量/分量加工 Reduce中可以包含不同的key
— 相同的Key汇聚到一个Reduce中
— 相同的Key调用一次reduce方法
— 排序实现key的汇聚 - 3:MapReduce
1:Hadoop核心之MapReduce是一个软件框架,基于该框架能够容易地编写应用程序,这些应用程序能够运行在由上千个商用机器组成的大集群上,并以一种可靠的,具有容错能力的方式并行地处理上TB级别的海量数据集。这个定义里面有着这些关键词,一是软件框架,二是并行处理,三是可靠且容错,四是大规模集群,五是海量数据集。因此,对于MapReduce,可以简洁地认为,它是一个软件框架,海量数据是它的“菜”,它在大规模集群上以一种可靠且容错的方式并行地“烹饪这道菜”。
2:MapReduce的思想就是“分而治之”。Mapper负责“分”,即把复杂的任务分解为若干个“简单的任务”来处理。“简单的任务”包含三层含义:一是数据或计算的规模相对原任务要大大缩小;二是就近计算原则,即任务会分配到存放着所需数据的节点上进行计算;三是这些小任务可以并行计算,彼此间几乎没有依赖关系。Reducer负责对map阶段的结果进行汇总。至于需要多少个Reducer,用户可以根据具体问题,通过在mapred-site.xml配置文件里设置参数mapred.reduce.tasks的值,缺省值为1。
客户端,用来提交MapReduce作业。
JobTracker,用来协调作业的运行。
Tasktracker,用来处理作业划分后的任务。
HDFS,用来在其它实体间共享作业文件。
MapReduce整个工作过程有序地包含如下工作环节:
作业的提交
作业的初始化
任务的分配
任务的执行
进程和状态的更新
作业的完成
-
Reduce Key.Value自定义
1:K,V使用自定义数据类型
— 作为参数传递,节省开发成本,提高程序自由度
— Writable序列化:使能分布式程序数据交互
— Comparable比较器:实现具体排序(字典序,数值序等)
4:MapReduce 角色
-
JobTracker:
— 核心,主,单点
— 调度所有的作业
— 监控整个集群的资源负载 -
TaskTracker
— 从,自身节点资源管理
— 和JobTracker心跳,汇报资源,获取Task -
Client
— 作业为单位
— 规划作业计算分布
— 提交作业资源到HDFS
— 最终提交作业到JobTracker -
弊端:
— JobTracker:负载过重,单点故障
— 资源管理与计算调度强耦合,其他计算框架需要重复实现资源管理
— 不同框架对资源不能全局管理
5:MapReduce 序列化
- 序列化:是指把结构化对象转化为字节流。
- 反序列化:是序列化的逆过程。把字节流转为结构化对象。
— 当要在进程间传递对象或持久化对象的时候,就需要序列化对象成字节流,
— 反之当要将接收到或从磁盘读取的字节流转换为对象,就要进行反序列化。
— Java 的序列化(Serializable)是一个重量级序列化框架,一个对象被序列
化后,会附带很多额外的信息(各种校验信息,header,继承体系…),不便于
— 在网络中高效传输;所以,hadoop 自己开发了一套序列化机制( Writable),
— 精简,高效。不用像 java 对象类一样传输多层的父子关系,需要哪个属性就传输
— 哪个属性值,大大的减少网络传输的开销。 - 实现接口:Writable 是 Hadoop 的序列化格式,
- — hadoop定义了这样一个Writable接口。
— 一个类要支持可序列化只需实现这个接口即可。
6:InputFormat :
- <FileInputFormat切片机制:>
① 简单地按照文件的内容长度进行切片
② 切片大小,默认等于block大小
③ 切片时不考虑数据集整体,而是逐个针对每一个文件单独切片
比如待处理数据有两个文件
a1.txt 320M
a2.txt 10M
经过FileInputFormat的切片机制运算后,形成的切片信息如下:
a.txt.split1-- 0~128
a1.txt.split2-- 128~256
a1.txt.split3-- 256~320
a2.txt.split1-- 0~10M - <CombineTextInputFormat切片机制:>
1:— 框架默认的TextInputFormat切片机制是对任务按文件规划切片,不管文件多小,都会是一个单独的切片,都会交给一个MapTask,
— 这样如果有大量小文件,就会产生大量的MapTask,处理效率极其低下
2:—CombineTextInputFormat用于小文件过多的场景,它可以将多个小文件从逻辑上规划到一个切片中,这样,多个小文件就可以交给一个MapTask处理