HDFS简介
HDFS是Hadoop核心组成, 是分布式存储服务
HDFS是分布式文件系统中的一种
HDFS的重要概念
HDFS通过统一的命名空间目录树来定位文件
另外, 它是分布式的, 由很多服务器联合起来实现其功能. 集群中的服务器有各自的角色(分布式本质是拆分, 各司其职)
- 典型的Master/Slave架构
HDFS的架构是典型的Master/Slave结构
HDFS集群往往是一个NameNode+多个DataNode组成NameNode
是集群的主节点,DataNode
是集群的从节点 - 分块存储(block机制)
HDFS中的文件在物理是分块存储(block)的, 块的大小可以通过配置参数来指定
Hadoop2.x版本中默认的block大小是128M - 命名空间(NameSpace)
HDFS支持传统的层次型文件组织结构.
用户或者应用程序可以创建目录, 然后将文件保存在这些目录里.
文件系统命名空间的层次结构和大多数现有的文件系统类似: 用户可以创建, 删除, 移动或重命名文件NameNode
负责维护文件系统的命名空间, 任何对文件系统命名空间或属性的修改都将被NameNode记录下来 - NameNode元数据管理
我们把目录结构及文件分块位置叫做元数据NameNode
的元数据记录每一个文件所对应的block信息(block的id, 以及所在的DataNode节点) - DataNode数据存储
文件的各个block的具体存储管理由DataNode节点来承担
一个block会有多个DataNode来存储, DataNode会定时向NameNode来汇报自己持有的block信息 - 副本机制
为了容错, 文件的所有block都会有副本
每个文件的block大小和副本系数都是可配置的
应用程序可以指定某个文件的副本数目
副本系数可以在文件创建的时候指定, 也可以在之后改变
副本数量默认是3个 - 一次写入, 多次读出
HDFS设计成适应一次写入, 多次读出的场景, 且不支持文件的随机修改 . (支持追加写入, 不支持随机更新)
正因为如此, HDFS适合用来做大数据分析的底层存储, 并不适合用来做网盘等应用 (修改不方便, 延迟大, 网络开销大, 成本太高)
HDFS架构
NameNode
: HDFS集群的管理者, Master- 维护管理HDFS的命名空间(NameSpace)
- 维护副本策略
- 记录文件块(Block)的映射信息
- 负责处理客户端读写请求
DataNode
: NameNode下达命令, DataNode执行实际操作, Slave- 保存实际的数据块
- 负责数据块的读写
Client
: 客户端- 上传文件到HDFS的时候, Client负责将文件切分成Block, 然后进行上传
- 请求NameNode交互, 获取文件的位置信息
- 读取或写入文件, 与DataNode交互
- Client可以使用一些命令来管理HDFS或访问HDFS
HDFS读写解析
HDFS读数据流程
- 客户端通过Distributed FileSystem向NameNode请求下载文件, NameNode通过查询元数据找到文件块所在的DataNode地址
- 挑选一台DataNode(就近原则, 然后随机)服务器, 请求读取数据
- DataNode开始传输数据给客户端 (从磁盘里面读取数据输入流, 以Packet为单位来做校验)
- 客户端以Packet为单位接收, 先在本地缓存, 然后写入目标文件
HDFS写数据流程
- 客户端通过Distributed FileSystem模块向NameNode请求上传文件, NameNode检查目标文件是否已存在, 父目录是否存在
- NameNode返回是否可以上传
- 客户端请求第一个Block上传到哪几个DataNode服务器上
- NameNode返回3个DataNode节点, 分别是dn1, dn2, dn3
- 客户端通过FSDataOutputStream模块请求dn1上传数据, dn1收到请求会继续调用dn2, 然后dn2调用dn3, 将这个通信管道建立完成
- dn1, dn2, dn3逐级应答客户端