HDFS讲解
一、HDFS介绍
随着数据量越来越大,在一台机器上已经无法存储所有的数据了,我们会将这些数据分配到不同的机器来进行存储,但是这就带来一个问题:不方便管理和维护。
所以,我们就希望有一个系统可以将这些分布在不同操作服务器上的数据进行统一管理,这就有了分布式文件系统。
HDFS是分布式文件系统的其中一种(目前用得最广泛的一种)。
在使用HDFS的时候是非常简单的:虽然HDFS是将文件存储到不同的机器上,但是我去使用的时候是把这些文件当做是存储在一台机器的方式去使用(背后却是多台机器在执行)。屏蔽掉实现细节,对用户友好。
二、HDFS学习
HDFS作为一个分布式文件系统,它的数据是保存在多个系统上的。例如,一个1GB的文件,会被切分成几个小的文件,每个服务器都会存放一部分。
默认以128MB的大小来切分,每个128MB的文件,在HDFS叫做块(block)。这个128MB大小是可配的。如果设置为太小或者太大都不好:
- 如果切分的文件太小,那一份数据可能分布到多台的机器上(寻址时间就很慢)
- 如果切分的文件太大,那数据传输时间就很慢
PS:老版本默认是64MB
这些存放真实数据的服务器,在HDFS领域叫做DataNode。
2.1 HDFS备份
作为一个分布式系统,如果没有备份的话,只要有其中的一台机器挂了,那就会导致数据是不可用状态的。
Kafka对partition备份,ElasticSearch对分片进行备份,而到HDFS就是对Block进行备份。尽可能将数据备份到不同的机器上,即便某台机器挂了,那就可以将备份数据拉出来用。
2.2 NameNode
HDFS客户端切分完以后,怎么知道往哪个服务器(DataNode)放数据呢?这个时候就需要另一个角色——管理者(NameNode)。
NameNode实际上就是管理文件的各种信息(元数据 MetaData),其中包括:文件路径名,每个Block的ID和存放的位置等等。
所以,无论是读还是写,HDFS客户端都会先去找NameNode,通过NameNode得知相应的信息,再去找DataNode。
NameNode的元数据存储机制:
- 修改内存中的元数据,然后把修改的信息append(追加)到一个名为
editlog的文件上 - 由于append是顺序IO,所以效率也不会低
- 为了解决editlog过大导致重启慢的问题,引入了fsimage(内存快照)
- SecondNameNode负责合并editlog和fsimage
NameNode高可用:
现在的NameNode是单机的,如果NameNode挂了,整个HDFS集群都不可用了。通过Zookeeper实现高可用:
- 主NameNode和从NameNode需要保持元数据的信息一致
- 引入Shared Edits(JournalNode) 来实现主从NameNode之间的同步
- 主NameNode的editlog写到JournalNode,从NameNode读取并同步
2.3 DataNode
数据是存放在DataNode上的(还会备份)。DataNode启动的时候会去NameNode上注册,他俩会维持心跳,如果超过时间阈值没有收到DataNode的心跳,那HDFS就认为这个DataNode挂了。
一个Block除了存放数据的本身,还会存放一份元数据(包括数据块的长度,块数据的校验和,以及时间戳)。DataNode会定期向NameNode上报所有Block的信息。