目录
HDFS相关内容:
基础架构
HDFS(Hadoop Distributed File System)是 Apache Hadoop 项目的一个子项目,Hadoop 非常适于存储大型数据, 其就是使用 HDFS 作为存储系统,而HDFS 使用多台计算机存储文件,并且提供统一的访问接口,像是访问一个普通文件系统一样使用分布式文件系统。作为大数据生态最重要的组件之一,HDFS充当着大数据时代的数据管理者的角色,为各种分布式计算组件提供用于处理的数据存储的能力。
HDFS 基础架构由四个角色组成:HDFS Client、NameNode、DataNode 和 SecondaryNameNode。
HDFS Client
HDFS客户端提交读写命令到HDFS,它负责:
- 文件切分:文件上传 HDFS的时候,Client 将文件切分成一个个Block(数据块),然后进行存储。
- 与 NameNode 交互:获取文件真实的位置信息。
- 与 DataNode 交互:读取或写入数据。
- Client 提供一些命令来管理 和访问HDFS,比如启动或者关闭HDFS。
NameNode和DataNode
NameNode 是HDFS的Master节点,它负责:
- 管理 HDFS 的名称空间;
- 管理数据块(Block)映射信息;
- 配置副本策略;
- 处理客户端读写请求;
- 周期性的接收心跳和块的状态信息报告;
DataNode 是HDFS的Slave节点,它负责:
- 存储实际的数据块;
- 执行数据块的读/写操作;
- 周期性向NameNode汇报心跳信息;
- 周期性向NameNode汇报数据块信息;
- 周期性向NameNode汇报缓存数据块信息;
fsimage和edits
在Hadoop集群当中,NameNode的所有元数据信息都保存在fsimage 与 edits 文件中, 这两个文件记录了所有的数据的元数据信息,当集群重启时NameNode首先会从fsimage和edits文件中将元数据信息加载到内存中,因此NameNode机器对内存的要求相对会比DataNode高很多,元数据信息的保存目录配置在了 hdfs-site.xml 中的这两个参数:dfs.namenode.name.dir,dfs.namenode.edits.dir。
edits
- 存放了客户端最近一段时间的操作日志;
- 客户端对 HDFS 进行写文件时的操作会先被记录在 edits 文件中;
- edits 修改时元数据也会更新;
fsimage
- NameNode 中关于元数据的镜像,一般称为检查点,fsimage 存放了一份比较完整的元数据信息;
- 因为 fsimage 是 NameNode 的完整的镜像, 如果每次都加载到内存生成树状拓扑结构,这是非常耗内存和CPU, 所以一般开始时对NameNode 的操作都放在 edits 中;
- fsimage 内包含了 NameNode 管理下的所有 DataNode 文件和文件 block 以及 block所在的 DataNode 的元数据信息;
- 随着 edits 内容增大,就需要在一定策略下和 fsimage 合并;
由于集群重启时NameNode会重新加载fsimage和edits文件,fsimage文件加载起来很快,但edits文件内记录的都是操作日志,因此edits文件不能无限增长,否则重放日志很慢,会影响到集群启动的速度,因此edits文件和fsimage会定期进行合并。
SecondaryNameNode
SecondaryNameNode不是NameNode 的热备。当NameNode 挂掉的时候,它并不能马上替换 NameNode 并提供服务,而是作为一个辅助者分担NameNode的工作量。在后面的内容中介绍的HDFS的高可用中会介绍真正的NameNode热备机制。
- 定期合并 fsimage和edits,并推送给NameNode,把 edits 控制在一个范围内。
- 在紧急情况下,可辅助恢复 NameNode。
上面提到edits文件会根据一定策略和fsimage合并,主要由core-site.xml文件中的两个参数来管理:
<!-- 多久记录一次 HDFS 镜像, 默认 1小时 -->
<property>
<name>fs.checkpoint.period</name>
<value>3600</value>
</property>
<!-- 一次记录多大, 默认 64M -->
<property>
<name>fs.checkpoint.size