1、HDFS简介
在现代的企业环境中,单机容量往往无法存储大量数据,需要跨机器存储。统一管理分布在集群上的文件系统称为分布式文件系统 。
HDFS(Hadoop Distributed File System)是 Apache Hadoop 项目的一个子项目. Hadoop 非常适于存储大型数据 (比如 TB 和 PB), 其就是使用 HDFS 作为存储系统. HDFS 使用多台计算机存储文件, 并且提供统一的访问接口, 像是访问一个普通文件系统一样使用分布式文件系统.
- Doug Cutting 在做 Lucene 的时候, 需要编写一个爬虫服务, 这个爬虫写的并不顺利, 遇到了一些问题, 诸如: 如何存储大规模的数据, 如何保证集群的可伸缩性, 如何动态容错等
- 2013年的时候, Google 发布了三篇论文, 被称作为三驾马车, 其中有一篇叫做 GFS, 是描述了 Google 内部的一个叫做 GFS 的分布式大规模文件系统, 具有强大的可伸缩性和容错性
- Doug Cutting 后来根据 GFS 的论文, 创造了一个新的文件系统, 叫做 HDFS
2、HDFS优劣势
优势:
- 存储大文件,高吞吐量
- 一次写入,多次读取
- 硬件要求低,节约成本
劣势:
- 不适用低延时数据访问
- 不使用存储大量小文件
3、HDFS基本架构
HDFS是一个主从(Master/Slave)体系结构
3.1、组件简介
HDFS由四部分组成
- Client
- 文件切分,文件上传HDFS时,根据文件配置将文件切分成设置大小的Block块,再进行存储
- 与NameNode交互,获取文件存储位置信息
- 与DataNode交互,发送读取或这写入数据请求
- 提供一些基本命令管理HDFS
- NameNode
- 管理HDFS的名称空间,为存储数据分配唯一地址
- 管理数据块(Block)映射信息,存储元数据信息
- 配置副本策略
- 处理客户端读写请求
- DataNode
- 存储数据块,存储源数据信息
- 执行客户端读/写操作
- Secondary NameNode
- 辅助NameNode,分担其工作量
- 定期合并fsimage和fsedits文件,并发送给NameNode进行替换
- 在紧急情况下,可以辅助恢复NameNode
4、HDFS的副本机制、机架感知和安全模式
4.1、副本机制
在hdfs中所有文件都是以block块的方式存放在DataNode中
- 当文件大小大于集群中的任意一个磁盘,此时将文件切分成block,分开存储
- 使用块作文文件存储的逻辑单位可以简化存储子系统
- 块适用于数据备份,提供高数据容错能力
在hadoop1.x版本中block块默认大小64M,hadoop2.x中文件block块大小默认是128M,默认副本数量为3,block块的大小可以通过配置设置
4.2、机架感知
HDFS分布式文件系统的内部有一个副本存放策略,以默认副本数=3为例:
- 第一个副本块存本机
- 第二个副本块存跟本机同机架的一个服务器节点上
- 第三个副本块存不同机架的一个服务器节点上
4.3、安全模式
安全模式是hadoop的一种保护机制,用于保证集群中的数据块的安全性。当集群启动的时
候,会首先进入安全模式。当系统处于安全模式时会检查数据块的完整性。
假设我们设置的副本数(即参数dfs.replication)是3,那么在datanode上就应该有3个副本存
在,假设只存在2个副本,那么比例就是2/3=0.666。hdfs默认的副本率0.999。我们的副本率
0.666明显小于0.999,因此系统会自动的复制副本到其他dataNode,使得副本率不小于0.999。
如果系统中有5个副本,超过我们设定的3个副本,那么系统也会删除多于的2个副本。
在安全模式状态下,文件系统只接受读数据请求,而不接受删除、修改等变更请求。在,当
整个系统达到安全标准时,HDFS自动离开安全模式。
5、HDFS的元数据辅助管理
NameNode的所有元数据信息都保存在了fsimage与edits文件中,元数据信息保存目录配置在hdfs-site.xml
中
<property>
<name>dfs.namenode.name.dir</name>
<value>
file:///export/servers/hadoop2.7.5/hadoopDatas/namenodeDatas, file:///export/servers/hadoop-2.7.5/hadoopDatas/namenodeDatas2
</value>
</property>
<property>
<name>dfs.namenode.edits.dir</name>
<value>file:///export/servers/hadoop-2.7.5/hadoopDatas/nn/edits</value
</property>
5.1、fsimage和edits介绍
edits
edits
文件存放了客户端最近一段时间的操作日志- 客户端对HDFS进行写文件时会首先记录在
edits
文件中 edits
修改式元数据也会更新
fsimage
- Name中关于元数据的镜像,一般称为检查点,
fsimage
存放一份比较完整的元数据信息 - 由于
fsimage
是NameNode的完整镜像,如果每次加载都到内存生成树状拓扑结构,这样的操作非常消耗内存和cpu,所以优先将对NameNode的操作都放在edits
文件中 fsimage
内容包含了NameNode管理下的所有DataNode文件及文件block及block所在的DataNode的元数据信息- 随着
edits
内容增加,需要在一定时间和fsimage
进行合并
- Name中关于元数据的镜像,一般称为检查点,
fsimage
、edits
文件查看命令fsimage
cd /export/servers/hadoop2.7.5/hadoopDatas/namenodeDatas hdfs oiv -i fsimage_0000000000000000864 -p XML -o hello.xml
edits
cd /export/servers/hadoop2.7.5/hadoopDatas/namenodeDatas hdfs oev -i edits_0000000000000000865-0000000000000000866 -p XML -o myedit.xml
5.2 SecondaryNameNode辅助管理元数据文件
- 配置SecondaryNameNode
- SeconfaryNameNode在
conf/masters
中指定 - 在masters指定的机器上修改相应配置文件
hdfs-site.xml
和core-site.xml
文件hdfs-site.xml
<property> <name>dfs.http.address</name> <value>host:50070</value> </property>
core-site.xml
<!-- 多久记录一次 HDFS 镜像, 默认 1小时 --> <property> <name>fs.checkpoint.period</name> <value>3600</value> </property> <!-- 一次记录多大, 默认 64M --> <property> <name>fs.checkpoint.size</name> <value>67108864</value> </property>
- SeconfaryNameNode在
- 原理分析
- 1.SecondaryNameNode通知NameNode切换editlog
- 2.SecondaryNameNode从NameNode中获得fsimage和editlog(通过http方式)
- 3.SecondaryNameNode将
fsimage
载入内存,然后开始合并editlog
,合并之后成为新的fsimage
- 4.SecondaryNameNode将新的
fsimage
发送回NameNode - 5.NameNode用新的fsimage替换旧的
fsimage
,同时把edits.new文件变成edits