1. 概念
HDFS 全称 Hadoop Distribute File System,是⼀个 高可靠、高吞吐的 分布式文件系统
HDFS 作为 Apache Hadoop 三大组件之一,功能面向海量数据存储,其核心是 基于 块机制 和 副本机制 的 数据存储策略
- 核心思想:分治
- 存入原理:数据切割 --> 制作副本 --> 分散储存
- 读取原理:获取位置 --> 分别下载 --> 数据拼接
HDFS 适合 “一次写入,多次读出” 的场合,支持文件的追加写入,不支持文件的随意修改
因此,HDFS 适合为 大数据分析 提供 底层存储服务,而不是适合用来做“网盘”(修改数据不方便、延迟大,网络开销大,成本过高)
若要实现海量数据的快速访问和随机读写,应考虑使用 HBase
1.1 block 块机制
从物理层面讲,数据在 HDFS 上是分块(block)存储的,块的大小可以通过参数进行配置
在 Hadoop 2.x 版本中,默认的 block 大小是 128MB;
1.2 副本机制
HDFS 为所有文件的所有 block 都存储了副本,以实现高可靠性和高容错
除 block 的大小之外,block 的副本个数(也称副本系数)也可以通过参数配置
副本系数可以在创建文件前指定,也支持后续修改
HDFS 默认的 block 副本系数为 3 个
1.3 Master / Slave 架构
HDFS 是典型的 Master / Slave 主从节点结构
一般是由一个NameNode作为集群主节点,多个DataNode作为集群从节点
1.4 NameSpace 命名空间
HDFS 支持传统目录式的层次型文件组织结构,用户和程序可以对目录和文件进行 创建、删除、移动、重命名 等操作
NameNode 负责维护文件系统的命名空间,记录任何对文件系统命名空间(或属性)的修改
HDFS 提供抽象目录树以供访问,访问形式为 hdfs:// NameNode 所在节点的主机名(hostname)
: 端口(port)
/ 目标目录
例如:hdfs://linux111:9000/path//target
2. 结构
NN,2NN,DN 即是角色名称、进程名称,同时也代指电脑节点名称
-
NameNode(NN)
身份:HDFS 集群的管理者,Master 节点
职责:
1. 处理客户端读写请求
2. 存储与维护 HDFS 元数据
1)维护 命名空间:记录 目录结构、文件属性(生成时间、block 数、权限)
2)维护 副本策略:记录 各个文件 block 的副本数
3)维护 映射关系:记录 文件的块信息(尤其是 block 与 DataNode 的映射信息)
-
SecondaryNameNode(2NN)
身份:HDFS 集群的观察者,NameNode 的辅助者
职责:
1. 监控 HDFS 状态
2. 周期性存储元数据快照 -
DataNode(DN)
身份:HDFS 集群的工作者,副本的存储者,数据的操作者,Slave 节点
职责:
1. 存储 block -- 多个副本由不同的 DataNode 存储
2. 读写 block
3. 校验 package
4. 汇报块信息 -- 定时向 NameNode 汇报自己存储的 block 信息 -
Client
身份:客户端
职责:
1. 设置时:发送指令 -- 通过指令对 HDFS 进行设置与管理
2. 上传时:切割文件 -- 上传文件时将其切割成若干个 block
3. 下载时:拼接文件 -- 将分散下载的各个 block 拼接完整
1)寻址:与 NameNode 交互,获取文件位置信息
2)下载:与 DataNode 交互,读取 block
3. 命令
3.1 Shell 命令行指令
格式:bin/hadoop fs
或者 bin/hdfs dfs
+ 具体命令(一般推荐使用后者)
在 Shell 命令行中输入 hdfs dfs
可以查看所有的 HDFS 指令
HDFS 常用的命令行指令有:
-
-help:输出此命令的参数
[root@linux121 hadoop-2.9.2]# hdfs dfs -help rm
-
-mkdir:在 HDFS 上创建目录
[root@linux121 hadoop-2.9.2]# hdfs dfs -mkdir -p /dir/subdir
-
-rmdir:删除空目录
[root@linux121 hadoop-2.9.2]# hdfs dfs -mkdir /test
[root@linux121 hadoop-2.9.2]# hdfs dfs -rmdir /test
-
-ls:显示目录信息
[root@linux121 hadoop-2.9.2]# hdfs dfs -ls /
-
-cp:在 HDFS 上拷贝文件
[root@linux121 hadoop-2.9.2]# hdfs dfs -cp /dir/subdir/hadoop.txt /hdfs.txt
-
-mv:在 HDFS 上移动文件
[root@linux121 hadoop-2.9.2]# hdfs dfs -mv /dir/subdir/hadoop.txt /dir
-
-cat:显示文件内容
[root@linux121 hadoop-2.9.2]# hdfs dfs -cat /dir/subdir/hadoop.txt
-
-appendToFile:追加⼀个文件到已经存在的文件末尾
[root@linux121 hadoop-2.9.2]# hdfs dfs -appendToFile hdfs.txt /dir/subdir/hadoop.txt
-
-tail:显示文件末尾内容
[root@linux121 hadoop-2.9.2]# hdfs dfs -tail /user/root/test/yarn.txt
-
-rm:删除文件或文件夹
[root@linux121 hadoop-2.9.2]# hdfs dfs -rm /user/root/test/yarn.txt
-
-chgrp 、-chmod、-chown:修改文件权限(与Linux文件系统用法一致)
[root@linux121 hadoop-2.9.2]# hdfs dfs -chmod 666 /dir/subdir/hadoop.txt
[root@linux121 hadoop-2.9.2]# hdfs dfs -chown root:root /dir/subdir/hadoop.txt
-
-du:统计文件夹的大小信息
[root@linux121 hadoop-2.9.2]# hdfs dfs -du -s -h /user/root/test
-
-moveFromLocal:从本地剪切粘贴到 HDFS
[root@linux121 hadoop-2.9.2]# hdfs dfs -moveFromLocal ./local/localfile.txt /dir/subdir/
-
-moveToLocal:从 HDFS 剪切粘贴到本地
[root@linux121 hadoop-2.9.2]# hdfs dfs -moveToLocal /dir/subdir/hdfs.txt ./local/
-
-copyFromLocal:从本地文件系统拷贝文件到 HDFS
[root@linux121 hadoop-2.9.2]# hdfs dfs -copyFromLocal ./local/localfile2.txt /dir/subdir/
-
-copyToLocal:从 HDFS 拷贝文件到本地
[root@linux121 hadoop-2.9.2]# hdfs dfs -copyToLocal /dir/subdir/hdfs2.txt ./local/
-
-put:等同于 copyFromLocal
[root@linux121 hadoop-2.9.2]# hdfs dfs -put ./local/localfile3.txt /dir/subdir/
-
-get:等同于 copyToLocal
[root@linux121 hadoop-2.9.2]# hdfs dfs -get /dir/subdir/hdfs3.txt ./local/
-
-setrep:设置 HDFS 文件的副本系数
[root@linux121 hadoop-2.9.2]# hdfs dfs -setrep 10 /dir/subdir/hadoop.txt
这里需要注意的是:副本系数 > DataNode 节点数是无意义的,因为多个副本在同一个 DataNode 节点上是无意义的
3.2 Java API
=== 待续 ===
4. 读写原理
4.1 HDFS 读数据流程
假设:客户端 Client-121 想要下载 HDFS 上的文件 hdfs.txt
该文件大小为 300M,有3个 block(300M ÷ 128M = 2),分别为 blk_1、blk_2、blk_3
每个 block 有3个 replication: rep_1、rep_2、rep_3,分别存在 DN-121、DN-122、DN-123 上
数据读取流程:
-
Client-121 通过 DistributedFileSystem 向 NameNode 请求下载 hdfs.txt 的 blk_1
-
NN 查询元数据中的 block-DN 映射关系,找到所有存放了 blk_1 副本的 DataNode(这里为3个)
-
NN 根据就近原则,挑出与 Client-121 距离最近的 DN-121,将其地址返回给 Client-121
注意:就近原则是为了尽可能减小数据传输成本,如果 DN-121 宕机了,NN 会随机从 DN-122 和 DN-123 中挑选一个返回给 Client -
Client-121 通过 FSDataInputStream 向 DN-121 发送请求,申请读取 rep_1
-
DN-121 从磁盘读取数据输入流,传输数据给 Client-121
DataNode 的核心功能:维护 磁盘与客户端 之间以 Package 为单位的数据传输流
维护方法:传输校验,每传输完一个 Package 进行一次,从而监控传输状态
Package 的默认大小为 64KB -
Client-121 以 Package 为单位接收数据,先写入本地缓存,再写入本地目标文件
4.2 HDFS 写数据流程
- 客户端将向 NN 请求写入整个文件
- NN 判断:父目录是否存在 ?(文件是否已经存在 ?不可写:可写) :不可写
- 拿到 NN 的可写响应后,客户端将文件切割成 block,再次向 NN 请求写入单个 blk_1,询问 blk_1 写入哪几个 DN
- 拿到 DN 地址队列后,Client 通过 FSOutputStream 向队首的 DN-1 发送请求,申请写入 blk_1
- DN-1 出队后继续调用队首的 DN-2,DN-2 继续调用 DN-3 ... 直至整个通道打通(队列为空)
- DN-1、DN-2、DN-3 逐级向客户端返回响应,表明自己处于就绪状态
- Client 确定所有 DN 都就绪之后,以 Pakage 为单位向 DN-1 传输 blk_1
- DN-1 接收到 Package 后将其传给下一个 DN,DN-1上维护一个确认队列,每传出一个 Pakage 就将其入队
- 当一个 Package 在所有 DN 上都传输完毕后,DN-1 上的确认队列将该 Package 出队
- Client 监控 DN-1 的确认队列,当队列为空时说明 blk_1 传输完毕
- 重复第 3-10 步,继续上传 blk_2
网友评论