HDFS架构
1.HDFS的Block块概念
HDFS默认的Block块大小为128 MB。为何HDFS中的一个块那么大?
HDFS的block块比磁盘的块大,目的是为了减小寻址开销。通过让一个块足够大,从磁盘转移数据的时间能够远远大于定位这个块开始端的时间。因此,传送一个由多个块组成的文件的时间就取决于磁盘传输送率。
//HDFS中 fsck 指令会显示块的信息
% hadoop fsck / -files -blocks
2.NN主要功能
1). NN提供名称查询服务,它是一个Jetty服务器
2).NN维护着两张关键性的表:①. filename -> blocksequence (namespace) ②. block -> machinelist ("inodes"). 第①张表保存在磁盘,非常珍贵。第②张表每次NN启动时都会在内存中重建。
3).表①维护着整个HDFS系统的元数据信息。NN不需要从磁盘读取metadata,所有数据都在内存中,硬盘上的元数据文件 fsimage 和edits 只是序列化的结果,只有每次NN启动的时候才会读取。
4). 表②记录着每个文件的数据块存储的DN,但它并不永久保存块的位置信息,因为这些信息由DN通过每6小时发送一次Block-Report时重建
3.NN目录结构
NN被格式化之后(区别于DN:使用前不用格式化),将产生如下所示的目录结构:
1). 实际生产环境中为了安全机制,将dfs.name.dir配置成以逗号隔开的一组目录,各个目录存储的内容相同。这个机制使得系统具备一定的还原能力,特别是当其中一个目录位于NFS之上时(推荐配置)
2). fsimage文件其实是Hadoop文件系统元数据的一个永久性的检查点,其中包含Hadoop文件系统中的所有目录和文件idnode的序列化信息
3). edits文件存放的是Hadoop文件系统的所有更新操作的路径,文件系统客户端执行的所以写操作首先会被记录到edits文件中
4.SNN主要功能
每个集群都有一个,SNN只有一个职责:合并NN中的edits到fsimage中,减少NN启动时间。
- SNN请求NN停止使用edits文件,暂时将新的写操作记录到一个新的edits.new文件中。
- SNN通过网络从NN拷贝fsimage和edits文件。
- SNN首先将fsimage加载到内存,然后逐一执行edits中的操作,最后将内存中最新的元数据信息写到本地磁盘,生成新的fsimage文件(该fsimage就是SNN Checkpoint 生成的元数据文件)。
- SNN通过网络将新的fsimage拷贝到NN。
- NN用新的fsimage代替旧的fsimage;并用步骤 ① 所产生的edits(不一定为空)代替旧的edits文件。
- NN拥有最新的fsimage文件和一个更小的edits文件。SNN上也保存着最新的fsimage文件。
除此之外,当NN处于安全模式时,管理员也可以调用以下命令来手动执行合并两文件:
//必须是在安全模式
hdfs dfsadmin -safemode enter
hadoop dfsadmin –saveNamespace
从配置文件hdfs-default.xml中,可以看出SNN定期 3600s=1h 触发一次CheckPoint。不仅可以保证各个CheckPoint阶段的元数据的可靠性,同时,进行fsimage与edits的合并,可以有效限制edits的大小,防止其无限制增长。
5.DN节点( 向NN 发送heartbeat 和 DirectoryScan)
- DN响应来自HDFS客户端的读写请求,还响应来自NN的创建、删除和复制块的命令。
- DN启动后,首先向NN注册,然后周期性(21600s = 6小时)的向NN发送目录扫描信息(DirectoryScan)。
- 向NN定期(3秒一次)发送心跳(heartbeat)保持与其联系,如果NN10分钟没有收到DN的心跳,则认为其已经lost,并将其上的Blcok复制到其他DN节点。
6.DN目录结构
DN存储目录启动时自动创建,不需要额外格式化【区别于DN】。通过参数dfs.datanode.data.dir 配置。
- 以blk_ 开始的块文件:节点所存储的数据本身
- 以.meta结尾的元数据文件:包含数据块的长度、Blcok块数据的校验和以及时间戳
- 都是以二进制形式保存的,可以使用读取二进制的命令od 验证
Block副本放置策略:
- 副本1:上传Client的节点上
- 副本2:不同机架中的节点上
- 副本3:与第二个副本同一机架的另一个节点上
7.文件的读取
1) 使用HDFS提供的客户端Client向远程的NN发起RPC请求
2) NN会视情况返回请求文件的部分或者全部Blcok列表,对于每个Blcok,NN都会返回所有存储该Blcok副本的DN地址
3) 客户端Client会选择距离最近的DN来读取Blcok;如果客户端本身就是DN,将直接从本地读取数据
4) 读取完当前Blcok的数据后,关闭与当前DN的连接,并寻找读取下一个Blcok块的最佳DN
5) 当读完列表中的Blcok后,如若文件读取还没有结束,客户端会继续向NN获取下一批Blcok块的列表
6) 每读取完一个Blcok都会进行CheckSum验证,如果CheckSum验证出现错误,客户端会通知NN,然后再从列表中选择下一个拥有该Blcok副本的DN继续读取
8.文件的写入
1) NameNode发起文件写入的请求
2) NameNode根据文件大小和文件块配置情况,返回给Client它所管理部分DataNode的信息
3) Client将文件划分为多个Block,根据DataNode的地址信息,按顺序写入到每一个DataNode块中