HDFS
HDFS
KNOWUHDFS的基本介绍
- HDFS: 分布式文件存储系统
- 目的: 存储海量数据
- 分布式文件存储过程:
HDFS的应用场景:
- 存储非常大的文件(GB TB PB), 适合于做批量化高吞吐的业务
- 一次写入、多次读取 : 对数据没有修改的要求, 但是需要多次读取, HDFS不支持随机修改文件中数据
- 思考, 什么数据一般不需要修改的? 过去已经既定发生过数据
- 在有限成本下, 存储更多数据
- 需要高容错性: 数据不能给丢失了
- 需要具备扩展能力
HDFS不适用场景:
- 需要进行随机修改的场景
- 需要交互式强场景
- 存储大量的小文件场景
HDFS的架构及核心概念
1 | 注意: |
副本的机架感知原理, 以及网络拓扑机制
1
2
3
4说明:
第一副本:优先放置到离写入客户端最近的DataNode节点,如果上传节点就是DataNode,则直接上传到该节点,如果是集群外提交,则随机挑选一台磁盘不太满,CPU不太忙的节点。
第二个副本:放置在另一个机架中, 某一个服务器中
第三个副本:放置在与第二个同机架的不同机器中
HDFS的原理
namenode是如何存储元数据的流程
SNN辅助节点流程方案
从整个流程中 可以发现, SNN在对namenode元数据进行冷备份(备份前一个小时的元数据或者前一个edits达到64M的数据), 在一些特殊场景下, 可以基于SNN进行元数据的恢复工作, 此种操作, 可能无法恢复全部的数据, 但是也可以恢复到1个小时以前(或者…)的数据
HDFS的数据写入的流程
HDFS的数据读取流程
HDFS相关的shell操作:
1 | 一、简介 |
- HDFS的操作命令基本格式:
1 | hadoop fs <args>: 通用文件系统操作 既可以操作HDFS文件系统, 也可以操作本地文件系统, 默认操作hdfs文件系统 |
常用命令介绍:
- ls
- 作用: 查看某一个路径的目录结构
1
2
3
4
5
6格式:
hdfs dfs -ls [-R] 路径
参数说明:
-R : 是否递归获取某个目录所有子目录内容
案例:
hdfs dfs -ls /- mkdir
- 作用: 创建目录
1
2
3
4
5
6格式:
hdfs dfs -mkdir [-p] 路径
参数说明:
-p : 创建多级目录时 需要添加
案例:
hdfs dfs -mkdir -p /aaa/bbb/ccc- put
- 作用: 用于上传文件
1
2
3
4
5
6格式:
hdfs dfs -put srcLocalFilePath hdfsDirPath
案例:
hdfs dfs -put jdk-8u241-linux-x64.tar.gz /aaa/bbb/ccc- moveFromLocal
- 作用: 将本地文件系统的文件移动到HDFS中
1
2
3
4
5格式:
hdfs dfs -moveFromLocal srcLocalFilePath hdfsDirPath
案例:
hadoop fs -moveFromLocal jdk-8u241-linux-x64.tar.gz /aaa/bbb- moveToLocal
- 作用: 将HDFS的文件系统文件数据移动到本地文件系统
1
2
3
4格式:
hdfs dfs -moveToLocal hdfsFilePath srcLocalDirPath
案例:
此命令未实现- get
- 作用: 从HDFS中下载数据到本地文件系统
1
2
3
4
5
6
7格式:
hdfs dfs -get hdfsFilePath srcLocalDirPath
案例:
hadoop fs -get /aaa/bbb/jdk-8u241-linux-x64.tar.gz ~
注意: 此操作下载后, 在HDFS中, 依然存在, 相当于是读取数据操作- getmerge
- 作用: 合并下载
1
2
3
4
5格式:
hdfs dfs -getmerge hdfsFilePath1 hdfsFilePath2 ... srcLocalFilePath
案例:
hdfs dfs -getmerge /aaa/bbb/jdk-8u241-linux-x64.tar.gz /aaa/bbb/ccc/jdk-8u241-linux-x64.tar.gz ~/jdk_merge.gz- mv
- 作用: 在hdfs中 从一个目录移动到另一个目录, 或者进行重命名操作
1
2
3
4
5
6格式:
hdfs dfs -mv srchdfsFilePath disthdfsFilePath
案例:
hdfs dfs -mv /aaa/bbb/ccc/jdk-8u241-linux-x64.tar.gz /
注意: 此处移动是在hdfs内部进行数据移动- rm
- 作用: 删除HDFS中数据
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15格式:
hdfs dfs -rm [-r -f -skipTrash] 删除的hdfs的文件路径或者目录路径
参数说明:
-r: 表示是否递归删除(删除目录需要携带)
-f: 强制删除
-skipTrash: 跳过垃圾桶 (一般不使用)
案例:
hdfs dfs -rm /jdk.gz
注意:
默认情况下, 删除数据, 本质上将其移动到垃圾桶
hdfs的垃圾桶, 默认情况 到达7天后, 自动删除过期数据
在生产中, 建议不要跳过垃圾桶, 将删除数据放置到回收站, 给自己一次反悔机会- cat
- 作用: 查看某个文件的内容
1
2
3
4
5
6格式 :
hdfs dfs -cat hdfsFilePath
案例:
hdfs dfs -cat /aaa.txt
注意: 此操作只适合查看小文件的数据- du
- 作用: 查看目录或者文件的大小
1
2
3
4
5
6格式:
hdfs dfs -du [-h] hdfsFilePath|hdfsDirPath
参数说明:
-h : 表示友好展示文件大小
案例:
hdfs dfs -du /jdk-8u241-linux-x64.tar.gz- chmod
- 作用: 设置权限
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15格式:
hdfs dfs -chmod 权限编号(3位) hdfsPath
权限 4 2 1法则:
4: 可读
2: 可写
1: 可执行
案例:
hdfs dfs -chmod 755 /jdk.gz
描述: 所属用户为可读可写可执行, 其他所有的用户可读可执行权限
注意:
在hdfs中, 由于我们在hdfs-site.xml中将hdfs的权限已经关闭了, 所以不管设置任何权限, 都没有用
对于root而言, 即使开启了权限设置, 对这个用户也是无效的
在HDFS中, 权限管理只能防止好人做错事, 而不能防止坏人做坏事- chown
- 作用: 设置所属用户和所属用户组
1
2
3
4
5
6
7格式:
hdfs dfs -chown [-R] 所属用户:所属组 路径
参数说明:
-R : 表示是否递归设置所属用户和所属组
案例:
hdfs dfs -chown itcast:itcast /aaa.txt- appendToFile
- 作用: 追加数据到hdfs的某一个文件中 (修改文件数据)
1
2
3
4
5格式:
hdfs dfs -appendToFile srcLocalFilePath hdfsFilePath
案例:
hdfs dfs -appendToFile bbb.txt /aaa.txt
- hdfs的高级shell命令
hdfs的安全模式
hdfs的安全模式, 是hdfs的保护机制, 当刚刚启动HDFS的时候, 系统会自动的进入安全模式下, 在此模式下, 开始校验副本块是否安全(完整), 如果校验发现都是OK, hdfs会自动离开安全模式(30s), 在运行的过程中, 如果发现块出现问题, 依然会进入安全模式的;
hdfs会自动维护块信息, 当发现某个块副本数量少, 自动新增, 如果发现块的副本变多了, 自动减少的
安全模式的相关的操作:
1
2
3hdfs dfsadmin -safemode get #查看安全模式状态
hdfs dfsadmin -safemode enter #进入安全模式
hdfs dfsadmin -safemode leave #离开安全模式
hdfs的基准测试
hdfs的基准测试, 主要目的就是为了检测刚刚搭建好的HDFS集群, 整体吞吐量是多大
检测方案:
- 向hdfs一次性写入多个文件, 测试其写入时间和写入数据量的比例
1
hadoop jar /export/server/hadoop-2.7.5/share/hadoop/mapreduce/hadoop-mapreduce-client-jobclient-2.7.5.jar TestDFSIO -write -nrFiles 10 -fileSize 10MB
- 从hdfs一次性读取多个文件, 测试其读取时间和读取数据量之间的比例
1
hadoop jar /export/server/hadoop-2.7.5/share/hadoop/mapreduce/hadoop-mapreduce-client-jobclient-2.7.5.jar TestDFSIO -read -nrFiles 10 -fileSize 10MB
- 清空基准测试的数据:
1
hadoop jar /export/server/hadoop-2.7.5/share/hadoop/mapreduce/hadoop-mapreduce-client-jobclient-2.7.5.jar TestDFSIO -clean
注意:
- 在生产中进行检测的时候, 一定要多测试几次, 而且每次测试, 采用不同的文件数量和数据量来测试, 这样测出结果会比较准确一些
服务器与服务器之间数据拷贝操作
服务器之间数据远程拷贝: scp
1 | 方式1:指定用户名,命令执行后需要再输入密码; 从本地拷贝到远程 |
hdfs集群之间数据拷贝
1 | 格式: |
hdfs的归档文件
目的: 用于小文件的合并操作, 从而得到一个更大的文件
场景: 在hdfs中以及存在了大量的小文件, 需要进行合并的场景
通过java代码实现一种小文件合并操作 请问, 此种操作, 有什么弊端吗?
- 重新获取每一个文件不是很方便 2) 合并只能合并同类型的数据
所以说, java合并操作, 比较适合于同类型的文本数据合并操作, 其他的都不适用了
而归档文件, 类似于 windows中压缩方案, 但是规约文件不会进行缩 只会进行压: 归档文件后缀名为 .har
有什么好处呢?
1 | 1) 压在一起后, 依然可以看到里面有那些文件 |
- 如何使用呢?
- 如何构建归档文件
1 | 语法格式: |
- 如何查看合并后的文件
1 | 格式: |
- 如何解压归档文件
1 | 格式: |
注意事项:
1 | 1. Hadoop archives是特殊的档案格式。一个Hadoop archive对应一个文件系统目录。Hadoop archive的扩展名是*.har; |
hdfs的快照机制
hdfs的快照的目的: 对hdfs文件系统进行备份操作
可以对hdfs中某个目录进行快照的拍摄, 注意在拍摄之后, 不会产生任何的内容, 只要当对以及拍摄快照的目录进行修改之后, 记录那些修改的信息即可 —– 差异化快照
- 1 开启指定目录的快照功能 :
- 默认hdfs对目录的快照功能是关闭状态
1 | hdfs dfsadmin -allowSnapshot 路径 |
- 2 禁用指定目录的快照功能(默认就是禁用状态)
1 | hdfs dfsadmin -disallowSnapshot 路径 |
3 给某个路径创建快照snapshot
1
hdfs dfs -createSnapshot 路径
- 指定快照名称进行创建快照snapshot
1 | hdfs dfs -createSanpshot 路径 名称 |
- 5 ) 给快照重新命名
1 | hdfs dfs -renameSnapshot 路径 旧名称 新名称 |
6 列出当前用户所有可快照目录
1
hdfs lsSnapshottableDir
7 比较快照目录中, 两个快照的不同之处
1 | hdfs snapshotDiff 路径 快照1名称 快照2名称 |
8 删除快照snapshot
1
hdfs dfs -deleteSnapshot <path> <snapshotName>
2.4 hdfs的回收站(垃圾桶)
hdfs的回收站默认是禁用状态, 如果需要使用, 手动在core-site.xml中进行开启:
1 | <!-- 开启hdfs的垃圾桶机制,删除掉的数据可以从垃圾桶中回收,单位分钟 --> |
一旦开启了回收站, 当执行shell的操作时候, 就会自动将删除移动到回收站目录下, 回收站默认情况下 7天之后, 自动删除数据, 此时才会将空间进行释放, 回收站出现给与我们反悔机会, 防止出现误删操作
如果使用java api执行delete操作, 直接跳过回收站, 永久删除掉, 如果解决呢?
解决方案: 在java API操作的, 将需要删除的数据直接移动的回收站的目录下 即可
- 清空回收站 (慎用)
1 | hadoop fs -expunge |
hdfs的javaAPI的操作
配置windows下的hadoop环境
- 第一步, 将资料中 hadoop-2.7.5 目录拷贝到一个没有中文没有空格的目录下
- 第二步: 配置环境变量 HADOOP_HOME
- 第三步, 将这个HADOOP_HOME配置到path环境变量中:
- 注意: 配置完, 一定要一顿点确定, 千万不要点取消
- 第四步: 将 hadoop-2.7.5目录下bin目录中 hadoop.dll文件, 放置在 c盘system32目录下
- 配置以上操作 目的, 是为了解决下面的两个问题:
- 第五步: 重启电脑
获取某个路径下所有文件listFiles
1 | // 需求2: 查询某一个目录下所有的文件 |
创建文件夹操作mkdirs
1 | // 需求三: 创建一个文件夹 |
上传文件操作copyFromLocalFile
1 | // 需求四: 上传文件操作 |
下载文件的操作copyToLocalFile
1 | // 需求五: 下载数据操作 |
小文件合并操作
- 第一种实现方式: 推荐使用的, 如果不能用可以采用第二种
1 | // 需求六: 合并小文件操作 |
- 第二种实现方案:
1 | // 需求六: 小文件合并操作: 原生写法 |
文件权限的操作
- 开启HDFS的文件权限
1 | 此配置在 hdfs-site.xml中 |
- 通过代码测试
- 向一个没有权限的目录上传文件操作, 观察是否可以上传, 然后在通过模拟用户的方式来操作
1 | // 需求七: 在 /hsTest01 目录上传一个 c.txt 文件 |

