HDFS_02_文件系统
持续更新大数据
文章 …
1. 文件系统(FS)
学习文件系统是为了更好的理解分布式文件系统。而之所以要学习分布式文件系统,是因为传统的文件系统无法高效的存取海量数据,所以学习分布式文件系统架构之前,先要知道什么是文件系统,传统的文件系统处理海量数据的劣势。
1.1 文件系统
1.1.1 什么是文件系统?
文件系统(File System),简称 FS ,顾名思义就是管理文件的系统。不同的用于有不同的文件系统,比如:Windows有Windows的文件管理系统,Linux有Linux的文件文件系统,百度网盘也有百度网盘自己的文件系统。
1.1.2 传统文件系统的弊端
传统的文件系统存储数据最大的特点就是,一个文件存储在一个磁盘上。这就直接导致读写效率低、成本高、稳定性相对低等弊端。
1.1.3 那么如何提高存取效率呢?
想要提高存取效率无外乎就是提高读取效率、提高安全性、降低成本这几个方面去思考。
其实把文件拆分处理,存储到不同的磁盘,这就是分布式文件系统的核心理念。所以接下来我们将学习什么是分布式文件系统、分布式文件系统如何处理数据、以及分布式文件系统如何进一步提高数据安全性!
2. 分布式文件系统(DFS)⭐️
2.1 什么是分布式文件系统?
分布式文件系统(Distributed File System),简称 DFS ,它的典型特点就是把一个大文件拆分为多个小文件,然后这些小文件分别存储到多个磁盘上。而且 HDFS 是 MapReduce 计算的基础。
2.2 为什么要使用分布式文件系统?
进入大数据阶段,数据都是 TB 级别甚至 PB 级别,传统的文件系统在处理海量数据时读写效率低、成本高、安全性低。
2.3 分布式文件系统工作原理
分布式文件系统的核心是想就是存储数据的时候对数据进行拆分,拿取数据的时候根据偏移量把数据组合成原数据。
所以想要理解分布式文件系统就要从它的存储数据和拿取数据这两个角度去学习。
2.4 DFS拆分准则
既然是准则,就不能违背!
准则: 文件必须切分为等大的数据块(Block)且拆分完成之后不能破坏数据块的状态
2.4.1 数据块(Block)
数据块是分布式文件系统当中的一个重要概念,一个文件被切分成很多小的数据整体,这些小的数据整体就叫数据块(Block),数据块默认大小是 128MB 。
2.4.1 如何理解等大?
所谓等大,不是指均分!!!
比如:现在有一个 258MB 的文件,现在要把它切分成等大的数据块,它的切分规则是如下图:
所以,第一个数据块到第二个数据块大小是等大的,最后一个数据块可能是等大。
2.4.1 为什么非要切分成等大的数据块?
每个数据块大小不一致在设计存储算法的时候,需要为每个数据块设计算法,这样做显然很麻烦。所以把文件切分成等大的数据块,这样可以降低算法设计的复杂度。
2.4.2 如何理解不能破坏数据块的状态?
文件拆分完成之后,增加数据块的内容、修改数据块的内容、删除数据块的内容,这些操作都是破坏了数据块的状态。这些操作都会极大概率改变数据块的长度,那么就违背了数据块等大的准则!数据块的偏移量发生改变,之前设计好的算法就会失效,最后把这些数据块组合成原文件的时候就会出错!
我们已经知道了数据块(Block)重要性,那么对数据块进行高效率的管理,提高数据块的安全性就可以极大程度提高分布式文件系统的安全性,那么如何提高高效管理来提高数据块(Block)的安全性呢?下节就会介绍。
2.5 如何提高数据块安全性?
答案是: 备份出一模一样的数据块(Block)
直接对原始数据块进行备份,每个数据块一般是有三个副本,数据块备份的数据不要超过集群节点的总数。这里有一个小细节要注意,就是数据块一般是有三个副本,那么该数据块总共是有3个。举个例子,数据块A有三个副本,那么DFS里面只有三个一模一样的数据块A,分别是:数据块A(原数据块)、数据块A(复制品)、数据块A(复制品)。
这3个副本不能存放在同一个节点。这一点要求很好理解,如果数据块A和它的三个副本都存储在node01,如果node01被损坏,那数据块A就彻底损坏,文件就永远不能还原!
备份的数据不是藏起来,而是也会参与到工作。所以、这样虽然占用了空间,但是提高效率和安全性!
2.6 如何有效管理数据块?
一个文件被切分成很多的数据块,一个数据块又一般有三个副本,那么这么多数据块如何管理呢?
2.6.1 不对数据块进行管理会出现的后果
文件被拆分为多个小的数据块,每个数据块又有3个副本,那么这么多数据块,如何快速从这些数据块当中对文件进行还原呢?如果不对数据块进行管理,数据块胡乱放在集群中的某个节点,用户现在想要使用文件,系统就要对集群当中所有的节点进行遍历,只有知道了哪个数据块在哪个节点上才能还原出原文件,这样会大幅度消耗CPU性能,而且用户体验度也很差!
2.6.1 如何管理数据块?
方法是:把集群当中节点分为三类(NameNode
、DataNode
、SecondaryNameNode
)
1、DataNode
DataNode,存储节点,专门用来存储数据块(Block),类似于工人,干的是最底层的事情。
2、NameNode
NameNode,日志节点,类似于管家,它主要有三个用处:
- 存储 文件的元数据:元数据是指文件的用户-组-权限、创建时间、文件大小等基本信息,如果是 HDFS 的话,还会包含文件对应的Block信息、文件对应的Block副本数。
- 存储 文件与数据块的映射关系:就是记录一个文件由哪些数据块组成。
- 存储 数据块与DataNode的映射关系:就是记录每个DataNode上有哪些数据块。
3、SecondaryNameNode
secondaryNameNode,记录节点,类似于NameNode的秘书,它主要是定时对NameNode进行数据snapshots(快照)进行备份,这样尽量降低NameNode崩溃之后,导致数据的丢失,其实所作的工作就是从NameNode获得fsimage和edits把二者重新合并然后发给,NameNode这样,既能减轻NameNode的负担又能保险地备份。
有了这样三类节点的协调合作,就可以有效的管理数据块(Block),大致流程就是:客户端发送请求要拉取分布式文件系统上的文件,客户端请求发送到 NameNode ,NameNode 告诉客户端要拉取的文件所对应的数据块有哪些,还会告诉客户端这些数据块在哪个DataNode 上,客户端知道了之后,就直接去 DataNode 拿取数据块,然后组合成原文件。
这样有目的性地取找数据块比遍历全部节点效率高很多!
下期讲解 HDFS_03_Hadoop3 完全分布式搭建 ......