Hadoop 入门笔记四 : 分布式文件HDFS
一. HDFS简介
- HDFS(Hadoop Distributed File System)是 Apache Hadoop 项目的一个子项目,它的设计初衷是为了能够支持高吞吐和超大文件读写操作
- HDFS是一种能够在普通硬件上运行的分布式文件系统,它是高度容错的,适应于具有大数据集的应用程序,它非常适于存储大型数据 (比如 TB 和 PB)
- HDFS使用多台计算机存储文件, 并且提供统一的访问接口, 像是访问一个普通文件系统一样使用分布式文件系统
- Doug Cutting 在做 Lucene 的时候, 需要编写一个爬虫服务, 这个爬虫写的并不顺利, 遇到 了一些问题, 诸如: 如何存储大规模的数据, 如何保证集群的可伸缩性, 如何动态容错等
- 2013年的时候, Google 发布了三篇论文, 被称作为三驾马车, 其中有一篇叫做 GFS
- GFS是描述了 Google 内部的一个叫做 GFS 的分布式大规模文件系统, 具有强大的可伸缩性和容错
- Doug Cutting后来根据 GFS 的论文, 创造了一个新的文件系统, 叫做 HDFS
- HDFS集群由很多的服务器组成,而每一个机器都与可能会出现故障。HDFS为了能够进行故障检测、快速恢复等。
- HDFS主要适合去做批量数据出来,相对于数据请求时的反应时间,HDFS更倾向于保障吞吐量。
- 典型的HDFS中的文件大小是GB到TB,HDFS比较适合存储大文件
- HDFS很多时候是以: Write-One-Read-Many来应用的,一旦在HDFS创建一个文件,写入完后就不需要修改了
1. 适合的应用场景
- 存储非常大的文件:这里非常大指的是几百M、G、或者TB级别,需要高吞吐量,对延时没有要求
- 基于流的数据访问方式: 即一次写入、多次读取,数据集经常从数据源生成或者拷贝一次,然后在其上做很多分析工作 ,且不支持文件的随机修改。
- 正因为如此,HDFS适合用来做大数据分析的底层存储服务,并不适合用来做网盘等应用,因为,修改不方便,延迟大,网络开销大,成本太高。
- 运行于商业硬件上: Hadoop不需要特别贵的机器,可运行于普通廉价机器,可以处节约成本
- 需要高容错性
- 为数据存储提供所需的扩展能力
- 低延时的数据访问不适合采用HDFS。HDFS是为高吞吐数据传输设计的,因此可能牺牲延时
- 大量小文件:小文件的元数据保存在NameNode的内存中, 整个文件系统的文件数量会受限于NameNode的内存大小。 经验而言,一个文件/目录/文件块一般占有150字节的元数据内存空间。如果有100万个文件,每个文件占用1个文件块,则需要大约300M的内存。因此十亿级别的文件数量在现有商用机器上难以支持
- 多方读写,需要任意的文件修改 HDFS采用追加(append-only)的方式写入数据。不支持文件任意offset的修改,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数据仓库中的数据 |
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更好的支持
- 文件系统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 -lshdfs://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 -ls /
4.创建目录规划
- mkdir 命令
格式:
hdfs dfs [-p] -mkdir
作用:以中的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中查看目录
文章图片
- ls命令
hadoop fs -ls URL
作用:类似linux 的ls命令,显示文件列表
hadoop fs -ls /
选项:
- -R 表示递归展示目录的内容
链接:https://pan.baidu.com/s/1dyXj...
提取码:rmh0
我们需要将这些数据集上传到HDFS中。此处,我们需要将这些原始数据集上传到以下目录:
/source/weibo/star/comment_log/20190810_node1.uuicon.cn/
命名方式:/source/{产品线}/{业务线}/{日志名称}/{日期}_{上报日志的机器}。
- put 命令
语法格式:
hdfs dfs -put ...
- 上传微博评论数据
创建对应的文件夹
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]
9. 需求:直接查看HDFS中的文件内容 上面这种方法稍微有点麻烦,每次查看都得先下载,然后再查看。在HDFS中,可以使用-cat命令直接查看。
- cat 命令
将参数所指示的文件内容输出到控制台。
语法格式:
hdfs dfs-catURI [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拷贝命令
将文件拷贝到目标路径中。如果为目录的话,可以将多个文件拷贝到该目录下。
hdfs dfs -cp URI [URI ...]
命令行选项:
- -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数据文件 【Hadoop 入门笔记四 : 分布式文件HDFS】在数据集中有一个caixukun_new.csv数据集,是20190811这一天重新生成的数据。我们需要将这个文件上传到HDFS中。有两种做法:
- 直接将新文件上传到HDFS中20190811文件夹中。
- 将新文件追加到之前的数据文件caixukun.csv中
- appendToFile 命令
追加一个或者多个文件到hdfs指定文件中.也可以从命令行读取输入
语法格式:
hdfs dfs -appendToFile ...
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:选项将从结果计算中排除快照。
- 查看微博数据占用空间大小
- mv 命令
将hdfs上的文件从原路径移动到目标路径(移动之后文件删除),该命令不能跨文件系统hdfs dfs -mv URL
- 移动到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]
更改文件的副本因子。 如果path是目录,则该命令以递归方式更改以path为根的目录树下所有文件的复制因子。
参数:
- -w:标志请求命令等待复制完成。 这可能会花费很长时间。
- -R:标志是为了向后兼容。 没有作用。
2.设置/source/weibo/star/comment_log/ 副本数
hadoop fs -setrep -w 2 /source/weibo/star/comment_log
文章图片
文章图片
推荐阅读
- EffectiveObjective-C2.0|EffectiveObjective-C2.0 笔记 - 第二部分
- Android中的AES加密-下
- 【读书笔记】贝叶斯原理
- 【韩语学习】(韩语随堂笔记整理)
- 【Hadoop踩雷】Mac下安装Hadoop3以及Java版本问题
- 人性的弱点-笔记
- 读书笔记:博登海默法理学|读书笔记:博登海默法理学 —— 正义的探索(1)
- D034+3组苏曼+《写作这回事》读书笔记
- 《自我的追寻》读书笔记3
- 最有效的时间管理工具(赢效率手册和总结笔记)