一. HDFS 简介
- HDFS(Hadoop Distributed File System)是 Apache Hadoop 我的项目的一个子项目,它的设计初衷是为了可能 反对高吞吐和超大文件读写操作
- HDFS 是一种可能在一般硬件上运行的分布式文件系统,它是 高度容错 的,适应于具备大数据集的应用程序,它十分 适于存储大型数据 (比方 TB 和 PB)
- HDFS 应用多台计算机存储文件, 并且提供对立的拜访接口, 像是拜访一个一般文件系统一样应用分布式文件系统
二. HDFS 倒退历史
- Doug Cutting 在做 Lucene 的时候, 须要编写一个爬虫服务, 这个爬虫写的并不顺利, 遇到 了一些问题, 诸如: 如何存储大规模的数据, 如何保障集群的可伸缩性, 如何动静容错等
- 2013 年的时候, Google 公布了三篇论文, 被称作为三驾马车, 其中有一篇叫做 GFS
- GFS 是形容了 Google 外部的一个叫做 GFS 的分布式大规模文件系统, 具备弱小的可伸缩性和容错
- Doug Cutting 起初依据 GFS 的论文, 发明了一个新的文件系统, 叫做 HDFS
三.HDFS 设计指标
- HDFS 集群由很多的服务器组成,而每一个机器都与可能会呈现故障。HDFS 为了可能进行故障检测、疾速复原等。
- HDFS 次要适宜去做批量数据进去,绝对于数据申请时的反应时间,HDFS 更偏向于保障吞吐量。
- 典型的 HDFS 中的文件大小是 GB 到 TB,HDFS 比拟适宜存储大文件
- HDFS 很多时候是以:Write-One-Read-Many 来利用的,一旦在 HDFS 创立一个文件,写入完后就不须要批改了
四.HDFS 利用场景
1. 适宜的利用场景
- 存储十分大的文件:这里十分大指的是几百 M、G、或者 TB 级别,须要高吞吐量,对延时没有要求
- 基于流的数据拜访形式: 即一次写入、屡次读取,数据集常常从数据源生成或者拷贝一次,而后在其上做很多剖析工作,且不反对文件的随机批改。
- 正因为如此,HDFS 适宜用来做大数据分析的底层存储服务,并不适宜用来做网盘等利用,因为,批改不不便,提早大,网络开销大,老本太高。
- 运行于商业硬件上: Hadoop 不须要特地贵的机器,可运行于一般便宜机器,能够处节约老本
- 须要高容错性
- 为数据存储提供所需的扩大能力
2. 不适宜的利用场景
- 低延时的数据拜访 不适宜采纳 HDFS。HDFS 是为高吞吐数据传输设计的, 因而可能就义延时
- 大量小文件: 小文件的元数据保留在 NameNode 的内存中,整个文件系统的文件数量会受限于 NameNode 的内存大小。教训而言,一个文件 / 目录 / 文件块个别占有 150 字节的元数据内存空间。如果有 100 万个文件,每个文件占用 1 个文件块,则须要大概 300M 的内存。因而十亿级别的文件数量在现有商用机器上难以反对
- 多方读写,须要任意的文件批改 HDFS 采纳追加(append-only)的形式写入数据。不反对文件任意 offset 的批改,HDFS 适宜用来做大数据分析的底层存储服务,并不适宜用来做. 网盘等利用,因为,批改不不便,提早大,网络开销大,老本太高。
五.HDFS 重要个性
1. 主从架构
HDFS 采纳 master/slave 架构。个别一个 HDFS 集群是有一个 Namenode 和肯定数目的 Datanode 组成。Namenode 是 HDFS 主节点,Datanode 是 HDFS 从节点,两种角色各司其职,独特协调实现分布式的文件存储服务。
2. 分块机制
HDFS 中的文件在物理上是分块存储(block)的,块的大小能够通过配置参数来规定,参数位于 hdfs-default.xml 中:dfs.blocksize。默认大小是 128M(134217728)
3. 正本机制
为了容错,文件的 所有 block 都会有正本 。每个 文件的 block 大小(dfs.blocksize)和正本系数(dfs.replication)都是可配置的 。应用程序能够指定某个文件的正本数目。正本系数能够在文件创建的时候指定,也能够在之后通过命令扭转。
默认 dfs.replication 的值是 3,也就是会额定再复制 2 份,连同自身总共 3 份正本。
4.Namespace
HDFS 反对传统的档次型文件组织构造 。用户能够创立目录,而后将文件保留在这些目录里。文件系统名字空间的层次结构和大多数现有的文件系统相似:用户能够创立、删除、挪动或重命名文件。
Namenode 负责保护文件系统的 namespace 名称空间,任何对文件系统名称空间或属性的批改都将被 Namenode 记录下来。
HDFS 会给客户端提供一个 对立的形象目录树,客户端通过门路来拜访文件,形如:hdfs://namenode:port/dir-a/dir-b/dir-c/file.data。
5. 元数据管理
在 HDFS 中,Namenode 治理的元数据具备 两种类型:
- 文件本身属性信息
文件名称、权限,批改工夫,文件大小,复制因子,数据块大小。 -
文件块地位映射信息
记录文件和 DataNode 之间的映射信息, 即哪个块位于哪个节点上6. 数据块存储
文件的各个block 的具体存储管理由 DataNode 节点承当。每一个 block 都能够在多个 DataNode 上存储。
六. 微博 HDFS 案例
1. 背景
微博有大量的用户数据,为了剖析微博用户的行为。咱们能够将微博的数据上传到 HDFS,而后供其余大规模文本、情感分析程序来解决。
2. HDFS 目录布局
以后咱们的 HDFS 集群中应该是空洞无物。因为咱们并没有做任何的文件操作。为了不便咱们未来治理文件系统,咱们也对 HDFS 须要有一个目录布局,就像 Linux 一样。
目录 | 阐明 |
---|---|
/source | 用于存储原始采集数据 |
/common | 用于存储公共数据集, 例如:IP 库, 省份信息等 |
/workspace | 工作空间, 存储各团队计算出来的后果数据 |
/tem | 存储长期数据, 须要定时清理 |
/warehouse | 存储 hive 数据仓库中的数据 |
3. HDFS 操作 -shell 客户端
HDFS 是存取数据的分布式文件系统,那么对 HDFS 的操作,就是文件系统的基本操作,比方文件的创立、批改、删除、批改权限等,文件夹的创立、删除、重命名等。对 HDFS 的操作命令相似于 Linux 的 shell 对文件的操作,如 ls、mkdir、rm 等。
1. 语法格局
Hadoop 提供了文件系统的 shell 命令行客户端,应用办法如下:
Usage: hdfs [SHELL_OPTIONS] COMMAND [GENERIC_OPTIONS] [COMMAND_OPTIONS]
选项:
COMMAND_OPTIONS | Description |
---|---|
SHELL_OPTIONS | 常见的 shell 选项,例如:操作文件系统、治理 hdfs 集群 |
GENERIC_OPTIONS | 多个命令反对的公共选项 |
COMMAND COMMAND_OPTIONS | 用户命令、或者是治理命令 |
示例
# 查看 HDFS 中 /parent/child 目录下的文件或者文件夹
hdfs dfs -ls /parent/child
- 所有 HDFS 命令都能够通过 bin/hdfs 脚本执行
- 还有一个 hadoop 命令也能够执行文件系统操作,还能够用来提交作业,此处咱们均应用 hdfs,为了更好地区分和对 hdfs 更好的反对
2. 阐明
- 文件系统 shell 包含与 Hadoop 分布式文件系统(HDFS)以及 Hadoop 反对的其余文件系统(如本地 FS,HFTP FS,S3 FS 等)间接交互的各种相似 shell 的命令
- 所有 FS shell 命令都将门路 URI 作为参数。URI 格局为 scheme://authority/path。对于 HDFS,该 scheme 是 hdfs,对于本地 FS,该 scheme 是 file。scheme 和 authority 是可选的。如果未指定,则应用配置中指定的默认计划
命令示例:
# 查看指定目录下的文件
hdfs dfs -ls hdfs://namenode:host/parent/child
# hdfs-site.xml 中的 fs.defaultFS 中有配置
hdfs dfs -ls /parent/child
hdfs dfs -ls / #查看根目录文件
3. hadoop dfs / hdfs dfs / hadoop fs 三者的区别
- hadoop dfs 只能操作 HDFS 文件系统(包含与 Local FS 间的操作), 曾经 Deprecated
- HDFS dfs 只能操作 HDFS 文件系统相干, 罕用
- hadoop fs 可操作任意文件系统, 不仅仅是 HDFS 文件系统, 应用范畴更广
官网举荐应用 hadoop fs
例如:
查看文件根目录
hadoop fs -ls /
4. 创立目录布局
-
mkdir 命令
格局:hdfs dfs [-p] -mkdir <paths>
作用: 以 <paths> 中的 URI 作为参数,创立目录。应用 - p 参数能够递归创立目录
hdfs dfs -mkdir /dir1
hdfs dfs -mkdir /dir2
hdfs dfs -p -mkdir /aaa/bbb/ccc
- 创立布局目录
[root@node1 ~]# hdfs dfs -mkdir /common
[root@node1 ~]# hdfs dfs -mkdir /workspace
[root@node1 ~]# hdfs dfs -mkdir /tmp/
[root@node1 ~]# hdfs dfs -mkdir /warehouse
[root@node1 ~]# hdfs dfs -mkdir /source
- 在 WebUI 中查看目录
5. 需要: 应用命令查看 HDFS 中的目录
- ls 命令
格局:
hadoop fs -ls URL
作用: 相似 linux 的 ls 命令, 显示文件列表
hadoop fs -ls /
选项:
- -R 示意递归展现目录的内容
6. 需要: 上传微博评论数据到 HDFS
数据集:
链接:https://pan.baidu.com/s/1dyXj…
提取码:rmh0
咱们须要将这些数据集上传到 HDFS 中。此处,咱们须要将这些原始数据集上传到以下目录:
/source/weibo/star/comment_log/20190810_node1.uuicon.cn/
命名形式:/source/{产品线}/{业务线}/{日志名称}/{日期}_{上报日志的机器}。
- put 命令
-put 参数能够将单个源文件 或者多个源文件 从本地文件拷贝到指标文件系统中, 也能够从规范输出中输出, 写入指标文件系统中
语法格局:
hdfs dfs -put <localsrc > ... <dst>
- 上传微博评论数据
创立对应的文件夹
hdfs dfs -mkdir -p /source/weibo/star/comment_log/20190810_node1.uuicon.cn/
上传文件:
先将文件上传到 linux 中, 在应用 -put 上传文件到 hdfs
hadoop fs -put caixukun.csv /source/weibo/star/comment_log/20190810_node1.itcast.cn/
7. 要求上传后把 linux 本地文件主动删除
数据一旦上传到 HDFS 中后,就会始终保留下来,为了节俭空间,能够把 Linux 本地的文件删除了。咱们只须要执行 rm -f caixukun.csv 即可。但咱们想将来让 HDFS 上传后就 主动删除该文件,咱们能够应用 moveFromLocal 命令。
hadoop fs -moveFromLocal caixukun.csv /source/weibo/star/comment_log/20190810_node1.itcast.cn
8. 需要: 查看 HDFS 文件内容
要查看 HDFS 上的内容,有一种方法,咱们能够先从 HDFS 将文件下载到 Linux,而后咱们用 less 命令、或者 cat 命令就能够查看了
操作步骤如下:
- 应用 get 命令,从 HDFS 下载文件到 Linux
- 应用 less 命令,在 Linux 上查看下载的文件
- -get
将文件拷贝到本地文件系统,能够通过指定 -ignorecrc 选项拷贝 CRC 校验失败的文件。-crc 选项示意获取文件以及 CRC 校验文件。
语法格局:
hdfs dfs -get [-ignorecrc] [-crc] <src> <localdst>
9. 需要: 间接查看 HDFS 中的文件内容
下面这种办法略微有点麻烦,每次查看都得先下载,而后再查看。在 HDFS 中,能够应用 -cat 命令间接查看。
-
cat 命令
将参数所批示的文件内容输入到控制台。
语法格局:hdfs dfs -cat URI [uri ...]
- 查看 hdfs 文件
hadoop fs -cat /source/weibo/star/comment_log/20190810_node1.itcast.cn/caixukun.csv
- head 命令
显示要输入的文件的结尾的 1KB 数据
语法格局:
hadoop fs -head URL
4.tail 命令
显示文件结尾的 1kb 数据。
语法格局:
hdfs dfs -tail [-f] URI
与 Linux 中一样,- f 选项示意数据只有有变动也会输入到控制台
10. 需要: 拷贝一份数据到 20190811 目录
假如当初须要开始剖析 20190811 这一天的用户行为信息。但剖析的同时,咱们须要也一并把上一天的数据加载进来。所以,此处咱们须要将 20190810 这一天的数据,拷贝到 20190811 这一天的数据。
咱们首先须要把 20190811 这一天的目录创立进去,而后能够开始拷贝了。
- cp 拷贝命令
将文件拷贝到指标门路中。如果 <dest> 为目录的话,能够将多个文件拷贝到该目录下。
语法格局:
hdfs dfs -cp URI [URI …] <dest>
命令行选项:
- -f 选项 如果指标存在将笼罩指标
- -p 选项 将保留文件属性
- 执行拷贝数据到新的目录
# 创立文件夹
hadoop fs -mkdir /source/weibo/star/comment_log/20190811_node1.itcast.cn
# 拷贝文件夹
hadoop fs -cp /source/weibo/star/comment_log/20190810_node1.itcast.cn/caixukun.cvs /source/weibo/star/comment_log/20190811_node1.itcast.cn
11. 需要: 追加数据到 HDFS 数据文件
在数据集中有一个 caixukun_new.csv 数据集,是 20190811 这一天从新生成的数据。咱们须要将这个文件上传到 HDFS 中。有两种做法:
- 间接将新文件上传到 HDFS 中 20190811 文件夹中。
- 将新文件追加到之前的数据文件 caixukun.csv 中
应用第二种计划。HDFS 设计的初衷就是存储超大型的文件,文件数量越少,也能够减小 HDFS 中的 NameNode 压力。
- appendToFile 命令
追加一个或者多个文件到 hdfs 指定文件中. 也能够从命令行读取输出
语法格局:
hdfs dfs -appendToFile <localsrc> ... <dst>
2. 追加文件到 HDFS 已有文件中
查看追加前大小:
hadoop fs -ls -h /source/weibo/star/comment_log/20190811_node1.itcast.cn/
追加文件:
hadoop fs -appendToFile caixukun_new.csv /source/weibo/star/comment_log/20190811_node1.itcast.cn/caixukun.csv
查看追加文件后的文件大小:
hadoop fs -ls -h /source/weibo/star/comment_log/20190811_node1.itcast.cn/
12. 需要: 查看以后 HDFS 磁盘空间
每一天微博都会产生很多的数据,咱们十分有必要定期检查 HDFS 的整体磁盘空间,如果发现磁盘空间曾经达到某个阈值,就须要新增新的 DataNode 节点了
-
df 命令
df 命令用来查看 HDFS 闲暇的空间hdfs dfs -df [-h] URI [URI ...]
2. 查看 HDFS 磁盘应用状况
hadoop fs -df -h /
13. 需要: 查看微博数据占用的空间
咱们想晓得以后微博数据占用了多少空间。能够应用 du 命令。
- du 命令
显示目录中所有文件大小,当只指定一个文件时,显示此文件的大小。
语法格局:
hdfs dfs -du [-s] [-h] [-v] [-x] URI [URI ...]
命令选项:
- -s:示意 显示文件长度的汇总摘要,而不是单个文件的摘要。
- -h:选项将以“人类可读”的形式格式化文件大小
- -v:选项将 列名显示为题目行。
- -x:选项将 从后果计算中排除快照。
- 查看微博数据占用空间大小
14. 需要: 将 20190810 的数据挪动到 temp 目录
经分析程序检测,20190810 这一天的数据外面存在大量垃圾数据,项目组决定,先将这些垃圾数据处理了,再放回到 20190810 目录中。首先须要将数据挪动到 tmp 目录中,进行解决
- mv 命令
将 hdfs 上的文件从原门路挪动到指标门路(挪动之后文件删除),该命令不能跨文件系统hdfs dfs -mv URL <dest>
- 挪动到 tem 目录
hadoop fs -mv /source/weibo/star/comment_log/20190811_node1.itcast.cn/caixukun.csv /tmp/caixukun_dirtydata.csv
15. 需要: 缩小正本数晋升存储资源利用率
HDFS 中默认每个 block 会保留三个正本,同样一份数据须要存 3 份。假如,此处咱们须要将 /source/weibo/start/comment_log/20190811_node1.itcast.cn 因为曾经过来了很久,咱们对该目录下的文件容错要求较低、而且数据应用频率也较低,所以,咱们能够将它的正本数调整为 2,此时咱们须要应用 setrep 命令。
- setrep 命令
hdfs dfs -setrep [-R] [-w] <numReplicas> <path>
更改文件的正本因子。如果 path 是目录,则该命令以递归形式更改以 path 为根的目录树下所有文件的复制因子 。
参数:
- -w:标记申请命令期待复制实现。这可能会破费很长时间。
- -R:标记是为了向后兼容。没有作用。
2. 设置 /source/weibo/star/comment_log/ 正本数
hadoop fs -setrep -w 2 /source/weibo/star/comment_log