1、Mapreduce的简介
1. mapreduce是hadoop的三大重要模块之一
2. mapreduce是一个并发的计算和分析框架,用于计算和分析分布式文件系统上的大数据集。
3. 将计算划分为两个阶段:一个map(映射)阶段,一个reduce(归约)阶段
4. 该框架的开发灵感来源于google的《mapreduce》论文
5. 方便开发人员在不会分布式计算的情况下,开发和运行相关计算程序。
2、优缺点
1. 优点
- 适合离线数据处理
- mapreduce编程简单
- 扩展性良好
- 高容错性
2. 缺点
- 不适合实时计算(实时计算:毫秒级别/秒级别,离线计算:秒级别以上)
- 不适合流式计算(mapreduce处理的数据是静态的,不是流式的数据)
- 不适合DAG(有向图)计算
3、 Mapreduce的核心思想
简单的一句话概括:“移动计算而非移动数据”。
程序员将自己写好的业务逻辑代码和mr自带的一些组件打包成计算程序,移动到有数据存储的节点上,这样可以利用多节点的cpu的并发能力,提高计算效率(怎么提高的?一减少数据移动的开销,二利用了并发计算原理)
mapreduce是分为两个阶段,map阶段处理的是块文件(原始文件),计算后的结果存储本地磁盘,reduce阶段要跨节点fetch属于自己要处理的数据,计算后的结果存储到hdfs上(当然也可以存储到客户端所在的本地磁盘)
4、分区器是什么时候被调用
在map函数输出数据以后,进入环形缓冲区的时候。
5、job提交流程
1、Client启动main方法,调用submit方法向resourcemanager进行提交作业,实际上是YarnRunner进行提交
2、客户端提交申请,表示想运行一个application
3、返回客户端一个application_id
4、客户端将自己准备好的应用程序代码,及底层计算好的分片信息持久化文件,和一些相关配置信息共享到HDFS上
5、客户端所有工作准备好后,进行最后一次提交
6、resourcemananger选择一个节点,通过对应nodemanager来分片资源,让其运行一个appmaster进程
7、nodemanager下载hdfs上的资源,进行作业初始化,比如分片信息构建maptask,和块的位置信息
8、nodemanager根据初始化发现位置信息等向resourcemanager进行申请资源
9、appmaster和nodemanager共同完成资源的启用
10、需要将hdfs上相关内容比如计算程序,分片信息本地化
11、下载后,开始正式运行,期间会不断的向appmaster进行汇报
12、appmaster收到最后一个tesk运行成功后,会向客户端进行汇报
6、Shuffle概念
从map阶段的map函数输出开始,到reduce阶段的reduce函数接受数据为止,这个过程称之为shuffle阶段。
整个shuffle阶段可以划分为map端的shuffle和reduce端的shuffle.
7、shuffle-map端的流程
1、输出k2、v2进入环形缓冲区
2、超过80MB则溢写,剩下20MB会继续写入,如20MB写满则maptask出现阻塞
3、溢写前先分区再排序
4、溢写产生了临时文件,按照分区号将每一个分区数据写入文件中
5、排序后、溢写前,可以调用combiner减少数据溢写,目的减少io
6、溢写文件有多个会进行合并
7、溢写文件超过3个会进行合并排序,调用combiner,如不足3个,不用调用
8、为减少临时文件的网络io,建议压缩,再传输
8、shuffle-reduce端的流程
1、利用默认5个线程处理分区的数据,并且通过HTTP协议进行抓取数据
2、数据过小,直接排序输给函数
3、数据过大,拷贝本地磁盘,合并大文件。合并因子为10,采用归并算法
4、归并算法合并后,如果map数据为压缩文件需要进行解压再合并
5、最后存储再HDFS上
9、分片的简介
MapReduce在进行作业提交时,会预先对将要分析的原始数据进行划分处理,形成一个个等长的逻辑数据对象,称之为输入分片(inputSplit),简称“分片”。
10、分片大小如何选择
1. 如果分片太小,管理分片的总时间和构建map任务的总时间将决定作业的整个执行时间
2. 如果分片太大,会跨越两个数据块,那么分片的部分数据需要通过网络传输到map任务运行的节点,占用网络带宽,效率更低
3.因此最佳分片大小应该和HDFS上的块大小一致。hadoop2.x默认128M.
4.分片信息包括起始偏移量,分片大小,分片数据所在的块的信息,块所在的主机列表
-----------------------------------------------------练习----------------------------------------------------------------------
11、一个文件的分片列表,是在执行MapTask之前创建的,还是执行MapTask时创建的?
分片的个数决定了MapTask的数量,分片的描述信息决定了MapTask要处理的原始数据。因此,一定是在Maptask执行前获取的分片信息列表
12、MapTask的数据由谁来决定。ReduceTask的个数由谁决定。
分片的个数决定了MapTask的个数
一个分片的描述信息决定了MaptTask要处理的数据
ReduceTask的个数由分区数(分区器里的逻辑)决定
13、分片与块的区别是什么
分片是逻辑数据,信息可能会跨块。记录的是要处理的物理块的信息
(分片信息包括起始偏移量,分片大小,分片数据所在的块的信息,块所在的主机列表)
块是物理数据,不能跨节点。真实存储在文件系统上的原始数据文件出现时机:
maperduces程序进行计算时,才会遇见分片概念
hdfs的存储才会涉及到分块的概念
14、520M的一个文件,分多少个块文件,有多少个分片
128+128+128+128+8 --->块的数量为5块
128+128+128+136 --->分片的数量为4个
15、hdfs的块大小如何选择,请说明理由
1. 考虑寻址时间最小化,与传输时间的比例在1:100被认为是最优的。
寻址时间通常是5~15毫米,平均10毫米。 10:1000.
再次考虑硬盘的传输速率。 每秒多少M. 选择接近于传输速率的2的N次方
300m/s 选择256m比较合适
100m/s 选择128m比较合适
16、分片大小如何选择,请说明理由
1. 如果分片太小,那么创建分片和创建maptask所需要的时间要远远大于分析时间。不合理
2. 如果分片太大, 势必会跨块,跨节点进行传输数据,占用网络带宽的资源。
3. 因此选择和块大小一致,是最合适的。
17、序列化
-- 序列化:
将内存中的对象转成二进制的字节序列形式
-- 反序列化:
讲二进制形式的字节序列转成内存中的对象
-- 应用领域
(1) 持久化到磁盘上保存
(2) 网络传输
hadoop序列化机制
因为hadoop一定会涉及到网络传输,因此hadoop序列化的要求应该是体积小,速度快,占用带宽小。 所以有以下特征:紧凑、快速、可扩展、支持互操作