大数据之 - HDFS介绍

这篇文章主要依据《The Hadoop Distributed File System》论文介绍HDFS的要点。

HDFS(The Hadoop Distributed File System) 是最初由Yahoo提出的分布式文件系统,它主要用来:

1)存储大数据

2)为应用提供大数据高速读取的能力

 

H在这里相信有许多想要学习大数据的同学,大家可以+下大数据学习裙: 740041381,即可免费领取套系统的大数据学习教程

adoop框架的主要特点是通过将数据和计算分布在集群中的各节点服务器,达到分布式计算的目的。计算逻辑和需要用到的数据在就近的结点,分区并行计算后再汇总(Map & Reduce)。

Hadoop项目Github链接为:https://github.com/apache/hadoop

基本模块包括:

HDFS:分布式文件系统 (by Yahoo)

MapReduce:分布式计算框架 (by Google)

HBase:分布式的,面向列的,非关系型数据库 (by Powerset->Microsoft)

Pig:基于Hadoop的大规模数据分析工具 (by Yahoo)

Hive:数据仓库工具,将结构化的数据文件映射为数据库表 (by Facebook)

ZooKeeper:分布式协同服务 (by Yahoo)

Yarn:任务调度和集群资源管理框架

(从上面可以看出,我们在提出新的框架或理论方面还是有不少差距)

HDFS将Meta数据和用户数据分开保存。Meta数据保存在NameNode中,用户数据保存在DataNode。服务器之间的通信基于TCP协议。

类似GFS(Google File System),从可靠性考虑,文件的内容复制在多个DataNode,后面会提到数据的副本如何复制到多个DataNode以及这样做的目的和好处。

HDFS架构

HDFS架构如图1所示。

大数据之 - HDFS介绍

图1 HDFS 架构

1. NameNode

NameNode是HDFS中的关键结点,它存储了HDFS文件系统的命名空间树,文件和路径在NameNode里面用inodes表示。在HDFS系统中,文件内容被切分成大的block(例如128Mbytes,可根据用户需求配置),每个block被独立复制在多个DataNode里。NameNode存储了每个文件的各block副本在DataNode存储的物理位置。

HDFS client读写HDFS的过程为:

读:当client读HDFS存储的某个文件时,它会先向NameNode发起读请求,NameNode返回该文件的block在DataNode的存储位置,client会从离它最近的DataNode读取数据。

写:当client写文件时,它向NameNode发起请求,NameNode返回DataNode的写位置(返回多个,例如3个DataNode),client直接向相应的DataNode发起写请求,写入文件block。每个block都会写到例如三个DataNode,确保文件block有多个副本。

如何使用pipeline的方式写入数据,下面的描述比较清晰:

Replication Pipelining

When a client is writing data to an HDFS file, its data is first written to a local file as explained in the previous section. Suppose the HDFS file has a replication factor of three. When the local file accumulates a full block of user data, the client retrieves a list of DataNodes from the NameNode. This list contains the DataNodes that will host a replica of that block. The client then flushes the data block to the first DataNode. The first DataNode starts receiving the data in small portions (4 KB), writes each portion to its local repository and transfers that portion to the second DataNode in the list. The second DataNode, in turn starts receiving each portion of the data block, writes that portion to its repository and then flushes that portion to the third DataNode. Finally, the third DataNode writes the data to its local repository. Thus, a DataNode can be receiving data from the previous one in the pipeline and at the same time forwarding data to the next one in the pipeline. Thus, the data is pipelined from one DataNode to the next.

简单来说,就是client将数据发给第一个DataNode,第一个DataNode将数据复制到第二个DataNode,第二个DataNode将数据复制到第三个DataNode。

这里还有几个概念要描述下:

image:在RAM中的,inode数据和每个文件的block列表。

checkpoint:存储在磁盘上的image。这里要注意的是因为block的副本是不时变化的,所以block副本的存储位置不是checkpoint的一部分。

journal:存储在磁盘上的对image的改动记录

2. DataNode

每一个DataNode上的block副本由两个文件表示,第一个文件是数据内容本身,第二个文件包含了block的meta数据(包含文件的checksum,生成时间)。

DataNode启动的时候会主动连接NameNode,验证namespace ID和DataNode的软件版本,如果不匹配NameNode的,DataNode会自动关闭。namespace ID是在文件系统实例初始化的时候分配的,不同的namespace ID的节点属于不同的集群。

在handshake握手后,DataNode会发起注册流程注册在NameNode上,NameNode分配storage ID (用于识别DataNode)给DataNode。

DataNode在注册的时候会把它保存的block副本信息通过block report消息发送给NameNode。block report也会周期性(如每个小时)地发送给NameNode,更新它保存的副本信息。这样NameNode就知道每个副本保存在哪个DataNode。

DataNode周期性地(如每3秒)发送heartbeat消息给NameNode,如果NameNode在10分钟内没有收到DataNode的heartbeat消息,它会认为这个DataNode已经不能提供服务,它上面的block副本也不可用,NameNode将开始在别的DataNode上创建新的block副本。

Heartbeat消息也会携带DataNode的a.总存储容量,b.正在使用的存储空间以及c.当前正在传输的数据数,这些信息可用于NameNode做空间分配和负载均衡使用。

NameNode不直接主动调DataNode,它使用heartbeat的回复来发送命令。这些命令包括:

  • 将block复制给别的节点

  • 删除本地的block副本

  • 重新注册或者关闭节点

  • 立刻发送block report

3. Image和Journal

在任何HDFS client发起的事务上,变化被记录在journal上。checkpoint文件不会更改,它只会被新的checkpoint文件更新。如果checkpoint文件或journal文件丢失或损坏,命名空间信息就会部分或全部丢失,为了避免这种情况,HDFS可以通过配置将checkpoint和journal文件保存在不同的存储路径。

在这里相信有许多想要学习大数据的同学,大家可以+下大数据学习裙: 740041381,即可免费领取套系统的大数据学习教程

3. CheckpointNode和BackupNode

CheckpointNode周期性地将当前的checkpoint和journal组合产生新的checkpoint和一个空的journal。CheckpointNode往往运行在一个与NameNode不同的独立的服务器上。

BackupNode类似CheckpointNode,也可以周期性地生成checkpoint,但除此之外,它还能够在内存中保存一份与NameNode同步的image。active NameNode将journal的改动发送给BackupNode。

文件操作和副本分布

1. 文件的读和写

HDFS实现的是单个写,多个读的模型。

HDFS client在写文件之前会获得这个文件的lease(租约),其它没有租约的client不能写该文件。正在写操作的client会周期性地发送heartbeat心跳消息给NameNode更新租约,当关闭文件时,租约释放。如果soft租约过期,client没能关闭或者更新租约,别的client可以抢占该租约获得写权限。如果在hard租约过期(一个小时),client没能关闭或更新租约,HDFS认为该client已经退出,它会自动关闭这个文件。

读方面不受租约机制影响,多个客户端能够并行读这个文件。

2. block的分布

同一个block的不同副本的分布对HDFS数据的可靠性,读写的性能至关重要。默认的策略如下:当一个新的block创建的时候,HDFS将第一个副本放在writer所在的节点,第二和第三个副本放在不同机架(rack)的不同节点,其余的更多的副本随机的放在别的节点,遵循原则:不能将多个副本放在同一个结点;不能有超过2个的副本被放在同一个机架,当副本数量少于rack数量的2倍时。

在一般的网络架构中,同一个机架的节点使用一个交换机连接;不同的机架通过核心交换机连接。同一个机架节点之间的网络带宽往往高。

总结来说:

  • 没有一个DataNode有任何block的超过1个的副本

  • 没有一个rack有同一个block的两个副本(在集群中有足够rack的情况下)

3. 副本管理

NameNode确保每个block都有指定的副本数量。当NameNode收到DataNode发来的block report时检测block的数量是否under-或者over-指定的副本数。

如果超过了,NameNode会删掉某个副本。

如果低于指定副本数,这个block会放到复制优先级队列,只有副本数只有一个的block有最高优先级。有一个线程专门扫描队列,来决定将新的副本创建到哪。

NameNode也需要确保所有的副本不在同一个机架上,如果所有的副本在同一个机架上,NameNode认为该副本少于指定的副本数,从而启动复制。当复制完成,NameNode检测副本数大于指定数量,会启动删除某个副本。通过复制->删除,确保副本处于不同机架上。

4. 平衡器

平衡器用来平衡HDFS集群中节点的磁盘使用率。当某个节点的磁盘使用率大于集群平均使用率超过一定阈值,平衡器会将数据从高磁盘使用率的DataNode节点移动到低使用率的DataNode节点。平衡器会尽量减少跨机架的数据拷贝。

5. block扫描器

每个DataNode都会运行一个block扫描器用于检测block副本是否损坏,当检测到损坏的情况下,它会报告给NameNode,NameNode把该副本标志成已损坏,同时创建一个新的副本,在新的副本创建成功后,再删除损坏的副本。

6. 节点退出

集群管理员可以控制DataNode的退出,当DataNode被标记成退出时,它不会再被选为副本的拷贝目的地,但仍然可以支持读请求。NameNode开始将在它上面的所有的block副本迁移到其它DataNode节点,当迁移完成后,DataNode就可以完全退出了。