Hadoop分布式文件系统——HDFS
一、介绍
HDFS(hadoop Distributed File System)是Hadoop下的分布式文件系统,具有高容错、高吞吐量等特性,可以部署在低成本的硬件上。HDFS特点:
- 高容错:由于 HDFS 采用数据的多副本方案,所以部分硬件的损坏不会导致全部数据的丢失。
- 高吞吐量:HDFS 设计的重点是支持高吞吐量的数据访问,而不是低延迟的数据访问。
- 大文件支持:HDFS 适合于大文件的存储,文档的大小应该是是 GB 到 TB 级别的。
- 一致性:HDFS 更适合于一次写入多次读取 (write-once-read-many) 的访问模型。支持将内容追加到文件末尾,但不支持数据的随机访问,不能从文件任意位置新增数据。
二、HDFS 设计原理
HDFS 遵循主/从架构,由单个 NameNode(NN) 和多个 DataNode(DN) 组成。HDFS有多个master服务,负责协调运行各个worker节点上的worker服务。
- NameNode:用于存储文件系统的目录树、文件元数据和集群中每个文件的位置,例如打开、关闭、重命名文件和目录等操作。当客户端访问文件系统时,向NameNode请求信息来查找相应的存储节点。
- Secondary NameNode:它不是NameNode节点的备份,它代表NameNode执行内务任务并记录检查点,如定期将当前数据空间的快照与编辑日志合并,以确保编辑日志不会过大。编辑日志用于确保数据的一致性,以防止数据丢失。
- DataNode:用于存储和管理本地磁盘的HDFS块,并将各个数据存储的健康状况和状态报告给NameNode。
2.1 文件块
- HDFS文件分为多个块,块的大小通常为128MB。
- 为了保证容错性,HDFS提供了数据复制机制,默认复制因子是3。
在数据复制实现过程中,在写入程序位于 datanode 上时,就优先将写入文件的一个副本放置在该 datanode 上,否则放在随机 datanode 上。之后在另一个远程机架上的任意一个节点上放置另一个副本,并在该机架上的另一个节点上放置最后一个副本。此策略可以减少机架间的写入流量,从而提高写入性能。
三、Hadoop写文件
- 客户端将文件写入本地磁盘的HDFS Client文件中;
- 当临时文件大小达到一个block大小时,HDFS client 通知NameNode,申请写入文件;
- NameNode在HDFS的文件系统中创建一个文件,并把该block id和要写入的DataNode的列表返回给客户端;
- 客户端收到信息这些信息后,将临时文件写入DataNodes;
- 客户端将文件内容写入第一个DataNode(一般以4kb为单位进行传输)
- 第一个DataNode接收后,将数据写入本地磁盘,同时也传输给第二个DataNode
- 依此类推到最后一个DataNode,数据在DataNode之间是通过pipeline的方式进行复制的
- 后面的DataNode接收完数据后,都会发送一个确认给前一个DataNode,最终第一个DataNode返回确认给客户端
- 当客户端接收到整个block的确认后,会向NameNode发送一个最终的确认信息
- 如果写入某个DataNode失败,数据会继续写入其他的DataNode。然后NameNode会找另外一个好的DataNode继续复制,以保证冗余性
- 每个block都会有一个校验码,并存放到独立的文件中,以便读的时候来验证其完整性
- 文件写完后(客户端关闭),NameNode提交文件(这时文件才可见,如果提交前,NameNode垮掉,那文件也就丢失了。fsync:只保证数据的信息写到NameNode上,但并不保证数据已经被写到DataNode中)
四、Hadoop读文件
- 客户端向NameNode发送读取请求;
- NameNode返回文件的所有block和这些block所在的DataNodes(包括复制节点);
- 客户端直接从DataNode中读取数据,如果该DataNode读取数据失败(DataNode失效或校验码不对),则从复制节点中读取(如果读取的数据就在本机,则直接读取,否则通过网络读取)