Hadoop由三个模块组成:
- 分布式存储 HDFS
- 分布式计算 MapReduce
- 资源调度引擎 Yarn
HDFS
架构图:
一、核心概念
(1)块
为了提高磁盘读写效率,以数据块为单位,而不是以字节为单位(数据块包含若干字节)。
同时一定情况下,减少磁盘寻址开销
Hadoop
3.x版本,默认数据块大小为 128M,旧版本为 64M
所以,在HDFS 3.x
版本下,上传文件,会按照 128M为单位,切分成一个个块(block),并分散的存储在集群的不同数据节点上
问题:若上传一个文件(文件大小:30M),占据的块会是 128M嘛?
不会,块大小仍是 30M
(2)名称节点(NameNode)
名称节点(NameNode):负责管理分布式文件系统的命名空间(Namespace)
名称节点记录了每个文件中各个块所在的数据节点的位置信息
保存了两个核心的数据结构:
FsImage
:用于维护文件系统树以及文件树中所有的文件和文件夹的元数据EditLog
:记录了所有针对文件的创建、删除、重命名等操作
名称节点的数据结构图:
名称节点启动
- 启动开始时
名称节点在启动的过程中处于: 安全模式
安全模式下:只能对外提供读操作,无法提供写操作
- 启动过程中
会将FsImage
的内容加载进内存中,并执行 EditLog
文件中的各项操作
这时候
HDFS
中的更新操作都会被写入到EditLog
,而不是直接写入FsImage
操作完成之后,会创建一个新的FsImage
文件和一个空的EditLog
文件
名称节点起来之后,
HDFS
中的更新操作会重新写到EditLog
文件中,因为FsImage
文件一般都很大(GB级别的很常见),如果所有的更新操作都往FsImage
文件中添加,这样会导致系统运行的十分缓慢。
- 启动过程结束
系统会退出安全模式,进入正常运行状态,对外提供读写操作
(3)数据节点(DataNode)
数据节点:是分布式文件系统HDFS
的工作节点,负责数据的存储和读取,会根据客户端或者是名称节点的调度来进行数据的存储和检索,并且向名称节点定期发送自己所存储的块的列表。
(4)第二名称节点(SecondaryNameNode)
问题:更新操作不断写入 EditLog
,EditLog
不断变大,如何减少文件大小呢?
第二名称节点:用于冷备份,保存名称节点中对HDFS
元数据信息,减少名称节点重启的时间
功能:
- 完成
EditLog
和FsImage
的合并操作
减少
EditLog
文件大小,缩短名称节点重启时间
- 作为名称节点的 “检查点”,保存名称节点中的元数据信息
周期性地备份名称节点中的元数据信息,当名称节点发生故障时,就可以用第二名称节点中记录的元数据信息进行系统恢复。
当名称节点发生故障时,系统还是有可能会丢失部分元数据信息(即使有第二名称节点)
假设,第二名称节点执行合并操作时间为: t1 ~ t2
而这时候,名称节点刚好故障,系统就会丢失部分元数据信息
第二名称节点工作过程图,如下: