网站搭建本地环境,网站标题优化技巧,二级网站建设方案 试行,网站底部优化字HDFS#xff08;Hadoop Distributed File System#xff09;是GFS的开源实现。
HDFS架构
HDFS是一个典型的主/备#xff08;Master/Slave#xff09;架构的分布式系统#xff0c;由一个名字节点Namenode(Master) 多个数据节点Datanode(Slave)组成。其中Namenode提供元数…HDFSHadoop Distributed File System是GFS的开源实现。
HDFS架构
HDFS是一个典型的主/备Master/Slave架构的分布式系统由一个名字节点Namenode(Master) 多个数据节点Datanode(Slave)组成。其中Namenode提供元数据服务Datanode提供数据流服务用户通过HDFS客户端与Namenode和Datanode交互访问文件系统。
如图3-1所示HDFS把文件的数据划分为若干个块Block每个Block存放在一组Datanode上Namenode负责维护文件到Block的命名空间映射以及每个Block到Datanode的数据块映射。 ▲图3-1 HDFS架构
HDFS客户端对文件系统进行操作时如创建、打开、重命名等Namenode响应请求并对命名空间进行变更再返回相关数据块映射的Datanode客户端按照流协议完成数据的读写。
HDFS基本概念
HDFS架构比较简单但涉及概念较多其中几个重要的概念如下
1. 块Block
Block是HDFS文件系统处理的最小单位一个文件可以按照Block大小划分为多个Block不同于Linux文件系统中的数据块HDFS文件通常是超大文件因此Block大小一般设置得比较大默认为128MB。
2. 复制Replica
HDFS通过冗余存储来保证数据的完整性即一个Block会存放在N个Datanode中HDFS客户端向Namenode申请新Block时Namenode会根据Block分配策略为该Block分配相应的Datanode replica这些Datanode组成一个流水线pipeline数据依次串行写入直至Block写入完成。
3. 名字节点Namenode
Namenode是HDFS文件系统的管理节点主要负责维护文件系统的命名空间Namespace或文件目录树Tree和文件数据块映射BlockMap以及对外提供文件服务。
HDFS文件系统遵循POXIS协议标准与Linux文件系统类似采用基于Tree的数据结构以INode作为节点实现一个目录下多个子目录和文件。INode是一个抽象类表示File/Directory的层次关系对于一个文件来说INodeFile除了包含基本的文件属性信息也包含对应的Block信息。
数据块映射信息则由BlockMap负责管理在Datanode的心跳上报中将向Namenode汇报负责存储的Block列表情况BlockMap负责维护BlockID到Datanode的映射以方便文件检索时快速找到Block对应的HDFS位置。
HDFS每一步操作都以FSEditLog的信息记录下来一旦Namenode发生宕机重启可以从每一个FSEditLog还原出HDFS操作以恢复整个文件目录树如果HDFS集群发生过很多变更操作整个过程将相当漫长。
因此HDFS会定期将Namenode的元数据以FSImage的形式写入文件中这一操作相当于为HDFS元数据打了一个快照在恢复时仅恢复FSImage之后的FSEditLog即可。
由于Namenode在内存中需要存放大量的信息且恢复过程中集群不可用HDFS提供HA主/备Namenode实现故障迁移Failover以及Federation多组Namenode提供元数据服务以挂载表的形式对外提供统一的命名空间特性以提高稳定性和减少元数据压力。
4. Datanode
Datanode是HDFS文件系统的数据节点提供基于Block的本地文件读写服务。定期向Namenode发送心跳。Block在本地文件系统中由数据文件及元数据文件组成前者为数据本身后者则记录Block长度和校验和checksum等信息。扫描或读取数据文件时HDFS即使运行在廉价的硬件上也能通过多副本的能力保证数据一致性。
5. FileSystem
HDFS客户端实现了标准的Hadoop FileSystem接口向上层应用程序提供了各种各样的文件操作接口在内部使用了DFSClient等对象并封装了较为复杂的交互逻辑这些逻辑对客户端都是透明的。
HDFS读写流程
HDFS写流程 写详细步骤
客户端向NameNode发出写文件请求。检查是否已存在文件、检查权限。若通过检查直接先将操作写入EditLog并返回输出流对象。 注WALwrite ahead log先写Log再写内存因为EditLog记录的是最新的HDFS客户端执行所有的写操作。如果后续真实写操作失败了由于在真实写操作之前操作就被写入EditLog中了故EditLog中仍会有记录我们不用担心后续client读不到相应的数据块因为在第5步中DataNode收到块后会有一返回确认信息若没写成功发送端没收到确认信息会一直重试直到成功client端按128MB的块切分文件。client将NameNode返回的分配的可写的DataNode列表和Data数据一同发送给最近的第一个DataNode节点此后client端和NameNode分配的多个DataNode构成pipeline管道client端向输出流对象中写数据。client每向第一个DataNode写入一个packet这个packet便会直接在pipeline里传给第二个、第三个…DataNode。 注并不是写好一个块或一整个文件后才向后分发每个DataNode写完一个块后会返回确认信息。 注并不是每写完一个packet后就返回确认信息个人觉得因为packet中的每个chunk都携带校验信息没必要每写一个就汇报一下这样效率太慢。正确的做法是写完一个block块后对校验信息进行汇总分析就能得出是否有块写错的情况发生写完数据关闭输输出流。发送完成信号给NameNode。 注发送完成信号的时机取决于集群是强一致性还是最终一致性强一致性则需要所有DataNode写完后才向NameNode汇报。最终一致性则其中任意一个DataNode写完后就能单独向NameNode汇报HDFS一般情况下都是强调强一致性
HDFS客户端写流程详解
图3-2所示为客户端完成HDFS文件写入的主流程。 ▲图3-2 客户端完成HDFS写入的主流程
1创建文件并获得租约
HDFS客户端通过调用DistributedFileSystem# create来实现远程调用Namenode提供的创建文件操作Namenode在指定的路径下创建一个空的文件并为该客户端创建一个租约在续约期内将只能由这一个客户端写数据至该文件随后将这个操作记录至EditLog编辑日志。Namenode返回相应的信息后客户端将使用这些信息创建一个标准的Hadoop FSDataOutputStream输出流对象。
2写入数据
HDFS客户端开始向HdfsData-OutputStream写入数据由于当前没有可写的BlockDFSOutputStream根据副本数向Namenode申请若干Datanode组成一条流水线来完成数据的写入如图3-3所示。 ▲图3-3 流水线数据写入示意图
3串行写入数据直到写完Block
客户端的数据以字节byte流的形式写入chunk以chunk为单位计算checksum校验和。若干个chunk组成packet数据以packet的形式从客户端发送到第一个Datanode再由第一个Datanode发送数据到第二个Datanode并完成本地写入以此类推直到最后一个Datanode写入本地成功可以从缓存中移除数据包packet如图3-4所示。 ▲图3-4 串行写入数据示意图
4重复步骤2和步骤3然后写数据包和回复数据包直到数据全部写完。
5关闭文件并释放租约
客户端执行关闭文件后HDFS客户端将会在缓存中的数据被发送完成后远程调用Namenode执行文件来关闭操作。
Datanode在定期的心跳上报中以增量的信息汇报最新完成写入的BlockNamenode则会更新相应的数据块映射以及在新增Block或关闭文件时根据Block映射副本信息判断数据是否可视为完全持久化满足最小备份因子。
HDFS读流程 读详细步骤
client访问NameNode查询元数据信息获得这个文件的数据块位置列表返回输入流对象。就近挑选一台datanode服务器请求建立输入流 。DataNode向输入流中中写数据以packet为单位来校验。关闭输入流
HDFS客户端读流程详解
相对于HDFS文件写入流程HDFS读流程相对简单如图3-5所示。 ▲图3-5 HDFS读流程
1HDFS客户端远程调用Namenode查询元数据信息获得这个文件的数据块位置列表返回封装DFSIntputStream的HdfsDataInputStream输入流对象。
2客户端选择一台可用Datanode服务器请求建立输入流。
3Datanode向输入流中写原始数据和以packet为单位的checksum。
4客户端接收数据。如遇到异常跳转至步骤2直到数据全部读出而后客户端关闭输入流。当客户端读取时可能遇到Datanode或Block异常导致当前读取失败。正由于HDFS的多副本保证DFSIntputStream将会切换至下一个Datanode进行读取。与HDFS写入类似通过checksum来保证读取数据的完整性和准确性。