一文理解HDFS

一、架构原理HDFS 是Hadoop Distributed File System的简称,是HADOOP抽象文件系统的一种实现 。Hadoop抽象文件系统可以与本地系统、Amazon S3等集成,甚至可以通过Web协议(webhsfs)来操作 。
HDFS是由一个NAMENODE与多个DATANODE构成,如下图 。
其中NAMENODE负责管理分布式文件系统的命名空间(Namespace) 。
DATANODE 数据节点,用来具体的存储文件,维护了blockId 与 datanode本地文件的映射 。
换个理解方法就是MASTER WORKER 模式,其中NAMENODE 对应是master,进所有datanode的datanode mate 信息的关联以及监控等相关事情 。而DATANODE只负责存储数据 。

一文理解HDFS

文章插图
 
HDFS基础知识思维导图如下:
一文理解HDFS

文章插图
 
二、写文件过程
一文理解HDFS

文章插图
 
  1. Client 调用 DistributedFileSystem 对象的 create 方法,创建一个文件输出流(FSDataOutputStream)对象;
  2. 通过 DistributedFileSystem 对象与集群的 NameNode 进行一次 RPC 远程调用,在 HDFS 的 Namespace 中创建一个文件条目(Entry),此时该条目没有任何的 Block,NameNode 会返回该数据每个块需要拷贝的 DataNode 地址信息;
  3. 通过 FSDataOutputStream 对象,开始向 DataNode 写入数据,数据首先被写入 FSDataOutputStream 对象内部的数据队列中,数据队列由 DataStreamer 使用,它通过选择合适的 DataNode 列表来存储副本,从而要求 NameNode 分配新的 block;
  4. DataStreamer 将数据包以流式传输的方式传输到分配的第一个 DataNode 中,该数据流将数据包存储到第一个 DataNode 中并将其转发到第二个 DataNode 中,接着第二个 DataNode 节点会将数据包转发到第三个 DataNode 节点;
  5. DataNode 确认数据传输完成,最后由第一个 DataNode 通知 client 数据写入成功;
  6. 完成向文件写入数据,Client 在文件输出流(FSDataOutputStream)对象上调用 close 方法,完成文件写入;
  7. 调用 DistributedFileSystem 对象的 complete 方法,通知 NameNode 文件写入成功,NameNode 会将相关结果记录到 editlog 中 。
三、读文件过程
一文理解HDFS

文章插图
 
  1. Client 通过 DistributedFileSystem 对象与集群的 NameNode 进行一次 RPC 远程调用,获取文件 block 位置信息;
  2. NameNode 返回存储的每个块的 DataNode 列表;
  3. Client 将连接到列表中最近的 DataNode;
  4. Client 开始从 DataNode 并行读取数据;
  5. 一旦 Client 获得了所有必须的 block,它就会将这些 block 组合起来形成一个文件 。
四、问题1、数据错误,hdfs是怎么解决的呢?原因 :由于网络传输与磁盘错误等因素 。
解决办法:在客户端读取到数据后,会采用MD5和sha1对数据块进行校验,以确定读取到正确的数据 。
具体流程:
  • 在文件被创建的时候,客户端对文件进行摘录,并把这些信息写入数据的同一路径隐藏文件中 。
  • 当客户端读取文件的时候,会先读取该信息文件,然后利用该信息文件对每个读取的数据块进行校验,如果校验出错,客户端就会请求到另外一个数据接地那读取该文件快,并且向NAMENODE报告这个文件块有错误,NAMENODE会定期检查并且重新复制这个块 。
2、数据节点出错DATANODE 难免会造成不可用
解决思路主要是通过心跳的方式
解决流程:
  1. 每个数据节点会定期向NAMEnode 节点发送心跳,向namenode报告自己的状态 。
  2. 当数据节点发生故障或者网络发生断网时,namenode节点就无法收到来自以下数据节点的心跳信息 。这些数据节点就会被标记为宕机,节点上面的所有数据都会标记为不可读,namenode不会再给他们发送任何的IO请求 。
  3. 这时,有可能出现一种情况,由于一些数据节点的不可用,会导致一些数据块的副本量小于冗余因子 。
  4. namenode 会定期检查这些数据情况,一旦发现某些数据块的副本数量小于冗余因子,就会启动数据冗余复制,为它生产新的副本 。
  5. HDFS和其他分布式文件系统最大的区别就是可以调整冗余数据的位置 。
3、namenode 节点出错(单点故障问题)【一文理解HDFS】namenode节点保存了所有的元数据信息,其中最核心的两大数据结构是FsImage 合Editlog,如果这两个文件发生了损坏,那么整个HDFS实例降 失效 。


推荐阅读