3.1 HDFS概念
分布式文件系统是指文件系统管理的物理存储资源不一定直接连接在本地节点上,而是通过计算机网络与节点相连。分布式文件系统的设计基于客户机/服务器模式。HDFS提供了一个高度容错性和高吞吐量的海量数据存储解决方案,是Apache Hadoop Core项目的一部分,也是GFS提出之后出现的另外一种文件系统。它有一定高度的容错性,而且提供了高吞吐量的数据访问,非常适合大规模数据集上的应用。HDFS就是将多台机器的存储当作一个文件系统来使用,因为在大数据的情景下,单机的存储量已经完全不够用了,所以采取分布式的方法来扩容,解决本地文件系统在文件大小、文件数量、打开文件数等方面的限制问题。
3.1.1 HDFS简介
HDFS是Hadoop的一个分布式文件系统,被设计成适合运行在通用硬件(Commodity Hardware)上的分布式文件系统。它和现有的分布式文件系统有很多共同点,但同时和其他分布式文件系统的区别也很明显。HDFS是一个高度容错性的系统,适合部署在廉价机器上。HDFS能提供高吞吐量的数据访问,非常适合大规模数据集上的应用。HDFS放宽了一部分POSIX约束,以实现流式读取文件系统数据的目的。HDFS在最开始是作为Apache Nutch搜索引擎项目基础架构而开发的。
HDFS(Hadoop Distributed File System)是Hadoop项目的核心子项目,是分布式计算中数据存储管理的基础。Hadoop整合了众多文件系统,在其中有一个综合性的文件系统抽象,它提供了文件系统实现的各类接口,HDFS只是这个抽象文件系统的一个实例;提供了一个高层的文件系统抽象类org.apache.hadoop.fs.FileSystem,这个抽象类展示了一个分布式文件系统,并有几个具体实现,如表3-1所示。
表3-1 Hadoop的文件系统
(续)
3.1.2 HDFS相关概念
HDFS采用master/slave架构。一个HDFS集群是由一个NameNode(NN)和一定数目的DataNode(DN)组成。NameNode是一个中心服务器,负责管理文件系统的名字空间(Namespace)以及客户端对文件的访问。集群中的DataNode一般是一个节点一个,负责管理它所在节点上的存储。HDFS暴露了文件系统的名字空间,用户能够以文件的形式在上面存储数据。从内部看,一个文件其实被分成一个或多个数据块,这些块存储在一组DataNode上。NameNode执行文件系统的名字空间操作,比如打开、关闭、重命名文件或目录,它也负责确定数据块到具体DataNode节点的映射。DataNode负责处理文件系统客户端的读写请求。在NameNode的统一调度下进行数据块的创建、删除和复制。
1.数据块(Block)
大文件会被分割成多个块进行存储,块大小默认为64MB。每一个块会在多个DataNode上存储多份副本,默认是3份。HDFS被设计成支持大文件,适用HDFS的是那些需要处理大规模数据集的应用。这些应用都是只写入数据一次,但却读取一次或多次,并且读取速度应能满足流式读取的需要。HDFS支持文件的“一次写入、多次读取”语义。一个典型的数据块大小是64MB。因而,HDFS中的文件总是按照64MB被切分成不同的块,每个块尽可能地存储于不同的DataNode中。
2.HDFS数据存放策略
分块存储+副本存放,副本存储结构如图3-1所示。
图3-1 数据块多副本存储结构
3.数据拓扑结构(即数据备份)
默认存放3份,可以通过修改配置文件hdfs-site.xml修改备份数量,如果本机在集群中,第一份就会存放到本节点即本机上,如果不在集群中,就通过负载均衡存放到一个相应的随机节点上,第二份存放在同机柜的不同节点上,第三份存放在不同机柜的某个节点上。
4.数据查找
就近原则,先在本节点上查找,再从本机柜上查找,最后再去不同机柜上查找。
5.单点故障
在Hadoop1中,一个集群只有NameNode,一旦NameNode宕机,整个集群就无法使用。
6.RPC(Remote-Procedure-Call,远程过程调用)
RPC是Hadoop构建的基础,一种协议通过网络从远程计算机程序上请求服务,采用客户机/服务器客户机/服务机模式,客户端发送请求,结果返回给客户端而不是服务器端,RPC机制如图3-2所示。
图3-2 RPC机制
7.安全模式
安全模式是HDFS所处的一种特殊状态,在这种状态下,文件系统只接受读数据请求,而不接受删除、修改等变更请求。在NameNode主节点启动时,HDFS首先进入安全模式,DataNode在启动的时候会向NameNode汇报可用的block等状态,当整个系统达到安全标准时,HDFS自动离开安全模式。如果HDFS处于安全模式下,则文件block不能进行任何的副本复制操作,因此达到最小的副本数量要求是基于DataNode启动时的状态来判定的,启动时不会再做任何复制(从而达到最小副本数量要求),NameNode启动时会进入该模式进行检测,检查数据块的完整性,处于该模式下的集群无法对HDFS进行操作,可以手动离开安全模式,操作如下。
而进入安全模式操作是:
进入安全模式整体流程如图3-3所示。
图3-3 安全模式流程图
8.负载均衡
让DataNode处于均衡状态,可以调整数据块、DataNode的工作任务等。例如,现有一个任务要分配给从节点运行,但是有些slave内存比较小,有些内存比较大,又有些slave正在执行别的任务,有些是空闲的,为了让各个slave既要饱和又要性能最好,就需要调整;再例如,原本有8个子节点,现在扩充了2个子节点,原先的8个子节点都要数据存储,也有相应的任务需要执行,而后加的2个子节点是空的,此时也需要负载均衡进行重新分配数据的存储和任务的执行。手动启动该机制运行,操作如下。
9.机架感知
机架之间的交互用机架感知来进行。机架之间是通过交换机、路由器、光纤等进行通信的,需要通过机架感知来交互。不同机架之间相互访问网络耗费较大且延迟也较高,所以理想状态下要查找数据刚好就在本机上,就不用耗费资源查找了,这就需要通过机架感知。大型Hadoop集群通过机架形式组织,而且同一机架上不同节点间的网络状况比不同机架之间的更为理想。
10.心跳机制
1)HDFS是master/slave结构,master包括NameNode和resourcemanager,slave包括DataNode和nodemanager。
2)master启动时会开启一个IPC服务,等待slave连接。
3)slave启动后,会主动连接IPC服务,并且每隔3秒连接一次,这个时间是可以调整的,设置heartbeat,这个每隔一段时间连接一次的机制,称为心跳机制。slave通过心跳给master汇报自己的信息,master通过心跳下达命令。
4)NameNode通过心跳得知DataNode状态,resourcemanager通过心跳得知nodemanager状态。
5)当master长时间没有收到slave信息时,就认为slave挂掉了。
超长时间计算:默认为630s,而默认的heartbeat.recheck.interval大小为5min,dfs.heartbeat.interval默认的大小为3s。recheck的时间单位为ms,heartbeat的时间单位为s。计算公式为2×recheck+10×heartbeat。
11.HA(High Availablity,高可用性)机制
Hadoop2.x版本中用于解决NameNode的单点故障问题。通过配置active/standby两个NameNode解决热备份问题。active(动作)NN对外提供服务,standby(备用)NN只做备份,active NN将数据写入共享存储系统(NFS-NetWorkSystem、QJM、BooKeeper等)中,而standby NN负责监听,一旦有新数据写入,standby NN会读取这些数据写入自己的内存,保证和active NN保持同步,当active NN发生故障,standby NN可以立即顶替。每个节点上都有一个ZooKeeper。DN不断向active NN和standby NN发送心跳,ZooKeeper会检测两个NN,active NN和standby NN通过共享存储系统保持一致,当ZooKeeper监测到active NN出现故障时,会立即通过故障转移控制器切换standby NN为激活状态,HA机制的示意图如图3-4所示。
图3-4 HA机制
注意:SecondaryNameNode不是HA,只是阶段性合并edits和fsimage,用以缩短NN启动的时间,NN失效时SecondaryNN不能立即提供服务,而且也不能保证数据和NN的一致性。
12.Federation机制
Federation机制也是用来解决NN的单点故障的,但是并非是最佳方案。Federation机制是指集群中存在多个NN,各NN分别管理一部分命名空间,但共享DN的存储资源,各NN负责不同元数据的存储,隔离性较好,当NN启动时会把所有元数据信息加载到内存中,对装有NN的机器内存压力比较大,Federation机制提供了多个NN来存储元数据,但并不能根本上解决单点故障的问题,因为多个NN的其中一个宕机,元数据信息还是会丢失,这就意味着需要为每个NN部署一个备份NN应对宕机的问题,Federation机制如图3-5所示。
13.QJM(Qurom Journal Manager共享存储系统)
QJM管理的节点为JournalNode(日志节点),NameNode往这些JournalNode上读/写editlog信息。在每次的写操作过程中,这些信息会发送到所有的JournalNode中,关键的一点是,它并不需要所有节点成功地回复信息,只需要多数以上(这里指半数以上)的成功信息即可。
14.JournalNode
QJM存储段进程,提供日志读写、存储、修复等服务。
图3-5 Federation机制
【例3-1】如果heartbeat.recheck.interval设置为5,000(ms),dfs.heartbeat.interval设置为3(s,默认),则总的超时时间为多少?
根据公式2∗rechek+10∗heartbet得总的超时时间为40s。