hadoop笔记(三)HDSF原理

前面完成了Hadoop的伪分布式搭建和集群的搭建。为hadoop的学习提供环境,接下来是对hadoop的hdfs和mapreduce原理进行讲述。
1.hdfs
HDFS是分布式文件系统,当然当前市面上分布式文件系统不止hdfs这么一个。适合一次写入,多次查询场景。其特点就是容错性好,就算系统中某个节点脱机,整体来说系统仍然可以持续运作而不会有数据损失。其架构图如下:

图片1.jpg

HDFS架构有NameNode、DataNode、secondaryNameNode构成。
(1)NameNode :是整个文件系统的管理街节点,维护文件系统的目录树。记录文件/目录的元数据信息以及每个文件对应的数据块列表。也是接受用户的操作请求。它的文件主要包括:
fsimage:元数据镜像文件,存储namenode某一段时间内,元数据存储信息。
edits:操作日志信息。记录操作信息。
fstime:记录最近一次checkpoint时间。
以上文件在linux中都是可以看到的。具体位置跟hdfs-site.xml中,dfs.name.dir配置的路径下。如图,我自己的配置为:
2.PNG

当客户端请求到达namenode时候,在namenode中将元数据存储。元数据存储细节如下图:
3.PNG

NameNode的工作特点:
第一:namenode始终在内存中保存metedata,用于处理“读”请求。
第二:当有“写”请求时候,namenode首先会向edits日志,成功返回后,修改内存。并且向客户端返回。
第三:namenode会维护一个fsimage文件,也就是metedata的镜像文件。在伪分布式中,fsimage不会随时和内存中metadata数据保持一致,会每隔一定时间进行合并edits文件来更新内容。secondrynamenode就是用来合并fsimage和edits文件来更新namenode的metedata的。当然数据合并的标准(checkpoint)为:时间的长短和edits文件的大小。也是fs.checkpoint.period和fs.checkpoint.size
(2)secondryName
secondryname是HA的一个解决方案,直接配置即可,工具流程就是从namenode下载fsimage和edits,合并成新的fsimage在本地保存并推送到NameNode替换旧的fsimage。默认安装在NameNode上,但是这样会是不安全的。
secondryName工作流程,secondryname通知namenode切换edits文件,然后从nameNode下载edits和fsimage文件,将fsimage加载到内存中,并开始合成edits文件,将新合成文件 发送给nameNode,替换旧的fsimage文件。如下图:
image.png

(3)DataNode
datanode是真是存储数据地方,Hdfs默认文件快的大小为128m。replication备份数量为3份。
(4)HDFS的读取过程
1.初始化FileSystem,然后客户端(client)用FileSystem的open()函数打开文件
2.FileSystem用RPC调用元数据节点,得到文件的数据块信息,对于每一个数据块,元数据节点返回保存数据块的数据节点的地址。
3.FileSystem返回FSDataInputStream给客户端,用来读取数据,客户端调用stream的read()函数开始读取数据。
4.DFSInputStream连接保存此文件第一个数据块的最近的数据节点,data从数据节点读到客户端(client)
5.当此数据块读取完毕时,DFSInputStream关闭和此数据节点的连接,然后连接此文件下一个数据块的最近的数据节点。
6.当客户端读取完毕数据的时候,调用FSDataInputStream的close函数。
7.在读取数据的过程中,如果客户端在与数据节点通信出现错误,则尝试连接包含此数据块的下一个数据节点。
8.失败的数据节点将被记录,以后不再连接。
image.png

(5)HdFS写的过程
1.初始化FileSystem,客户端调用create()来创建文件
2.FileSystem用RPC调用元数据节点,在文件系统的命名空间中创建一个新的文件,元数据节点首先确定文件原来不存在,并且客户端有创建文件的权限,然后创建新文件。
3.FileSystem返回DFSOutputStream,客户端用于写数据,客户端开始写入数据。
4.DFSOutputStream将数据分成块,写入data queue。data queue由Data Streamer读取,并通知元数据节点分配数据节点,用来存储数据块(每块默认复制3块)。分配的数据节点放在一个pipeline里。Data Streamer将数据块写入pipeline中的第一个数据节点。第一个数据节点将数据块发送给第二个数据节点。第二个数据节点将数据发送给第三个数据节点。
5.DFSOutputStream为发出去的数据块保存了ack queue,等待pipeline中的数据节点告知数据已经写入成功。
6.当客户端结束写入数据,则调用stream的close函数。此操作将所有的数据块写入pipeline中的数据节点,并等待ack queue返回成功。最后通知元数据节点写入完毕。
7.如果数据节点在写入的过程中失败,关闭pipeline,将ack queue中的数据块放入data queue的开始,当前的数据块在已经写入的数据节点中被元数据节点赋予新的标示,则错误节点重启后能够察觉其数据块是过时的,会被删除。失败的数据节点从pipeline中移除,另外的数据块则写入pipeline中的另外两个数据节点。元数据节点则被通知此数据块是复制块数不足,将来会再创建第三份备份。
image.png

你可能感兴趣的:(hadoop笔记(三)HDSF原理)