HDFS是Hadoop体系中最重要的组成部分,主要用于解决海量大数据的存储的问题,是目前应用最广的分布式文件存储系统。
1.HDFS解决传统文件存储的两个问题
- 当数据量越来越大时,会遇到存储的瓶颈,需要扩容
- 由于文件太大,上传和下载都非常耗时
解决:
-
扩容
纵向扩容:增加内存和磁盘
横向扩容:增加服务器的数量 -
分块:大的文件分成多个数据库,并行处理数据
2.HDFS的基本概念
2.1 NameNode(名称节点)
NameNode是HDFS集群的主服务器,通常成为名称节点或者主节点。两大功能
- 负责客户端请求的响应
- 元数据的管理(查询,修改)
NameNode两个重要文件
- fsimage:元数据镜像文件(保存文件系统的目录树)
Fsimage是一个二进制文件,当中记录了HDFS中所有文件和目录的元数据信息 - edits:元数据操作日志(针对目录树的修改操作)
- Namenode会将HDFS的文件和目录元数据存储在一个叫fsimage的二进制文件中,每次保存fsimage之后到下次保存之间的所有hdfs操作,将会记录在editlog文件中,当editlog达到一定的大小(bytes,由fs.checkpoint.size参数定义)或从上次保存过后一定时间段过后(sec,由fs.checkpoint.period参数定义),namenode会重新将内存中对整个HDFS的目录树和文件元数据刷到fsimage文件中。Namenode就是通过这种方式来保证HDFS中元数据信息的安全性。
2.2 Secondary NameNode
Secondary NameNode的职责是合并NameNode的edit logs到fsimage文件中。
它定时到NameNode去获取edit logs,并更新到自己的fsimage上。
一旦它有了新的fsimage文件,它将其拷贝回NameNode中。
NameNode在下次重启时会使用这个新的fsimage文件,从而减少重启的时间
NameNode | Secondary NameNode |
---|---|
客户端请求的响应 元数据的管理 |
不sNameNode节点的热备份 负责edit logs和fsimage的合并 辅助恢复NameNode |
2.3 DataNode
DataNode节点是HDFS集群中的从服务器,通常称为数据节点。Datenode 提供真实文件数据的存储服务。
DataNode响应来自HDFS客户机的读写请求同时它们还响应来自NameNode的创建,删除和复制块的命令。NameNode依赖来自每个DataNode的定期心跳(heartbeat)消息。每条消息都包含一个块报告,NameNode可以根据这个报告验证块映射和其他文件系统元数据。如果DataNode不能发送心跳消息,NameNode将采用修复措施。重新复制在该节点上丢失的块。
文件块(block):最基本的存储单位。对于文件内容而言,一个文件的长度大小size,那么从文件的0偏移开始,按照固定的大小,顺序对文件进行划分并编号,划分好的每一个称一个Block。HDFS默认BIock大小是128MB。
3.HDFS的读写文件流程
3.1 HDFS的读文件流程
3.2 HDFS的写文件流程
4.HDFS的Shell操作
HDFS提供了多种数据访问的方式,其中命令行是最简单的。HDFS Shell包含以下三种:
hadoop fs 参数
hadoop dfs 参数
hdfs dfs 参数
fs涉及到一个通用的文件系统,可以指向任何的文件系统如local file,HDFS等。但是dfs仅是针对HDFS的。
(1)fs是文件系统, dfs是分布式文件系统
(2)fs > dfs
(3)分布式环境情况下,fs与dfs无区别
(4)本地环境中,fs就是本地文件,dfs就不能用了
- hadoop fs: 使用面最广,可以操作任何文件系统。
- hadoop dfs和hdfs dfs:
只能操作HDFS文件系统相关(包括与Local FS间的操作),hadoop dfs已经废弃,被hdfs dfs代替。
4.1 HDFS命令
常用命令
[root@hadoop001 ~]# hdfs dfs
[root@hadoop001 ~]# hdfs dfs -help
命令参数 | 功能描述 |
---|---|
-ls | 查看指定路径下的文件目录 |
-du | 统计目录下所有文件的大小 |
-mv | 移动文件 |
-co | 复制文件 |
-rm | 删除文件或空白文件夹 |
-put | 上传文件 |
-get | 下载文件 |
-text | 将源文件输出为文本格式 |
-moveFromLocal | 从本地移动文件 |
-copyFromLocal | 从本地复制文件 |
-copyToLocal | 从HDFS拷贝到本地 |
-appendToFile | 追加文件 |
-help | 帮助 |
命令帮助
[root@hadoop001 ~]# hdfs dfs -usage ls
Usage: hadoop fs [generic options] -ls [-d] [-h] [-R] [<path> ...]
[root@hadoop001 ~]# hdfs dfs -help ls