什么是 HDFS ?
全称 Hadoop Distributed File System,中文翻译过来就是 分布式文件系统。那么,何为分布式文件系统呢?可以参考下图。
这是依靠我自己的理解画出的 HDFS 的架构。从图中可以看到 HDFS 本身的一些特性:
首先分布式文件系统不是由一台服务器实现的,而是多台服务器。比如 node 01/ node 02/ node 03/ 三台服务器的空间都是 1T,那么 HDFS 的容量就有 3T。这一特性最大的意义就是扩容方便且成本低。
其次可以看出 HDFS 架构的主要角色、副本机制和分块存储机制。
主要角色
角色 | 作用 |
---|---|
NameNode | 存储管理 HDFS 文件的元数据信息(比如文件名称、大小、位置等) |
DataNode | 就是真正存储数据的地方 |
SecondaryNameNode | 帮助 NameNode 管理元数据信息 |
SecondaryNameNode 是如何帮助 NameNode 管理元数据信息的
首先,我们知道 NameNode 是用来存储 HDFS 的元数据信息,而元数据信息就存储在 fsimage文件 中,也即 NameNode 启动时对整个文件的快照。而除了 fsimage 文件外,每次 HDFS 进行的写操作都会由 NameNode 记录到 edit logs 文件中,但由于不断写入,edit logs 文件也会越来越来,NameNode 只有重新启动时才会将 edit logs 文件和 fsimage 文件合并到一起,而实际工作环境中 NameNode 一般是不会轻易重新启动的。所以 SecondaryNameNode 就是来解决上述问题的,它的主要目的就是为 NameNode 提供一个 checkpoint ,每当 edit logs 文件大小达到一个临界值(默认64MB)或者间隔达到一定时间(默认1小时)时,SecondaryNameNode 就会触发 checkpoint 操作,这时 NameNode 会产生一个新的 edit logs 文件(在 NameNode 元数据出现改动前,这是一个空文件),而 SecondaryNameNode 会将达到阈值的 edit logs 文件和原本的 fsimage 文件复制到本地,并将 fsimage 文件加载到内存中,与达到阈值的 edit logs 文件进行合并,形成一个新的 fsimage 文件,SecondaryNameNode 再将新生成的 fsimage 文件发送到 NameNode,等待下一次触发 Checkpoint 操作。
分块存储机制
真正要实现分布式系统,分块存储是关键之一。因为可以假想一种业务场景,我们拥有 100 台硬盘空间为 1T 的服务器,虽然HDFS 大小为 100T,但现在如果我要存储一个 2T 的文件,如果不进行分块,没有一台服务器是能单独存的下这个文件的,所以分块存储是必要的。
现在 HDFS 默认的每一个 block 块大小为 128M。
副本机制
主要用来应对 block 块丢失时的情况,可以通过修改配置文件 hdfs-site.xml
配置副本数量
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
读写文件流程
读取文件流程图
写入文件流程图
常用命令
基础命令使用
前缀 | 命令 | 说明 |
---|---|---|
hadoop fs 或者 hdfs dfs | -ls /dirName | 查看目录内容 |
-ls -R /dirName | 递归查看目录内容(将目录中的所有的内容都呈现出来) | |
-mkdir /dirName | 创建目录 | |
-mkdir -p /dirName1/dirName2 | 创建多级目录 | |
-mv /FileName1 /FileName2 | 重命名(目录也适用) | |
-mv /FilePath dst | 移动文件或目录 | |
-put localSrc dst | 将本地内容复制到HDFS上 | |
-cat URI | 查看HDFS文件内容 | |
-cp URI dst | 将HDFS上的某个文件复制到HDFS指定文件 | |
-rm URI | 删除HDFS上的指定文件 | |
-rm -rf URI | 强制删除HDFS上的指定文件 | |
-chmod mode URI | 修改HDFS上指定文件的权限 | |
-chmod -R mode URI | 递归地修改HDFS上指定文件的权限 | |
-chown owner:grouper URI | 修改HDFS上指定文件的所属用户和所属组 | |
-chown owner:grouper URI | 递归地修改HDFS上指定文件的所属用户和所属组 | |
-expunge | 清空回收站 |
高级命令使用
前缀 | 命令 | 说明 |
---|---|---|
hdfs dfsadmin | -setQuota [quota] [dirname] | 给该文件夹设置上传文件数量限制 (文件限额数包括用户文件夹本身,也就是限额两个只能上传一个文件) |
-clrQuota [dirname]] | 清除文件数量限制 | |
-setSpaceQuota [quota] [dirname] | 给该文件夹设置上传文件空间大小限制 | |
-clrSpaceQuota [dirname] | 清除空间限额 | |
-safemode | 手动启动安全模式 |