Hadoop分布式文件系统-HDFS架构

一、HDFS的简介

HDFS全称Hadoop Distributed File System,是分布式文件管理系统。主要是为了解决大数据如何存储的问题,跟一般文件系统不同的是,它可以通过扩展服务器结点来扩充存储量,可以用低成本的硬件构建出支持高吞吐量的文件系统。

二、HDFS的特点

  • 高容错性:一个HDFS集群会包含非常多的结点,HDFS将文件分块存储,并且会保存多个副本到不同的机器节点上以保证数据的安全,而且HDFS可以检测故障,并快速地从故障中恢复。

  • 高吞吐率:与一般的文件系统的访问低延迟不同,HDFS的重点是处理大量数据,支持数据处理的规模甚至可以达到PB级别。因此,HDFS更适合用于批量处理数据。

  • 适合大数据处理:HDFS中的典型的文件大小为GB到TB,对于小批量的文件HDFS无法做到高效的存储。

  • 流式数据访问:HDFS设计时考虑了数据批处理,而不是用户交互处理。在这种模式下,应用需要流式访问它们的数据集。

  • 一次写入多次读取:一个文件只支持单线程的文件写入,HDFS假定一个文件一旦被创建,写入完成之后除了追加和截断就不需要更改。这种设置简化了数据的一致性问题,也提高了数据访问的吞吐率,同时也不支持文件的随机修改。

三、HDFS的架构

HDFS采用标准的主从架构集群。一般一个集群是由一个Namenode和若干个Datanode组成。Namenode是HDFS的主节点,Datanode是HDFS的从节点,二者各司其职,共同协调完成分布式文件存储服务。Hadoop分布式文件系统-HDFS架构_第1张图片

四、HDFS的组成角色及其功能

  • Namenode:元数据结点

    • 管理文件系统的Namespace元数据

    • 配置副本策略

    • 管理数据块的映射信息

    • 控制客户端对文件的访问

    • 一个HDFS只能有一个active的Namenode

  • Datanode:数据结点

    • 数据存储结点,保存和检索Block

    • 一个集群可以有多个数据结点

  • Secondary Namenode:从元数据结点

    • 合并NameNode的edit logs到fsimage文件中

    • 辅助Namenode将内存中的元数据信息持久化

  • Client:客户端

    • 用户可以通过客户端与HDFS交互

    • 负责与Namenode和Datanode交互

    • 提供HDFS的管理和访问命令

五、HDFS的副本机制

  • Block:数据块

    • HDFS最基本的存储单元

    • HDFS中的文件在物理上是分块存储(block)的,默认的大小是128M,不足128M的则自身就是一块。

    • 块的大小可以通过配置参数来规定

  • 副本机制

    • 文件的所有block都会有副本

    • 副本数由参数dfs..replication控制,默认值是3,也就是额外再复制2份。

  • 副本的存放机制

    • 一个在本地机架结点

    • 一个在同一个机架不同结点

    • 一个在不同机架的结点

      Hadoop分布式文件系统-HDFS架构_第2张图片

六、HDFS的文件写入流程

  1. 使用HDFS提供的客户端开发库Client向远程的Namenode发起RPC请求

  2. Namenode会检查要创建的文件是否已经存在,创建者是否有权进行操作,成功则会为文件创建一个记录,否则则会让客户端抛出异常。

  3. 当客户端开始写入文件时,开发库会将文件切分成多个packets,并在内部以数据队列"data queue"的形式管理这些packets,并向namenode申请新的blocks,获取用来储存replications的合适的datanodes列表,列表的大小根据在Namenode中对replication的设置而定。

  4. 开始以pipeline(管道)的形式将packet写入所有的replicas中。开发库把packet以流的方式写入第一个datanode,该datanode把该packet存储之后,再将其传递给在此pipeline中的下一个datanode,直到最后一个datanode,这种写数据的方式呈流水线的形式。

  5. 最后一个datanode成功存储之后会返回一个ack packet,在pipeline里传递至客户端,在客户端的开发库内部维护着"ack queue",成功收到datanode返回的ack packet后会从"ack queue"移除相应的packet。

  6. 如果传输过程中,有某个datanode出现了故障,那么当前的pipeline会被关闭,出现故障的datanode会从当前的pipeline中移除,剩余的block会继续剩下的datanode中继续以pipeline的形式传输,同时Namenode会分配一个新的datanode,保持replicas设定的数量。

七、HDFS的文件读取流程

  1. 使用HDFS提供的客户端开发库Client,向远程的Namenode发起RPC请求;

  2. Namenode会视情况返回文件的部分或者全部block列表,对于每个block,Namenode都会返回有该block拷贝的DataNode地址;

  3. 客户端开发库Client会选取离客户端最接近的DataNode来读取block;如果客户端本身就是DataNode,那么将从本地直接获取数据.

  4. 读取完当前block的数据后,关闭与当前的DataNode连接,并为读取下一个block寻找最佳的DataNode;

  5. 当读完列表的block后,且文件读取还没有结束,客户端开发库会继续向Namenode获取下一批的block列表。

  6. 读取完一个block都会进行checksum验证,如果读取datanode时出现错误,客户端会通知Namenode,然后再从下一个拥有该block拷贝的datanode继续读。

    //六、七参考文章:hadoop hdfs文件读取写入流程_服务器从hdfs服务器上读取文件到写到本地服务器-CSDN博客

你可能感兴趣的:(hadoop,hadoop,hdfs)