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 逐级应答客户端