一、HDFS的简介
1、相关概念
(1)Block
HDFS中的块Block是个抽象的概念,它比一般文件系统中的块要大得多。
当我们在配置Hadoop系统参数时会看到,HDFS默认的Block为64MB。
HDFS分布式文件系统的文件也被分成块进行存储,这是文件存储处理
的基本逻辑单元。
HDFS作为分布式文件系统,被设计用来处理大文件的,使用抽象
的Block有很多好处。好处一:可以存储任意大的文件,不会受到网络中
单个节点磁盘大小的限制。一般情况下,单个节点存储500TB的数据是
不可能的,但是由于逻辑块的设计,HDFS可以将这个超大的文件划分
成很多很多Block,然后存储到集群中的各台机器上。好处二:简化文件
存储子系统的管理。HDFS中Block的大小是固定的(可参数配置),这
样就简化了存储系统的管理,特别是元数据信息(目录、文件名、节点
位置….)可以和文件块内容分开存储。而且,Block更有利于分布式文件
系统复制容错的实现。为处理节点故障,HDFS默认将文件块副本数设定
为3(可参数配置),分别存储在集群的不同节点上。当一个文件块损坏
时,系统会通过NameNode获取元数据信息,在另外的机器上读取一个副
本并进行存储,这个过程对用户来说是透明的。
(2)NameNode和DataNode
HDFS体系结构中有两类节点,分别是NameNode和DataNode。它们的职责分别如下:
NameNode职责:
1) 接收用户的操作请求,比如创建目录、上传文件、下载文件等等;
2) 管理和维护整个文件系统的命名空间、文件目录树和文件的索引目录,这些信息
以fsImage(文件系统镜像)和EidtLog(编辑改动日志)两种形式存储在本地文件系
统中。注意:这些信息不是永久存储的,NameNode会在系统每次重启时重建这些信
息。当运行任务时,客户端通过NameNode获取元数据信息,然后和DataNode交互
访问整个文件系统。
3) 管理文件和Block块之间的关系,block和DataNode节点之间的位置映射关系。
DataNode职责:
1) 通过心跳(heartbeat)定时向NameNode发送所存储的文件块信息;
2) 文件分成Block存储到磁盘上;
3)为保证数据安全,文件存有多个副本。
二、HDFS的体系架构
二话不说,先上图:
1、副本存放和数据读写
HDFS采用机架感知(rack-aware)策略来保证数据的可靠性和网络带宽的利用率。
大型HDFS实例经常运行在跨越多个机架的计算机组成的集群上,不同机架上的两台机
器之间的通信需要通过交换机,这样无疑增加了数据传输的成本。
通过机架的感知过程,NameNode可以确定每个DataNode所属的机架ID。目前,
HDFS采取的策略是将副本存放在不同的机架上。这样一来,可有效防止当整个机
架失效时数据的丢失,而且允许读取数据时充分利用多个机架的网络带宽。这有利
于将副本均匀分布在集群中,有利于在组件失效时的负载均衡。但是,由于写操作
需要传输数据块到多个机架,这无形增加了写操作的成本。
那么,HDFS的副本到底采用什么样的策略才比较靠谱呢?我们知道,副本默认值
是3,其存放策略是:将一个副本存放在本地机架的节点上,另一个副本存放在同
一机架的不同节点上,最后一个副本存放在不同机架的节点上。这样,减少了机架
间的数据传输,也就提高了写数据的效率。同时,由于数据块只存放在两个不同的
机架上,所以这个策略减少了读取数据时需要的网络传输总带宽。这样,在不影响
数据可靠性和读取性能的情况下,大大提高了写操作的性能。
另外,在读取数据时,为减少整体的带宽消耗和带宽延时,HDFS会让读取程序
优先读取离客户端最近的副本。假如在读取程序所在的机架上有一个副本,那么就
读取该副本。如果HDFS集群跨越了多个数据中心,同样也是优先读取本地数据中心
的副本。
(1) HDFS正常写数据
(2) HDFS正常读取数据
(3)非正常写数据
(4)描述异常 ( DataNode掉线、宕机;数据块坏了; NameNode宕机 )
(5)发现异常 ( dn掉线、宕机;数据块坏了; nn宕机 )
2、安全模式
NameNode启动后,会进入安全模式这种特殊状态,此时的NameNode是不会进行数据块的复制的,
而是从所有的DataNode上接收心跳信号(heartbeat)和块状态报告(block report)。块状态报告包括某个
DataNode所有的数据块列表。当NameNode检测确认某个数据块的副本数目达到最小值时,那么,该数据
块被认为是副本安全的;在一定的百分比(可参数配置)的数据块被NameNode检测确认安全之后(外加30
秒的等待时间),NameNode将退出安全模式。然后,它还会确定哪些数据块的副本还没有达到指定数目,
并将这些数据块复制到其他DataNode上。
3、文件安全
NameNode的重要性不言而喻。如果NameNode出现故障,那么意味着整个文件系统的全部文件会
丢失,因为我们无法通过DataNode上的数据块来重构文件。那么,Hadoop是通过什么机制来保证
NameNode的安全呢?
在NmaeNode运行的同时,系统中运行着一个SecondaryNameNode守护进程。其职责是:从NameNode
上下载元数据信息(fsImage、edits),然后把二者在本地合并,产生新的fsImage,然后将其推送到NameNode
上,同时重置NameNode的edits。SecondaryNameNode的运行通常需要大量的CPU和内存做合并操作,这就要
求其运行在一台单独的机器上。在这台机器上,会存储合并过的FsImage,当NameNode宕机时做替补使用。
但是,SecondaryNameNode的备份总滞后于NameNode,所以丢失部分数据是必然的。合并过程详见图示:
最后,让我们来看看这个过程对应的源代码具体是如何实现的:
void doCheckpoint() throws IOException {
// Do the required initialization of the merge work area.
startCheckpoint();
// Tell the namenode to start logging transactions in a new edit file
// Retuns a token that should be used to verify the downloaded image file.
CheckpointSignature sig = (CheckpointSignature)namenode.rollEditLog();
// error simulation code for junit test
if (ErrorSimulator.getErrorSimulation(0)) {
throw new IOException("Simulating error0 " +
"after creating edits.new");
}
downloadCheckpointFiles(sig); // Fetch fsimage and edits
doMerge(sig); // Do the merge
// Upload the new image into the NameNode, providing the new checksum for
// the image file.
putFSImage(sig);
// error simulation code for junit test
if (ErrorSimulator.getErrorSimulation(1)) {
throw new IOException("Simulating error1 " +
"after uploading new image to NameNode");
}
// Then tell the Namenode to make this new uploaded image as the most
// current image.
namenode.rollFsImage();
checkpointImage.endCheckpoint();
LOG.info("Checkpoint done. New Image Size: "
+ checkpointImage.getFsImageName().length());
}