笔记十三:HDFS、MapReduce原理

元数据的存储流程步骤

分别从NameNode、Secondary NameNode两个方面

(1)NameNode

1)NameNode第一次启动时,先把最新的fsimage文件中内容加载到内存中,
同时会把edits文件中内容也加载到内存中;

2)客户端发起指令(增删改查等操作),
NameNode接收到客户端指令把每次产生的新的指令操作先放到内存中;

3)然后把刚才内存中新的指令操作写入到edits_inprogress文件中;

4)edits_inprogress文件中数据到了一定阈值的时候,
把文件中历史操作记录写入到序列化的edits备份文件中(同时更新文件名);

5)NameNode就在上述2-4步中循环操作...

(2)Secondary NameNode

1)当Secondary NameNode检测到自己距离上一次检查点(checkpoint)
已经1小时或者事务数达到100w,就触发Secondary NameNode
询问NameNode是否对edits文件和fsimage文件进行合并操作;

2)NameNode告知可以进行合并;

3)Secondary NameNode将NameNode上积累的所有edits和一个最新的fsimage下载/拉取到本地,
并加载到内存进行合并(这个过程称检查点checkpoint);

4)Secondary NameNode把刚才合并后的fsimage.checkpoint文件拷贝给NameNode;

5)NameNode把拷贝过来的最新的fsimage.checkpoint文件,重命名为fsimage,覆盖原来的文件。

HDFS存储原理

当使用HDFS分布式文件系统存储数据时,遵循三个原理机制:

(1)副本机制

(2)负载均衡机制

(3)心跳机制

1)三副本机制

2)负载均衡机制

3)心跳机制

(1)DataNode每隔3秒钟向NameNode汇报自己的状态信息;

(2)如果某个时刻,DataNode连续10次不汇报了,
NameNode会认为DataNode有可能宕机了;

(3)NameNode就会每5分钟(300000毫秒)继续发送一次确认消息,
连续2次没有收到回复,就认定DataNode此时一定宕机了。

HDFS读写数据

HDFS写入数据流程

1)客户端给NameNode,发起写入数据的请求;

2)NameNode接收到客户端请求后,开始校验(是否有权限、路径是否存在、文件是否存在等),
如果校验成功,就告知客户端可以准备写入数据;

3)客户端收到可以写入的消息后,开始把文件数据分割成默认128MB大小的block块,
并且把block块数据拆分成64kb的packet数据包,然后放入传输队列;

4)客户端携带block块信息,再次向NameNode发送请求,获取能够存储block块的DataNode列表;
5)NameNode查看当前距离上传位置较近且不忙的DataNode,放入列表中,返回给客户端;

6)客户端连接DataNode,开始发送packet数据包,第一个DataNode接收完后,
就给客户端ack应答(客户端就可以传入下一个packet数据包),
同时第一个DataNode开始复制刚才接收到的数据包给DataNode2,
接收后也复制给DataNode3(复制成功也需要返回ack应答),
最终建立了pipeline传输通道以及ack应答通道;

7)其他packet数据包,根据第一个packet数据包经过的传输通道和应答通道,
循环传入packet,直到当前block块传输完成
(存储了block信息的DataNode需要把已经存储的块信息定期的同步给NameNode);

8)其他block块数据存储,反复多次执行上述4-7步,直到所有block块传输完成,
意味着文件数据被写入成功(NameNode把该文件的元数据也要保存);

9)最后客户端和NameNode互相确认,文件数据已经保存完成。

HDFS读取数据流程

1)客户端给NameNode发送读取文件请求;

2)NameNode接收到请求,然后进行一系列校验(路径是否存在、文件是否存在、是否有权限等),
如果没有问题,就告知可以开始读取;

3)客户端需要再次和NameNode确认当前文件在哪些DataNode中存储;

4)NameNode查看当前距离下载位置较近且不忙的DataNode,放入列表中返回给客户端;

5)客户端找到最近的DataNode开始读取文件对应的block块信息(每次传输是以64kb的packet数据包),
放到内存缓冲区中;

6)接着读取其他block块信息,循环上述3-5步,
直到所有block块读取完毕(根据块编号拼接成完整数据);

7)最后从内存缓冲区把数据通过流写入到目标文件中。

MapReduce

分布式计算引擎,包含两个阶段任务:

a)Map阶段并行处理输入的数据;

b)Reduce阶段对Map结果进行汇总处理。

拓展

大数据开发技术下的分布式计算引擎:

(1)分散 -> 汇总模式
    MapReduce

(2)中心调度 -> 步骤执行模式
    Spark、Flink

原理

核心思想:分而治之

(1)Map:负责【分】,即把复杂的任务分解为若干个“简单的任务”来并行处理;

(2)Reduce:负责【合】,即对map阶段的结果进行全局汇总处理。

阶段

Map阶段 --> Shuffle阶段 --> Reduce阶段

阶段1:Map阶段

第1步:是把输入目录下文件按照一定的标准逐个进行逻辑切片,形成切片规划。
默认情况下,Split size等于Block size[128MB]。
每一个切片由一个MapTask处理(当然,也可以通过参数单独修改split大小);

第2步:是对切片中的数据按照一定的规则解析成对。默认规则是把每一行文本内容解析成键值对。
key是每一行的起始位置(单位是字节),value是本行的文本内容;

第3步:是调用Mapper类中的map()方法。把上阶段中每解析出来的一个,都调用一次map()方法,
而每次调用map()方法都会输出零个或多个键值对;

第4步:是按照一定的规则,对第3步输出的键值对进行分区。默认是只有一个区。
分区的数量就是Reducer任务运行的数量。且默认只有一个Reducer任务;

第5步:是对每个分区中的键值对进行排序。首先,按照键进行排序,对于键相同的键值对,
按照值进行排序。比如三个键值对<2,2>、<1,3>、<2,1>,键和值分别是整数。
那么排序后的结果是<1,3>、<2,1>、<2,2>。如果有第6步,那么进入第6步;
如果没有,直接输出到文件中;

第6步:是对数据进行局部聚合处理,也就是combiner(规约、组合)处理。
键相等的键值对会调用一次reduce方法。经过这一步,数据量会减少。当然,本步骤默认是没有的。


阶段2:Shuffle阶段

Collect(收集) -> Spill(溢出) -> Merge(合并) -> Copy(复制) -> Merge(合并) -> Sort(排序)

Collect阶段:将MapTask的结果输出到默认大小为100M的环形缓冲区,
保存的是key/value,Partition分区信息等;

Spill阶段:当内存中的数据量达到一定的阀值(80%)的时候,就会将数据写入本地磁盘,
在将数据写入磁盘之前需要对数据进行一次排序的操作,如果配置了combiner,
还会将有相同分区号和key的数据进行排序;

Merge阶段:把所有溢出的临时文件进行一次合并操作,
以确保一个MapTask最终只产生一个中间数据文件;

Copy阶段: ReduceTask启动Fetcher线程到已经完成MapTask的节点上
并复制一份属于自己的数据,这些数据默认会保存在内存的缓冲区中,
当内存的缓冲区达到一定的阀值的时候,就会将数据写到磁盘之上;

Merge阶段:在ReduceTask远程复制数据的同时,
会在后台开启两个线程对内存到本地的数据文件进行合并操作;

Sort阶段:在对数据进行合并的同时,会进行排序操作,
由于MapTask阶段已经对数据进行了局部的排序,
ReduceTask只需保证Copy的数据的最终整体有效性即可。 


阶段3:Reduce阶段 [wordcount]

第1步:是Reducer任务会主动从Mapper任务复制其输出的键值对。Mapper任务可能会有很多,
因此Reducer会复制多个Mapper的输出;

第2步:是把复制到Reducer本地数据,全部进行合并,即把分散的数据合并成一个大的数据,
再对合并后的数据排序;

第3步:是对排序后的键值对调用reduce方法。键相等的键值对调用一次reduce方法,
每次调用会产生零个或者多个键值对。最后把这些输出的键值对写入到HDFS文件中。

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值