HDFS 概述
HDFS(Hadoop Distributed File System,Hadoop分布式文件系统)最开始是作为Apache Nutch搜索引擎项目的基础架构而开发,是Apache Hadoop Core项目的一部分。HDFS被设计为可以运行在通用硬件上,提供流式数据操作、能够处理超大文件的分布式文件系统。HDFS具有高度容错、高吞吐量、容易扩展、高可靠性等特征,为大型数据集的处理提供了一个强有力的工具。
Nutch参考了Google的两篇论文:MapReduce计算模型以及GFS存储模型,并做了实现,后来把这两大部分剥离出来形成独立的开源项目Hadoop。关于Nutch可以参考此链接。Apache Nutch
HDFS 特点
适用场景:
1. 适合存储大数据文件:处理数据达到 GB、TB、甚至PB级别的数据,能够处理百万规模以上的文件数量,数量相当之大,能够处理10K节点的规模。
2. 高容错性:数据自动保存多个副本。它通过增加副本的形式,提高容错性,某一个副本丢失以后,它可以自动恢复
3. 文件分块存储,适合批处理:HDFS 将一个完整的大文件平均分块存储到不同计算机上,通过移动计算而不是移动数据,可以同时从多个主机读取不同区块的文件。
4. 流式文件(无结构文件)访问:一次写入,多次读取。(write-once-read-many)文件一旦写入不能修改,只能追加,它能保证数据的一致性。
5. 支持廉价硬件:能够运行在普通的廉价PC机器上。
不适用场景:
1. HDFS适用于高吞吐量,而不适合低时间延迟的访问
2. HDFS不适合大量小文件的存储,因NameNode将文件系统的元数据存放在内存中,因此存储的文件数目受限于NameNode的内存大小
3. 流式读取的方式,不适合多用户写入一个文件(一个文件同时只能被一个客户端写),以及任意位置写入(不支持随机写)
HDFS架构图
HDFS读取文件
1. Client 向NameNode 发起文件读取的请求
2. NameNode 返回文件存储的DataNode 的信息
3. Client 向返回的对应的block所对应的DatNode发起读取文件请求
4. DataNode向Client返回对应的文件信息
5. 客户端采用追加的方式将读取到的数据写入本地
HDFS 写入文件
Client 向NameNode 发起文件写入的请求。NameNode 根据文件大小和文件块配置情况,返回给Client 它所管理部分DataNode 的信息。Client 将文件划分为多个Block,根据DataNode 的地址信息,按顺序写入到每一个DataNode 块中。
1、根namenode通信请求上传文件,namenode检查目标文件是否已存在,父目录是否存在
2、namenode返回是否可以上传
3、client请求第一个 block该传输到哪些datanode服务器上
4、namenode返回3个datanode服务器ABC
5、client请求3台dn中的一台A上传数据(本质上是一个RPC调用,建立pipeline),A收到请求会继续调用B,然后B调用C,将真个pipeline建立完成,逐级返回客户端
6、client开始往A上传第一个block(先从磁盘读取数据放到一个本地内存缓存),以packet为单位,A收到一个packet就会传给B,B传给C;A每传一个packet会放入一个应答队列等待应答
7、当一个block传输完成之后,client再次请求namenode上传第二个block的服务器。