Hadoop(6) HDFS详解
文章目录
HDFS
HDFS介绍
HDFS的定义
HDFS(Hadoop Distributed File System), 即Hadoop分布式文件系统
HDFS由多台主机搭建服务器集群来实现, 集群中的服务器分别负责不同的功能
HDFS通过目录树来定位文件
HDFS的优缺点
优点
- 采用多副本机制, 如果一个副本丢失, 可以自动恢复, 容错性高
- 适合处理大数据
- 可以构建在廉价的机器上, 随时航向扩展, 通过多副本机制提高可靠性
缺点
- 不适合低延迟访问数据
- 无法高效的对大量小文件进行存储
- 存储大量的小文件会占用大量的NameNode内存
- 小文件的寻址时间会浪费大量的时间, 从而降低效率(一般来说寻址时间<传输时间的 1%比较合适)
- 不支持并发写入和文件的修改
- 一个文件只能单线程写入, 不允许多线程操作
- 仅支持数据的追加, 不支持文件的修改
HDFS的应用场景
HDFS适合一次写入, 多次读取, 并且不支持文件的修改, 适合做数据分析
HDFS的组成
HDFS由NameNode, DataNode, Client和SecondaryNameNode组成, 在
HDFS中, 文件以切块的形式存在, 即一个大文件分成多个部分来存储, 每个块大小为128MB(1.x版本中是64MB)
一个块(block)如果太小, 会增加寻址时间, 如果一个block太大, 会导致MapReduce处理这块数据时会非常慢
注意
HDFS的块大小主要取决与磁盘的传输速率
NameNode 可以理解为结群的主管
- 管理HDFS的名称空间
- 配置副本策略
- 管理数据块的信息(不是数据块)
- 处理客户端的读写请求(只是处理请求, 不处理读写过程)
DataNode 负责具体的任务执行
- 存储实际的数据块
- 执行数据块的读写操作
Client 客户端
-
与NameNode交互, 获取数据块信息
-
与DataNode交互, 负责向DataNode读写数据
-
上传文件时负责文件的切块
-
通过指令管理和操作HDFS
-
SecondaryNameNode
- 只是对NameNode起辅助作用, 注意不是NameNode的热备
配置Hadoop开发环境
由于加使用的操作系统, 开发软件可能都不一样, 就比如我使用的是基于Linux的Deepin15.11桌面版, 开发软件使用的是idea, 相比大多数人使用的是Windows系统下Eclipse开发, 所以操作不太一样
虽然操作不同, 但是配置的思路给大家列举一下, 如果大家不会配置, 就根据下面的步骤百度一下:
- 在开发软件中配置Maven
- 将Hadoop的软件包(zip或者tar.gz)解压到自己的磁盘中, 不能有中文路径
- 配置Hadoop的环境变量
- 配置完之后重启一下电脑
HDFS的Shell命令
注意
1. 在执行命令时, 使用
bin/hadoop fs
和bin/hdfs dfs
的效果是一样的, 这是因为dfs是fs的实现类, 它们底层调用的jar包都是一样的2. HDFS的命令和Linux的命令很像, 如果熟悉Linux指令, HDFS的Shell操作可以很快上手
3. 下面所有的命令演示, 涉及到HDFS文件(夹)的变更, 都可以通过浏览器访问NameNode50070端口查看HDFS的文件系统详情来查看命令执行的结果
- 查看fs的所有命令
hadoop fs
也可以通过下面的指令查看
hadoop fs --help
注意
1. 同样的
hadoop dfs
和hadoop dfs --help
也一样, 下面我们就不把fs
和dfs
一一做列举了, 我们统一使用fs
2. 通过以上指令可以查看HDFS的所有指令, 下面我们只列举最常用的几个指令, 如果大家感兴趣可以把HDFS所有的命令自己测试一遍
HDFS操作
- 查看指定目录的内容
hadoop fs -ls <目录路径>
- 查看文本文件内容
hadoop fs -cat <文件路径>
- 复制
hadoop fs -cp <文件(夹)路径> <拷贝后的文件夹路径>
- 删除
hadoop fs -rm -r <要删除的文件夹路径>
- 查看分区情况
Hadoop fs -df [选项]
选项:
选项 | 说明 |
---|---|
-h | 存储单位以比较友好的方式展现, 说白了就是把单位转换成GB, MB等 |
- 查看文件夹的使用情况
hadoop fs -du [选项] <路径>
选项:
选项 | 说明 |
---|---|
-h | 同df, 存储单位以比较友好的方式展现, 说白了就是把单位转换成GB, MB等 |
- 设置文件副本数量
hadoop fs -setrep <副本数量n> <HDFS中文件路径>
注意
设置的数量一定要小于DataNode的数量, 否则只能创建DataNode个数的副本
- 设置目录权限
hadoop fs -chmod [-R] <权限> <目录>
HDFS上传操作
- 上传文件到HDFS(复制本地文件到HDFS)
hadoop fs -copyFromLocal <本地文件路径> <HDFS文件路径>
或者
hadoop fs -put <本地文件路径> <HDFS文件路径>
注意
-copyFromLocal
和-put
的作用是一样的, 在底层copyFromLocal
其实是put
的一个子类, 但是这个子类什么其他的功能都没有实现, 只是换了一个名字而已
- 剪切本地的文件到HDFS
其实moveFromLocal
与copyFromLocal
唯一的区别就是一个是剪切, 一个是复制
hadoop fs -moveFromLocal <本地文件路径> <HDFS文件路径>
- 追加内容到HDFS中的文件中
hadoop -appendToFile <本地文件路径> <要追加到的文件路径>
HDFS下载操作
- 下载文件(复制HDFS文件到本地)
下载同上传一样, 有两个方法
hadoop fs -copyToLocal <HDFS中的文件路径> <下载到本地的文件路径>
或者
hadoop fs -get <HDFS中的文件路径> <下载到本地的文件路径>
- 下载多个文件到本地, 并合并成一个文件
hadoop fs -getmerge <HDFS中的文件路径1> <HDFS中的文件路径2> ... <HDFS中的文件路径n> <本地合并后的文件路径>
HDFS的API操作
开发软件中开发环境的搭建
-
首先, 新建一个Maven项目(不需要官方模板, 直接新建简单项目即可)
-
然后引入依赖
<dependencies>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>RELEASE</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.8.2</version>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-common</artifactId>
<version>2.7.7</version>
</dependency>