HDFS学习基础

发布时间 2023-05-24 14:52:45作者: 多木多多木

一、HDFS基础知识

HDFS 是 Hadoop Distribute File System 的简称,意为:Hadoop 分布式文件系统。是 Hadoop 核心组件之一,作为最底层的分布式存储服务而存在。分布式文件系统解决的问题就是大数据存储。它们是横跨在多台计算机上的存储系统。分布式文件系统在大数据时代有着广泛的应用前景,它们为存储和处理超大规模数据提供所需的扩展能力。

HDFS特性

首先,它是一个文件系统,用于存储文件,通过统一的命名空间目录树来定位文件;

其次,它是分布式的,由很多服务器联合起来实现其功能,集群中的服务器有各自的角色。

master/slave架构

 

HA模式的HDFS集群包含主、备NameNode和多个DataNode,采用 master/slave 架构,在Master上运行NameNode,而在每一个Slave上运行DataNode,ZKFC需要和NameNode一起运行。注意datanode和namende之间维护的通信机制,基于TCP/IP,datanode会定期向主备namenode汇报是否挂掉,具体的block块数。balancing:负载均衡机制,如果datanode1上放了100个block块,datanode2上放了80个,那么有新的block块尽量往datanode2上放。

针对于该图的详细信息参考华为云官方文档:

https://support.huaweicloud.com/devg3-mrs/mrs_07_300003.html

https://support.huaweicloud.com/productdesc-mrs/mrs_08_000701.html

分块存储

HDFS 中的文件在物理上是分块存储(block)的,块的大小可以通过配置参数来规定,MRS 3.1.1版本默认大小128MB,参考hdfs服务的基础配置参数:dfs.blocksize

 

命名空间(NameSpace)

HDFS 支持传统的层次型文件组织结构。用户或者应用程序可以创建目录,然后将文件保存在这些目录里。文件系统名字空间的层次结构和大多数现有的文件系统类似:用户可以创建、删除、移动或重命名文件。Namenode 负责维护文件系统的命名空间,任何对文件系统命名空间或属性的修改都将被Namenode 记录下来。HDFS 会给客户端提供一个统一的抽象目录树,客户端通过路径来访问文件,形如:hdfs://namenode:port/dir-a/dir-b/dir-c/file.data。hdfs客户端说明参考华为云官网:https://support.huaweicloud.com/devg3-mrs/mrs_07_300003.html

Namenode 元数据管理

我们把目录结构及文件分块位置信息叫做元数据。Namenode 负责维护整个hdfs文件系统的目录树结构,以及每一个文件所对应的 block 块信息(block 的id,及所在的datanode 服务器)。

Datanode 数据存储

文件的各个 block 的具体存储管理由 datanode 节点承担。每一个 block 都可以在多个datanode 上。Datanode 需要定时向 主备Namenode 汇报自己持有的 block信息。存储多个副本。

副本机制

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

参考hdfs服务的基础配置参数:dfs.replication

MRS服务的副本数默认值区别于节点类型和存储盘类型选择,详情参考:https://support.huaweicloud.com/productdesc-mrs/mrs_08_000701.html

一次写入,多次读出

HDFS 是设计成适应一次写入,多次读出的场景,且不支持文件的修改。

正因为如此,HDFS 适合用来做大数据分析的底层存储服务,并不适合用来做网盘等应用,因为,修改不方便,延迟大,网络开销大,成本太高。

Hadoop文件系统补充说明:具体详细参见hadoop权威指南第三版第59页。

二、HDFS常用命令

fs、dfs区别
(1) fs是文件系统, dfs是分布式文件系统。
(2) fs > dfs。
(3) 分布式环境情况下,fs与dfs无区别。
(4) 本地环境中,fs就是本地文件,dfs就不能用了。
(5) fs涉及到一个通用的文件系统,可以指向任何的文件系统如local,HDFS,HSTP,S3等。但是dfs仅是针对HDFS的。

(6) 查看本地文件系统,根目录下的文件:hadoop fs -ls file:///

常用hdfs命令

1、显示HDFS目录信息:hdfs dfs -ls [-R] <args>

样例:

hdfs dfs -ls /user

hdfs dfs -ls /user/yarn/ats

hdfs dfs -ls -R /user/yarn/ats

说明:-R参数会以递归的方式显示出全部子目录

2、创建HDFS目录:hdfs dfs -mkdir [-p] <paths>

样例:

hdfs dfs -mkdir /user/bbb

hdfs dfs -mkdir -p /user/ccc/ddd

说明:创建的目录中如果存在没有创建的父目录,需要使用 -p参数,如果在hdfs根目录下创建文件目录需要具有超级管理员的权限

3、将本地文件移动到hdfs目录:hdfs dfs -moveFromLocal <localsrc><dst>

样例:

hdfs dfs -moveFromLocal a.txt /user/aaa

hdfs dfs -moveFromLocal 1.txt 2.txt /user/aaa

说明:文件从本地移动到HDFS文件系统之后,本地不保留,该命令是移动,不是纯上传,支持同时移动多个文件

4、从本地上传一个或多个文件到hdfs目录:hdfs dfs -put <localsrc> ... <dst>

样例:

hdfs dfs -put 3.txt 4.txt 5.txt /user/aaa

说明:文件从本地上传到hdfs文件系统,本地文件继续保留,支持多个文件上传,命令等同于copyFromLocal

5、从hdfs一个目录移动文件到另一个目录:hdfs dfs -mv URI [URI ...] <dest>

样例:

hdfs dfs -mv /user/aaa/a.txt /user/bbb/a.txt

hdfs dfs -mv /user/aaa/1.txt /user/aaa/2.txt /user/aaa/3.txt /user/bbb

说明:目的端的目录一定要存在,移动多个文件时,目的端参数要是一个指定的目录,不能设置为具体文件

6、从hdfs一个目录拷贝文件或目录到另一个目录,可以覆盖,可以保留原有权限信息:hdfs dfs -cp [-f] [-p | -p[topax]] URI [URI ...] <dest>

样例:

hdfs dfs -cp /user/aaa/4.txt /user/bbb/4.txt

hdfs dfs -cp /user/aaa/4.txt /user/aaa/5.txt /user/bbb

hdfs dfs -cp -f /user/aaa/4.txt /user/aaa/5.txt /user/bbb

说明:可以拷贝hdfs上一个或多个文件、目录到另一个目录,如果不设置-f参数,则不会有覆盖的效果

7、查看hdfs目录上的文件:hdfs dfs -cat URI [URI ...]

样例:

hdfs dfs -cat /user/aaa/4.txt

hdfs dfs -cat /user/aaa/4.txt /user/aaa/5.txt

说明:可以同时看多个文件,如果是压缩格式的文件可能会失效

8、追加本地文件内容到hdfs指定的文件中:hdfs dfs -appendToFile <localsrc> ... <dst>

样例:

hdfs dfs -appendToFile 5.txt /user/aaa/4.txt

hdfs dfs -appendToFile 1.txt 2.txt /user/aaa/4.txt

说明:可以追加多个文件

9、删除文件或目录:hdfs dfs -rm [-f] [-r|-R] [-skipTrash] URI [URI ...]

样例:

hdfs dfs -rm /user/aaa/4.txt

hdfs dfs -rm -R /user/cccc

说明:删除命令是把文件或者目录移动到垃圾箱(类似windows系统回收站),此时还没有彻底删除文件,需要清理垃圾箱之后才能彻底删除文件

    hdfs dfs -rmr 这个命令也可用,但是已被废弃(deprecated),替换为:hdfs dfs -rm -r

10、修改目录权限:hdfs dfs -chmod [-R] <MODE[,MODE]... | OCTALMODE> URI [URI ...]

样例:

hdfs dfs -chmod 666 /user/aaa/5.txt

其他:

清空垃圾箱:hdfs dfs -expunge,该命令不能直接在MRS集群上使用,会报错,可以使用rm相关密令直接删除指定目录

其他常用命令参考:https://blog.51cto.com/u_15105906/5167794

hdfs的高级命令:限制文件目录整体大小、限制目录文件个数、查看hdfs集群安全模式信息等命令在MRS集群上被限制使用或者使用不了,不推荐使用,感兴趣可参考文档:https://blog.csdn.net/qq_45841239/article/details/108527942

三、HDFS HA架构

 HA架构图上传失败(后续维护补充)

备注:上图中NN代表namenode,os代表操作系统,hw代表硬件(hardware),Failover是故障转移机制,datanode栅栏防御:每次只从一个NameNode更新信息

1、     在一个典型的HA集群中,需要把两个NameNodes配置在两台独立的机器上。在任何一个时间点,只有一个NameNode处于Active状态,另一个处于Standby状态。Active节点负责处理所有客户端操作,Standby节点时刻保持与Active节点同步的状态以便在必要时进行快速主备切换。NameNode是一个中心服务器,负责管理文件系统的命名空间(namespace,本质就是namenode维护的各种各样的元数据)以及客户端对文件的访问。

2、     文件操作,namenode是负责文件元数据的操作,datanode负责处理文件内容的读写请求,跟文件内容相关的数据流不经过Namenode,只询问它跟哪个dataNode联系,否则NameNode会成为系统的瓶颈,副本存放在哪些Datanode上由NameNode来控制,根据全局情况作出块放置决定,读取文件时NameNode尽量让用户先读取最近的副本,降低读取网络开销和读取延时。

3、     NameNode全权管理数据库的复制,它周期性的从集群中的每个DataNode接收心跳信合和状态报告,接收到心跳信号意味着DataNode节点工作正常,块状态报告包含了一个该DataNode上所有的数据列表。

4、  ZKFC是需要和NameNode一一对应的服务,即每个NameNode都需要部署ZKFC。它负责监控NameNode的状态,并及时把状态写入ZooKeeper。ZKFC也有选择谁作为Active NameNode的权利。

5、  JournalNode作用:为保持Active和Standby节点的数据一致性,两个节点都要与一组称为JournalNode的节点通信。当Active对文件系统元数据进行修改时,会将其修改日志保存到大多数的JournalNode节点中,例如有3个JournalNode,则日志会保存在至少2个节点中。Standby节点监控JournalNodes的变化,并同步来自Active节点的修改。根据修改日志,Standby节点将变动应用到本地文件系统元数据中。一旦发生故障转移,Standby节点能够确保与Active节点的状态是一致的。这保证了文件系统元数据在故障转移时在Active和Standby之间是完全同步的。对一个HA集群,保证任何时刻只有一个NameNode是Active状态至关重要。否则,命名空间会分为两部分,有数据丢失和产生其他错误的风险。为保证这个属性,防止“split-brain”问题的产生,JournalNodes在任何时刻都只允许一个NameNode写入。在故障转移时,将变为Active状态的NameNode获得写入JournalNodes的权限,这会有效防止其他NameNode的Active状态,使得切换安全进行。

6、  ZooKeeper是一个协调服务,帮助ZKFC执行主NameNode的选举。

参考文档:

https://support.huaweicloud.com/productdesc-mrs/mrs_08_000701.html

https://support.huaweicloud.com/productdesc-mrs/mrs_08_000702.html