HDFS初认识
文章目录
- HDFS初认识
- HDFS是什么?
- HDFS的假想和设计目标
- HDFS的优缺点
- 优点
- 缺点
- HDFS的架构组成
- 客户端
- NameNode
- DataNode
- Secondary NameNode
- 职责
- checkpoint机制
- 参考
HDFS是什么?
Hadoop分布式文件系统(HDFS)是一个分布式文件系统,HDFS与现有的分布式文件系统有许多相似之处。但是,与其他分布式文件系统的差异是很大的。
-
HDFS全称为
Hadoop Distribute File System
。 -
HDFS解决了海量数据无法单台机器存储的问题,将海量的数据存储在不同的机器中,有HDFS文件系统统一管理和维护, 提供统一的访问目录和API 。
HDFS的假想和设计目标
- 硬件故障
硬件故障是常态而非例外。一个HDFS实例可能由数百或数千台服务器机器组成,每台机器都存储着文件系统的部分数据。事实上,有大量的组件,而且每个组件都有一个非微不足道的故障概率,这意味着HDFS的某些组件总是不能正常工作。因此,检测故障和快速自动恢复故障是HDFS的一个核心架构目标。
-
流式数据访问
-
大数据集
在HDFS上运行的应用程序有大量的数据集。 -
简单的一致性模型
-
移动计算比移动数据更便宜
如果应用程序要求的计算是在它所操作的数据附近执行的,那么它的效率会高很多。当数据集的大小很庞大时,这一点尤其正确。这可以最大限度地减少网络拥堵,增加系统的整体吞吐量。其假设是,将计算迁移到离数据所在地更近的地方,而不是将数据迁移到应用程序运行的地方,这样做往往更好。HDFS为应用程序提供了接口,使其更接近数据所在的位置。
-
在不同的硬件和软件平台上的可移植性
-
名称节点和数据节点
HDFS的优缺点
优点
- HDFS具有高容错性,安全性,并被设计成可以部署在低成本的硬件上。
数据存储在不同的机器中,并且每个数据块默认存储3个副本(存储在不同的机器中),当集群中的某个数据块的副本由于某种原因(宕机,磁盘损坏等)丢失以后,HDFS会自动恢复!
扩展性
HDFS的存储能力可以通过添加机器来扩容,并且极易横向扩容
,整个集群中所有机器的存储能力就是HDFS的存储能力
- 可以存储海量数据
单个很大的文件可以存储在HDFS中,也可以存储百万个以上的文件数据量。
-
HDFS提供了对应用数据的高吞吐量访问,适用于拥有大型数据集的应用。
-
HDFS放宽了一些POSIX要求,以实现对文件系统数据的
流式访问
。
缺点
- 不适合
低延迟
的数据访问 , 比如毫秒级的数据访问和数据存储
数据底层存储在不同的机器中,并且大文件会被切块存储在不同的机器中,读取数据极可能需要RPC远程网络请求获取数据,所以数据的访问时间比较长
-
不适合存储大量的
小文件
数据-
每个数据文件在NameNode中记录元数据信息,存储大量小文件增加NameNode的压力,占用NameNode的内存,影响集群的整体存储能力,这样往往是不可取的。
-
大量小文件的
寻址时间会超过读取时间
(读取时间/寻址时间=100/1),这也违背了HDFS起初的设计目标。
-
-
不支持
并发写
和随机修改
-
一个文件仅支持单个线程写,不支持多个线程写
-
仅支持数据的
append
(追加)操作,不支持数据的随机写
-
注意:HDFS文件系统适合
一次写入多次读取
的数据操作;主要用于存储数据。
HDFS的架构组成
Hadoop官网的HDFS架构图如下所示:
HDFS采用的是
主从
结构模式 , 主节点[MASTER]NameNode
➕ 从节点[SLAVES]DataNode
,HDFS组成架构还包括SecondaryNameNode
和客户端
,接下来逐个介绍!
客户端
-
HDFS提供了两种客户端操作
Shell命令
和JAVA接口
都可以和HDFS系统交互! -
用户可以通过一些命令来访问HDFS,进行文件的上传,下载,读取,以及追加数据内容,删除,移动等操作
-
文件切分。文件上传HDFS的时候,Cliet将文件切分成一个一个的Block,然后进行上传;
-
与NameNode交互,获取文件的位置信息
-
与DataNode交互,读取或者写入数据
-
Client提供一些命令来管理HDFS。比如NameNode格式化
NameNode
NameNode就是Master节点,是一个主管、管理者。
-
用于记录文件存储的
元数据
对象(NameNode将这些数据的元数据信息记录在内存中,并且将这些元数据信息定期的序列化到本地磁盘上),记录用户操作的行为日志、记录用户存储的文件的大小
、切分的块数
、每一块的副本数
和存储在DataNode上的位置
-
处理客户端的
读写请求
,给DataNode分配存储任务 , 或者是给客户端请求数据的元信息 -
NameNode可以认为是HDFS的老大 , 维护集群中的节点的数量,接收DataNode的注册, 维护了一个统一的集群版本
-
维护集群中数据的
负载均衡
和副本个数
-
接收DataNode的
心跳汇报
-
接收DataNode的数据的汇报 , 更新节点
映射
(元数据)
DataNode
DataNode节点是HDFS系统正在查处用户数据的节点,即Slave节点。NameNode下达命令,DataNode执行命令实际的操作
-
存储实际的数据块,将数据以
物理切块
的形式存储在本地指定的磁盘目录中 -
处理客户端的请求
-
接收NameNode分配的任务
-
接收NameNode的指令完成
容错
工作,副本的复制与移动
-
定期地向NameNode
心跳响应
请求,默认每间隔3s
一次 -
汇报自己存储的数据数据,默认间隔时间为
1小时
-
执行数据块的读/写操作
Secondary NameNode
并不是NameNode的热备。当NameNode挂掉的时候,它并不能马上替换NameNode并提供服务。
2NN是帮助NameNode管理元数据,具体内容涉及到
chekpoint机制
职责
- 辅助NameNode,分担NameNode工作量,比如定期合并Fsimage和Eidts,并推送给NameNode;
- 在紧急情况下,可辅助恢复NameNode。
checkpoint机制
引入Secondary NameNode 用来对存储数据的元数据处理 (checkpoint机制) , 大致如下:
-
下载 NameNode 的 Fsimage_000000文件(初始化文件,只下载一次),
-
下载生成好的日志文件,没有_inprocess的日志文件
-
加载镜像文件生成内存对象
-
加载日志文件,修改镜像对象
-
序列化镜像对象
-
将镜像对象上传到 NameNode 中
-
清理 NameNode 上没用的日志数据和序列化的镜像文件
-
定期下载日志文件, 合并镜像对象,并上传到 NameNode 上
参考
https://hadoop.apache.org/docs/stable/hadoop-project-dist/hadoop-hdfs/HdfsDesign.html
全文结束!