一. 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 /dir1hdfs dfs -mkdir /dir2hdfs 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