HDFS(分布式文件系统)为了做到可靠性(reliability)创建了多份数据块(data blocks)的复制,并将它们放置在服务器群的计算节点中(compute nodes),MapReduce就可以在它们所在的节点上处理这些数据了。除了可靠性,HDFS在一定程度上可以提高数据的读取速度。
HDFS中有三个重要的节点:Name Node,Data Node,Secondary NameNode。
NameNode:存储元数据;元数据保存在内存中;保存文件,block,datanode之间的映射关系。(元数据包括文件名、文件大小、文件权限等除文件内容以外的数据)
DataNode:存储文件内容;文件内容保存在磁盘;维护了block id到datanode本地文件的映射关系。
NameNode数据的大小取决于文件数量的多少,而不是文件内容的大小。
HDFS中存在一个NameNode和多个DataNode。
DataNode中存在冗余机制 – 存放的位置(机架感知策略)
HDFS还包括故障检测:对于数据节点有心跳包(检测是否宕机)、块报告(安全模式下检测)、数据完整性检测(校验和比较);对于名字节点(日志文件,镜像文件)。除此之外,HDFS还包括空间回收机制,即DataNode中是否含有多余的空间。
HDFS优点:
- 高容错性
(1)数据自动保存多个副本
(2)副本丢失后,自动恢复
- 适合批处理
(1)移动计算而非移动数据
(2)数据位置暴露给计算框架
- 适合大数据处理
(1)GB、TB、甚至PB级数据
(2)百万规模以上的文件数量
(3)可处理10K+节点的规模
- 流式文件访问
(1)一次写入,多次读取。文件一旦写入不能修改,只能追加
(2)它能保证数据的一致性(校验机制)
- 可构建在廉价机器上
(1)通过多副本提高可靠性
(2)提供了容错和恢复机制
HDFS缺点:
- 低延迟数据访问
(1)要求毫秒级访问不适合存储在HDFS上
(2)低延迟与高吞吐率
- 小文件存储(若有大量小文件,需要用压缩机制存储,如将10000个文件压缩为100个文件存储)
(1)占用NameNode大量内存(因为NameNode的大小取决于文件的数量,并且NameNode保存在内存中,而内存大小有限)
(2)寻道时间超过读取时间
- 并发写入、文件随机修改(不允许修改文件内容)
(1)一个文件只能有一个写者
(2)仅支持append
HDFS架构
HDFS 采用Master/Slave的架构来存储数据,这种架构主要由四个部分组成,分别为HDFS Client、NameNode、DataNode和Secondary NameNode。
HDFS客户端请求NameNode(读写文件),NameNode将请求转发给DataNode。DataNode将数据存储在磁盘上,磁盘上存储的数据都是一块一块的,并且在其他DataNode中保存有副本,副本数越多,可靠性越高。
HDFS Client:就是客户端。
1、切分文件:文件上传 HDFS 的时候,Client 将文件切分成 一个一个的Block,然后进行存储。
2、与 NameNode 交互,获取文件的位置信息。
3、与 DataNode 交互,读取或者写入数据。
4、Client 提供一些命令来管理 HDFS,比如启动或者关闭HDFS。
5、Client 可以通过一些命令来访问 HDFS。
NameNode:就是 master。
1、管理 HDFS 的名称空间(namespace)。
2、管理数据块(Block)映射信息
3、配置副本策略
4、处理客户端读写请求。
Secondary NameNode:并非 NameNode 的热备份。当NameNode 挂掉的时候,它并不能马上替换 NameNode 并提供服务。
1、辅助 NameNode,分担其工作量。
2、定期合并 fsimage和edits,并推送给NameNode。
3、在紧急情况下,可辅助恢复 NameNode。
DataNode:就是Slave,NameNode 下达命令,DataNode 执行实际的操作。
1、存储实际的数据块。
2、执行数据块的读/写操作。
HDFS数据存储单元(block)
- 文件被切分成固定大小的数据块
(1)默认数据块大小为64MB,可修改
(2)若文件大小不到64MB,则单独存成一个块(即一个块只可能存同一个文件的数据,不可能有两个文件的数据)
- 一个文件存储方式
(1)按大小被切分成若干个block,存储到不同节点上
(2)默认情况下每个block都有三个副本(副本数可修改)
- Block大小和副本数通过客户端上传文件时设置,文件上传成功后副本数可以变更,块大小不可变更。