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支持基于文件和目录的访问控制,通过权限设置来限制用户对文件和目录的访问。权限可以分为读(Read)、写(Write)和执行(Execute)三种,用户可以根据需要为不同的文件和目录设置不同的权限。
/user/用户名
。客户端向 NameNode 请求创建文件。
NameNode 验证权限后,分配数据块和 DataNode 列表。
客户端将数据写入第一个 DataNode,该节点依次复制到其他节点。
写入完成后,NameNode 更新元数据。
客户端向 NameNode 请求文件块的位置。
NameNode 返回包含块副本的 DataNode 列表。
客户端直接从最近的 DataNode 读取数据。
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