hadoop 2. HDFS分布式文件系统

24 Jan 2021

HDFS (全称:Hadoop Distribute File System,Hadoop 分布式文件系统)是 Hadoop 核心组 成,是分布式存储服务。
分布式文件系统横跨多台计算机,在大数据时代有着广泛的应用前景,它们为存储和处理超大规模
数据提供所需的扩展能力。
HDFS是分布式文件系统中的一种。

HDFS的重要概念

HDFS 通过统一的命名空间目录树来定位文件; 另外,它是分布式的,由很多服务器联合起来实现 其功能,集群中的服务器有各自的角色(分布式本质是拆分,各司其职);

典型的 Master/Slave 架构

HDFS 的架构是典型的 Master/Slave 结构。
HDFS集群往往是一个NameNode(HA架构会有两个NameNode,联邦机制)+多个DataNode组成;
NameNode是集群的主节点,DataNode是集群的从节点。

分块存储(block机制)

HDFS 中的文件在物理上是分块存储(block)的,块的大小可以通过配置参数来规定; Hadoop2.x版本中默认的block大小是128M;

命名空间(NameSpace)

HDFS 支持传统的层次型文件组织结构。用户或者应用程序可以创建目录,然后将文件保存在这些目录里。文件系统名字空间的层次结构和大多数现有的文件系统类似:用户可以创建、删除、移动 或重命名文件。
Namenode 负责维护文件系统的名字空间,任何对文件系统名字空间或属性的修改都将被 Namenode 记录下来。
HDFS提供给客户单一个抽象目录树,访问形式:hdfs://namenode的hostname:port/test/input
hdfs://linux121:9000/test/input

NameNode元数据管理

我们把目录结构及文件分块位置信息叫做元数据。
NameNode的元数据记录每一个文件所对应的block信息(block的id,以及所在的DataNode节点 的信息)

DataNode数据存储

文件的各个 block 的具体存储管理由 DataNode 节点承担。一个block会有多个DataNode来存储,DataNode会定时向NameNode来汇报自己持有的block信息。

副本机制

为了容错,文件的所有 block 都会有副本。每个文件的 block 大小和副本系数都是可配置的。应用 程序可以指定某个文件的副本数目。副本系数可以在文件创建的时候指定,也可以在之后改变。 副本数量默认是3个。

注意: 文件副本的实际数量与datanode的数量有关,比如设置文件副本数量为10,但是实际节点只有3,那文件的实际副本数量就是3.
文件的实际副本数量<=datanode(<=设置副本数)

一次写入,多次读出

HDFS 是设计成适应一次写入,多次读出的场景,且不支持文件的随机修改。 (支持追加写入, 不支持随机更新)
正因为如此,HDFS 适合用来做大数据分析的底层存储服务,并不适合用来做网盘等应用(修改不方便,延迟大,网络开销大,成本太高)

HDFS 架构

NameNode(nn):Hdfs集群的管理者,Master

DataNode:NameNode下达命令,DataNode执行实际操作,Slave节点。

Client:客户端 shell,web,java等

HDFS 客户端操作

Shell 命令行操作HDFS

JAVA客户端操作HDFS

HDFS读写解析

HDFS读数据流程

HDFS写数据流程

验证每个packet是64k

@Test  
public void testUploadPacket() throws IOException {  
  
//1 准备读取本地文件的输入流  
final FileInputStream in = new FileInputStream(new  
File("e:/lagou.txt"));  
  
//2 准备好写出数据到hdfs的输出流  
final FSDataOutputStream out = fs.create(new Path("/lagou.txt"), new  
Progressable() {  
  
public void progress() { //这个progress方法就是每传输64KB(packet)就会执行一次  
// 第一次建立链接会进来一次,所以进来这个方法的次数 文件大小 / 64kb + 1  
  
 System.out.println("&");  
  
} });  
  
//3 实现流拷贝  
IOUtils.copyBytes(in, out, configuration); //默认关闭流选项是true,所以会自动关闭  
  
//4 关流  可以再次关闭也可以不关了   
  
}  

NameNode与SecondNameNode

元数据管理流程图

第一阶段:NameNode启动

第二阶段:Secondary NameNode工作

Fsimage与Edits文件解析

Namenode故障处理

NameNode故障后,HDFS集群就无法正常工作,因为HDFS文件系统的元数据需要由NameNode来管 理维护并与Client交互,如果元数据出现损坏和丢失同样会导致NameNode无法正常工作进而HDFS文 件系统无法正常对外提供服务。

如果元数据出现丢失损坏如何恢复呢?

1. 将2NN的元数据拷贝到NN的节点下

此种方式会存在元数据的丢失。

2. 搭建HDFS的HA(高可用)集群

解决NN的单点故障问题!!(借助Zookeeper实现HA,一个
Active的NameNode,一个是Standby的NameNode)

高级指令

HDFS文件限额配置

HDFS文件的限额配置允许我们以文件大小或者文件个数来限制我们在某个目录下上传的文件数量或者文件内容总量,以便达到我们类似百度网盘网盘等限制每个用户允许上传的最大的文件的量

HDFS的安全模式

安全模式是HDFS所处的一种特殊状态,在这种状态下,文件系统只接受读数据请求,而不接 受删除、修改等变更请求。在NameNode主节点启动时,HDFS首先进入安全模式,DataNode在 启动的时候会向NameNode汇报可用的block等状态,当整个系统达到安全标准时,HDFS自动离 开安全模式。如果HDFS处于安全模式下,则文件block不能进行任何的副本复制操作,因此达到最小的副本数量要求是基于DataNode启动时的状态来判定的,启动时不会再做任何复制(从而达 到最小副本数量要求),HDFS集群刚启动的时候,默认30S钟的时间是出于安全期的,只有过了 30S之后,集群脱离了安全期,然后才可以对集群进行操作。

Hadoop归档技术

主要解决HDFS集群存在大量小文件的问题!!
由于大量小文件会占用NameNode的内存,因此对于HDFS来说存储大量小文件造成NameNode 内存资源的浪费!
Hadoop存档文件HAR文件,是一个更高效的文件存档工具,HAR文件是由一组文件通过archive 工具创建而来,在减少了NameNode的内存使用的同时,可以对文件进行透明的访问,多个小文件合并成HAR文件之后, NameNode的元数据只会存HAR文件相关的信息,可以有效的减少NameNode内存的使用,对于实际操作处理文件依然是一个一个独立的文件。