什么是HDFS?

一、HDFS介绍
上篇文章已经讲到了,随着数据量越来越大,在一台机器上已经无法存储所有的数据了,那我们会将这些数据分配到不同的机器来进行存储,但是这就带来一个问题:不方便管理和维护
所以,我们就希望有一个系统可以将这些分布在不同操作服务器上的数据进行统一管理,这就有了分布式文件系统

  • HDFS是分布式文件系统的其中一种(目前用得最广泛的一种)
在使用HDFS的时候是非常简单的:虽然HDFS是将文件存储到不同的机器上,但是我去使用的时候是把这些文件当做是存储在一台机器的方式去使用(背后却是多台机器在执行):
  • 好比:我调用了一个RPC接口,我给他参数,他返回一个response给我 。RPC接口做了什么事其实我都不知道的(可能这个RPC接口又调了其他的RPC接口)-----屏蔽掉实现细节,对用户友好

什么是HDFS?

文章插图
 
明确一下:HDFS就是一个分布式文件系统,一个文件系统,我们用它来做什么?存数据呀 。
下面,我们来了解一下HDFS的一些知识,能够帮我们更好地去「使用」HDFS
二、HDFS学习从上面我们已经提到了,HDFS作为一个分布式文件系统,那么它的数据是保存在多个系统上的 。例如,下面的图:一个1GB的文件,会被切分成几个小的文件,每个服务器都会存放一部分 。
什么是HDFS?

文章插图
 
那肯定会有人会问:那会切分多少个小文件呢?默认以128MB的大小来切分,每个128MB的文件,在HDFS叫做块(block)
显然,这个128MB大小是可配的 。如果设置为太小或者太大都不好 。如果切分的文件太小,那一份数据可能分布到多台的机器上(寻址时间就很慢) 。如果切分的文件太大,那数据传输时间的时间就很慢 。
PS:老版本默认是64MB
一个用户发出了一个1GB的文件请求给HDFS客户端,HDFS客户端会根据配置(现在默认是128MB),对这个文件进行切分,所以HDFS客户端会切分为8个文件(也叫做block),然后每个服务器都会存储这些切分后的文件(block) 。现在我们假设每个服务器都存储两份 。
什么是HDFS?

文章插图
 
这些存放真实数据的服务器,在HDFS领域叫做DataNode
什么是HDFS?

文章插图
 
现在问题来了,HDFS客户端按照配置切分完以后,怎么知道往哪个服务器(DataNode)放数据呢?这个时候,就需要另一个角色了,管理者(NameNode) 。
NameNode实际上就是管理文件的各种信息(这种信息专业点我们叫做MetaData「元数据」),其中包括:文文件路径名,每个Block的ID和存放的位置等等 。
所以,无论是读还是写,HDFS客户端都会先去找NameNode,通过NameNode得知相应的信息,再去找DataNode
  • 如果是写操作,HDFS切分完文件以后,会询问NameNode应该将这些切分好的block往哪几台DataNode上写 。
  • 如果是读操作,HDFS拿到文件名,也会去询问NameNode应该往哪几台DataNode上读数据 。

什么是HDFS?

文章插图
 
2.1 HDFS备份作为一个分布式系统(把大文件切分为多个小文件,存储到不同的机器上),如果没有备份的话,只要有其中的一台机器挂了,那就会导致「数据」是不可用状态的 。
写到这里,如果看过我的Kafka和ElasticSearch的文章可能就懂了 。其实思想都是一样的 。
Kafka对partition备份,ElasticSearch对分片进行备份,而到HDFS就是对Block进行备份 。
尽可能将数据备份到不同的机器上,即便某台机器挂了,那就可以将备份数据拉出来用 。
对Kafka和ElasticSearch不了解的同学,可以关注我的GitHub,搜索关键字即可查询(我觉得还算写得比较通俗易懂的)
注:这里的备份并不需要HDFS客户端去写,只要DataNode之间互相传递数据就好了 。
什么是HDFS?

文章插图
 
2.2 NameNode的一些事从上面我们可以看到,NameNode是需要处理hdfs客户端请求的 。(因为它是存储元数据的地方,无论读写都需要经过它) 。
现在问题就来了,NameNode是怎么存放元数据的呢?