* HDFS的工作原理是答辩重点(块、元数据、主/从节点SecondaryNameNode,FsImage、EditImage、存取策略/规则、数据出错与恢复、读写过程)
集群和分布式概念:
- 集群:集群就是逻辑上处理同一任务的机器集合,可以属于同一机房,也可分属不同的机房
- 分布式:分布式文件系统把文件分布存储到多个计算机节点上,成千上万的计算机节点构成计算机集群
集群就是逻辑上处理同一任务的机器集合,可以属于同一机房,也可分属不同的机房。分布式这个概念可以运行在某个集群里面,某个集群也可作为分布式概念的一个节点。一句话,就是:“分头做事”与“一堆人”的区别。
分布式文件系统的结构:
分布式文件系统在物理结构上是由计算机集群中的多个节点构成的,这些节点分为两类,一类叫“主节点”(Master Node)或者也被称为“名称结点”(NameNode),另一类叫“从节点”(Slave Node)或者也被称为“数据节点”(DataNode)。

HDFS是存储数据的地方,就像电脑的硬盘一样,文件都存储在这个上面,MapReduce是对数据进行处理计算的,它有个特点就是不管多大的数据只要给它时间它就能把数据跑完,但是时间可能不是很快,所以它叫数据的批处理。YARN是体现Hadoop平台概念的重要组件,有了它大数据生态体系的其它软件就能在hadoop上运行了,这样就能更好的利用HDFS大存储的优势和节省更多的资源,比如我们就不用再单独建一个spark的集群了,让它直接跑在现有的hadoop yarn上面就可以了
HDFS架构
HDFS:分布式存储
HDFS优点:
- 高容错性:数据自动保存多个副本、副本丢失后、自动恢复
- 适合批处理:移动计算而非数据,数据位置暴露给计算框架
- 适合大数据处理:GB、TB甚至PB级数据,百万规模以上的文件数量
- 可构建在廉价机器上:通过多副本提高可靠性,提供了容错和恢复机制
HDFS缺点:大量小文件存储在hdfs上时,压缩成一个文件(网盘不允许文件修改:百度、360网盘,国内80%的网盘都是基于hadoop)
- 低延迟数据访问:比如毫秒级,低延迟与高吞吐率
- 小文件存储:占用NameNode大量内存,寻道时间超过读取时间
- 并发写入、文件随机修改:一个文件只能有一个写着,仅支持append

HDFS 采用Master/Slave的架构来存储数据,这种架构主要由四个部分组成,分别为HDFS Client、NameNode、DataNode和Secondary NameNode。下面我们分别介绍这四个组成部分。
块:HDFS块默认大小为64MB
块(Block):HDFS的文件被分成块进行存储,块是文件存储处理的逻辑单元
在HDFS里,所有的文件在存储的时候,都是把文件切分成相同固定大小的数据块,每个块默认大小是64MB字节。当文件传过来之后,系统把它拆分成块进行存储,若文件大小不到64MB,则单独存成一个block,存储到不同节点上, 默认情况下每个block都有三个副本。从管理上看,块是整个文件存储、处理的逻辑单元。我们进行的文件备份、查找也都是按照块来处理的。
注意: Block大小和副本数通过Client端上传文件时设置,文件上传成功后副本数可以变更,Block Size不可变更。
HDFS块存储优势:
支持大规模文件存储:一个大规模文件可以被分拆成若干个文件块,不同的文件块可以被分发到不同的节点上。
简化系统设计:简化了存储管理、方便了元数据的管理。
适合数据备份:每个文件块都可以冗余存储到多个节点上,大大提高了系统的容错性和可用性。
节点:NameNode和DataNode
NameNode(名称节点)是管理节点,存放元数据:①文件与数据块的映射表 ②数据块与数据节点的映射表

NameNode是管理节点,主要存放元数据。元数据包括两个部分:一个是文件和数据块的映射表;另一个是数据块和数据节点的映射表。客户端如果有一个访问请求,那么他首先要向NameNode去读取元数据 ,NameNode会返回相关的信息,说明这个文件是存放在,哪一些节点上面,于是他再去向这些节点去读取数据块,获取到数据块之后再进行组装,拼装成之前想要的文件。这就是HDFS里的主节点NameNode。

- NameNode负责管理分布式文件系统的命名空间(Namespace),保存了两个核心的数据结构,即FsImage和EditLog
- FsImage用于维护文件系统树以及文件树中所有的文件和文件夹的元数据
- 操作日志文件EditLog中记录了所有针对文件的创建、删除、重命名等操作
- 名称节点记录了每个文件中各个块所在的数据节点的位置信息
名称节点运行期间EditLog不断变大的问题,靠SecondaryNameNode第二名称节点解决。
第二名称节点是HDFS架构中的一个组成部分,它是用来保存名称节点中对HDFS 元数据信息的备份,并减少名称节点重启的时间。SecondaryNameNode一般是单独运行在一台机器上。
在名称节点运行期间,HDFS的所有更新操作都是直接写到EditLog中,久而久之, EditLog文件将会变得很大
虽然这对名称节点运行时候是没有什么明显影响的,但是,当名称节点重启的时候,名称节点需要先将FsImage里面的所有内容映像到内存中,然后再一条一条地执行EditLog中的记录,当EditLog文件非常大的时候,会导致名称节点启动操作非常慢,而在这段时间内HDFS系统处于安全模式,一直无法对外提供写操作,影响了用户的使用。

SecondaryNameNode的工作情况:
- (1)SecondaryNameNode会定期和NameNode通信,请求其停止使用EditLog文件,暂时将新的写操作写到一个新的文件edit.new上来,这个操作是瞬间完成,上