大数据学习(02)——HDFS入门
Hadoop模块
提到大数据,Hadoop是一个绕不开的话题,我们来看看Hadoop本身包含哪些模块。
Common是基础模块,这个是必须用的。剩下常用的就是HDFS和YARN。
MapReduce现在用的比较少了,多数场景下会被Spark取代。
Ozone是一个新组件,对象存储,可以看做是HDFS的升级版。
HDFS组成
作为Hadoop的分布式文件系统,它的思想远比这个产品本身更重要。它主要包含这么几个组成部分:
- NameNode,主节点,用来保存元数据信息,包括文件属性、文件切成多少个Block、每个Block在哪个DataNode上等等
- DataNode,存储文件的Block
- SecondaryNameNode,为NameNode做记录合并工作,减少NameNode重启加载时间
这个文件系统的命令跟Linux的文件系统命令很相似,只不过前面要加上hdfs dfs前缀。
DataNode
当一个文件上传到HDFS时,根据配置文件里的块大小,它会被切成多个大小相同的Block(最后一块大小是实际值),分散存放在多个DataNode上。
每一个Block根据配置文件里的副本数设置,多个副本也会放在不同的DataNode上。这里有一个概念叫做Block放置策略,它是由NameNode来确定的。
Block多个副本在DataNode之间复制传输的时候,又被切成更小的单元,其中包含数据和校验和。切成小单元的目的,是为了提高Block复制的并发度,让它成为一个流水线作业,减少总体网络传输时间。
如果某一个副本在复制的时候出现问题,这个操作不会由客户端来重试,而是NameNode在检查副本数不足时,自动复制缺少的副本。
NameNode
存放元数据信息:一部分来源于客户端的目录增删、文件上传等操作,另一部分来源于DataNode存放文件Block之后的反馈信息。
它使用FsImage保存某个时点全量的元数据信息,使用EditLog来记录实时变化的元数据信息,两个文件加起来构成了当前的全量信息。
Block放置策略:如果上传文件的节点是DataNode并且副本数为3,那么Block第一个副本放在该DataNode上,第二个副本放在其他机柜的DataNode上(与第一个节点不在同一个交换机),第三个副本放在与第二个副本相同机柜的DataNode上(同一个交换机网络开销小)
NameNode重启时,它会加载最新的FsImage,并把之后的EditLog重新执行一次,再把内存里恢复的元数据写一个新的FsImage。
SecondaryNameNode
它不是NameNode的备份。
它的工作是从NameNode上拉取FsImage和EditLog,并把两者合并后的新的FsImage推给NameNode。
在两种情况下会触发这个工作:
- 到达固定的时间间隔(比如一个小时)
- EditLog文件大小达到一个值(比如64M)
为什么有HDFS
在HDFS出现之前,已经有那么多分布式文件系统了,为什么还要再造一个轮子呢?
确切地说,HDFS不是一个完整的文件系统,它的出现是为了更好地执行分布式计算,这是以前的文件系统不具备的特性。
为了达到这个目的,HDFS不支持文件的修改。因为一旦某个Block被修改了,它的大小就会发生变化。为了保持每个Block大小一致,必然会引起其后所有Block的重新切分和移动,IO成本太高。
当然,它也可以只修改元素据里Block的偏移量,但这样会导致修改多次之后,Block的大小差异太大,不利于计算任务的平均分配。