大数据学习(60)-HDFS文件结构
&&大数据学习&&
🔥系列专栏: 👑哲学语录: 承认自己的无知,乃是开启智慧的大门
💖如果觉得博主的文章还不错的话,请点赞👍+收藏⭐️+留言📝支持一下博主哦🤞
一、体系结构
HDFS是一个标准的主从(Master/Slave)体系结构的分布式系统;HDFS集群包含一个或多个NameNode(NameNode HA会有多个NameNode) 和 多个DataNode(根据节点情况规划),用户可以通过HDFS客户端同NameNode 和 DataNode进行交互以访问文件系统。
HDFS公开文件系统名称空间,并允许将用户数据存储在文件中。在内部,一个文件被分成一个或多个块,这些块存储在一组datanode中。NameNode执行文件系统名称空间操作,如打开、关闭和重命名文件和目录。它还确定块到datanode的映射。datanode负责处理来自文件系统客户机的读和写请求。datanode还根据来自NameNode的指令执行块创建、删除和复制(体系结构如下图所示)。
二、相关概念
HDFS文件系统维护着一个命名空间,它是一个树状结构,包含文件和目录。这个命名空间以根目录“/”开始,用户可以创建、删除文件和目录,以及修改它们的权限。
1.NameNode
负责客户端请求的响应
元数据的管理(查询,修改)
namenode是HDFS集群主节点,负责维护整个hdfs文件系统的目录树,以及每一个路径(文件)所对应的block块信息(block的id,及所在的datanode服务器)
2.JournalNode
NameNode之间共享数据(主要体现在 NameNode配置 HA)
3.DataNode
存储管理用户的文件块数据
定期向namenode汇报自身所持有的block信息(通过心跳信息上报)
4.Data Blocks
HDFS中的文件在物理上是分块存储(block),块的大小可以通过配置参数( dfs.blocksize)来规定,默认大小在hadoop2.x版本中是128M,老版本中是64M
5.Data Replication
每一个block都可以在多个datanode上存储多个副本(副本数量也可以通过参数设置dfs.replication,默认是3)
6.HDFS通信协议
HDFS作为分布式文件系统,涉及到数据节点,名称节点和客户端三者之间的配合,相互调用才能实现。为了降低节点间代码的耦合性,提高单个节点的内聚性,HDFS将这些节点间的调用抽象成不同的接口。
Hadoop RPC接口:HDFS中基于Hadoop RPC框架实现的接口。
三、文件和目录的表示
- 文件:在HDFS中,文件被分割成多个数据块(Block),每个数据块默认大小为128MB(或配置为其他大小,如64MB、256MB等),这些数据块被分布存储在HDFS集群中的不同DataNode上。
- 目录:目录是文件系统的组织单元,用于对文件进行分类和管理。目录本身不存储数据,但包含文件和子目录的元数据。
四、元数据的管理
- NameNode:NameNode是HDFS集群的主节点,负责管理文件系统的命名空间以及客户端对文件的访问。它存储着文件系统的元数据,包括文件名、目录结构、数据块的位置信息等。
- DataNode:DataNode是HDFS集群的工作节点,负责存储数据块。每个DataNode会定期向NameNode报告它所存储的数据块列表,以便NameNode能够跟踪整个文件系统的数据分布。
五、数据块的分布和复制
- 数据块分布:HDFS将数据块分布存储在多个DataNode上,以实现数据的冗余和可靠性。这有助于在单个DataNode出现故障时,仍然能够访问数据。
- 数据块复制:HDFS默认将数据块复制3份,存储在不同的DataNode上。这种复制策略有助于防止数据丢失,提高数据的可用性。用户可以根据需要调整复制因子,以适应不同的存储需求和成本考虑。
六、访问控制
HDFS支持基于文件和目录的访问控制,通过权限设置来限制用户对文件和目录的访问。权限可以分为读(Read)、写(Write)和执行(Execute)三种,用户可以根据需要为不同的文件和目录设置不同的权限。
七、文件操作
- 创建文件:客户端通过NameNode获取文件元信息,然后在DataNode上创建数据块并写入数据。
- 读取文件:客户端通过NameNode获取文件的数据块位置信息,然后从相应的DataNode上读取数据块并组装成完整的文件。
- 删除文件:客户端通过NameNode删除文件的元数据,并从DataNode上删除相应的数据块。
八、特殊目录
- /tmp:临时目录,用于存储临时文件。HDFS会定期清理这个目录下的文件,以避免占用过多的存储空间。
- /user:用户目录,用于存储用户创建的文件和目录。每个用户都有自己的用户目录,路径为
/user/用户名
。
九、HDFS 文件读写流程
1. 写入文件
-
客户端向 NameNode 请求创建文件。
-
NameNode 验证权限后,分配数据块和 DataNode 列表。
-
客户端将数据写入第一个 DataNode,该节点依次复制到其他节点。
-
写入完成后,NameNode 更新元数据。
2. 读取文件
-
客户端向 NameNode 请求文件块的位置。
-
NameNode 返回包含块副本的 DataNode 列表。
-
客户端直接从最近的 DataNode 读取数据。
十、HDFS 路径示例
1. 典型目录结构
/ # 根目录
├── tmp # 临时目录
├── user # 用户目录
│ └── hive # Hive 数据仓库
│ └── warehouse
└── data # 业务数据目录
└── logs # 日志文件
2. 分区目录(常见于大数据场景)
按时间或业务维度分区,提升查询效率:
/user/hive/warehouse/sales
├── pt=2023-10-01
├── pt=2023-10-02
└── pt=2023-10-03