1.HDFS的组成架构
hdfs由四部分组成:HDFS Client 、NameNode 、DataNode 、Secondary NameNode
NN和DN的详细作用:
1.NameNode作用 :
NameNode在内存中保存着整个文件系统的名称空间和文件数据块的地址映射,整个HDFS可存储的文件数受限于NameNode的内存大小。
名称空间:hdfs对外提供一个唯一的路径用来确定某个文件的路径,这个路径就叫名称空间。
数据块的地址映射:一个文件被分成多个block,每一个block在哪个datanode上就叫数据块的地址映射。
1、NameNode元数据信息: 文件名,文件目录结构,文件属性(生成时间,副本数,权限),每个文件的块列表。 以及列表中的块与块所在的DataNode之间的地址映射关系 在内存中加载文件系统中每个文件和每个数据块的引用关系(文件、block、datanode之间的映射信息) 数据会定
期保存到本地磁盘(fsImage文件和edits文件),因为这些元数据信息是在namenode的内存中存储的,会不安全,所以会定期向fsimage(镜像文件)备份,而edits则是做日志的记录。一点重启hdfs会从fsimage中恢复所有的元数据信息。
2、NameNode文件操作: NameNode负责文件元数据的操作 DataNode负责处理文件内容的读写请求,数据流不经过NameNode,会询问它跟那个DataNode联系。
3、NameNode副本: 文件数据块到底存放到哪些DataNode上,是由NameNode决定的,NN根据全局情况做出放置副本的决定。
4、NameNode心跳机制: 全权管理数据块的复制,周期性的接受心跳和块的状态报告信息(包含该DataNode上所有数据块的列表) 若接受到心跳信息,NameNode认为DataNode工作正常,如果在10分钟后还接受到不到DN的心跳,那么NameNode认为DataNode已经宕机 ,这时候NN准备要把DN上的数据块进行重新的复制。 块的状态报告包含了一个DN上所有数据块的列表,blocks report 每个1小时发送一次。
1.DataNode作用 :
提供真实文件数据的存储服务。
1、DataNode以数据块的形式存储HDFS文件
2、DataNode 响应HDFS 客户端读写请求
3、DataNode 周期性向NameNode汇报心跳信息
4、DataNode 周期性向NameNode汇报数据块信息
5、DataNode 周期性向NameNode汇报缓存数据块信息----如果某个datanode上有一个块数据经常被访问,那么就会把这个块放入内存中,这样可以大大的提高读写速度,那么这个块就变成了缓存数据块。
2.HDFS的副本机制和机架感知
2.1.副本机制:
默认的副本数为3,可以自定义配置。
所有的文件都是以 block 块的方式存放在 HDFS 文件系统当中,作用如下:
1. 一个文件有可能大于集群中任意一个磁盘,引入块机制,可以很好的解决这个问题。
2. 使用块作为文件存储的逻辑单位可以简化存储子系统。
3. 块非常适合用于数据备份进而提供数据容错能力。
2.2.机架感知:
HDFS分布式文件系统的内部有一个副本存放策略:以默认的副本数=3为例:
1、第一个副本块存本机。
2、第二个副本块存跟本机同机架内的其他服务器节点。
3、第三个副本块存不同机架的一个服务器节点上。
3.HDFS的安全模式
安全模式是hadoop的一种保护机制,用于保证集群中的数据块的安全性。当集群启动的时候,会首先进入安全模式。当系统处于安全模式时会检查数据块的完整性。在安全模式状态下,文件系统只接受读数据请求,而不接受删除、修改等变更请求。在,当整个系统达到安全标准时,HDFS自动离开安全模式。
3.1数据块的安全性检查:
主要检查副本是否安全:假设我们设置的副本数(即参数dfs.replication)是3,那么在datanode上就应该有3个副本存在,假设只存在2个副本,那么副本率就是2/3=0.666。hdfs默认的副本率0.999。我们的副本率0.666明显小于0.999,因此系统会自动的复制副本到其他dataNode,使得副本率不小于0.999。如果系统中有5个副本,超过我们设定的3个副本,那么系统也会删除多于的2个副本。
3.2与安全模式相关的命令:
hdfs dfsadmin -safemode get #查看安全模式状态
hdfs dfsadmin -safemode enter #进入安全模式
hdfs dfsadmin -safemode leave #离开安全模式
4.HDFS的写过程
共10个步骤:
4.HDFS的读过程
具体过程:
1. Client向NameNode发起RPC请求,来确定请求文件block所在的位置。
2. NameNode会视情况返回文件的部分或者全部block列表,对于每个block,NameNode 都会返回含有该 block 副本的 DataNode 地址; 这些返回的 DN 地址,会按照集群拓扑结构。
得出 DataNode 与客户端的距离,然后进行排序,排序两个规则:网络拓扑结构中距离 Client 近的排靠前;心跳机制中超时汇报的 DN 状态为 STALE,这样的排靠后。
3. Client 选取排序靠前的 DataNode 来读取 block,如果客户端本身就是DataNode,那么将从本地直接获取数据(短路读取特性)。
4. 底层上本质是建立 Socket Stream(FSDataInputStream),重复的调用父类 DataInputStream 的 read 方法,直到这个块上的数据读取完毕。
5. 当读完列表的 block 后,若文件读取还没有结束,客户端会继续向NameNode 获取下一批的 block 列表。
6. 读取完一个 block 都会进行 checksum 验证,如果读取 DataNode 时出现错误,客户端会通知 NameNode,然后再从下一个拥有该 block 副本的DataNode 继续读。
7. read 方法是并行的读取 block 信息,不是一块一块的读取;NameNode 只是返回Client请求包含块的DataNode地址,并不是返回请求块的数据。
8. 最终读取来所有的 block 会合并成一个完整的最终文件。
5.Secondary NameNode辅助管理fsImage和Edits文件过程
5.1FsImage 和 Edits 详解
edits
edits存放了客户端最近一段时间的操作日志客户端对 HDFS 进行写文件时会首先被记录在edits 文件中edits修改时元数据也会更新
fsimage
NameNode中关于元数据的镜像, 一般称为检查点, fsimage存放了一份比较完整的元数据信息
因为fsimage是NameNode的完整的镜像, 如果每次都加载到内存生成树状拓扑结构,这是非常耗内存和CPU, 所以一般开始时对NameNode的操作都放在edits中。
fsimage内容包含了 NameNode 管理下的所有DataNode文件及文件block及block 所在的 DataNode 的元数据信息。
随着edits内容增大,就需要在一定时间点和fsimage合并。
5.2Secondary NameNode 如何辅助管理 fsimage 与 edits 文件?
SecondaryNameNode 定期合并 fsimage 和 edits, 把 edits 控制在一个范围内。
1. SecondaryNameNode 通知 NameNode 切换 editlog。
2. SecondaryNameNode 从 NameNode 中获得 fsimage 和 editlog(通过http方式)。
3. SecondaryNameNode 将 fsimage 载入内存, 然后开始合并 editlog, 合并之后成为新的fsimage。
4. SecondaryNameNode 将新的 fsimage 发回给 NameNode。
5. NameNode 用新的 fsimage 替换旧的 fsimage。
5.3特点
1.完成合并的是 SecondaryNameNode, 会请求 NameNode 停止使用 edits, 暂时将新写操作放入一个新的文件中 edits.new。
2.SecondaryNameNode 从 NameNode 中通过 Http GET 获得 edits, 因为要和 fsimage 合并, 所以也是通过 Http Get 的方式把 fsimage 加载到内存, 然后逐一执行具体对文件系统的操作, 与 fsimage 合并, 生成新的 fsimage, 然后通过 Http POST 的方式把 fsimage 发送给 NameNode。
3.NameNode 从 SecondaryNameNode 获得了 fsimage 后会把原有的 fsimage 替换为新的 fsimage, 把 edits.new 变成 edits. 同时会更新 fstime。
4.Hadoop 进入安全模式时需要管理员使用 dfsadmin 的 save namespace 来创建新的检查点,SecondaryNameNode 在合并 edits 和 fsimage 时需要消耗的内存和 NameNode 差不多, 所以一般把 NameNode 和 SecondaryNameNode 放在不同的机器上。