分布式文件系统HDFS
一、HDFS简介
- HDFS( Hadoop Distributed File System ),意为:Hadoop分布式文件系统。是Apache Hadoop核心组件之一,作为大数据生态圈最底层的分布式存储服务而存在。
- 分布式文件系统解决大数据如何存储问题。分布式意味着是横跨在多台计算机上的存储系统。
- HDFS是一种能够在普通硬件上运行的分布式文件系统,它是高度容错的,适应于具有大数据集的应用程序,它非常适于存储大型数据 (比如 TB 和 PB)。
- HDFS使用多台计算机存储文件, 并且提供统一的访问接口, 像是访问一个普通文件系统一样使用分布式文件系统。
二、HDFS设计目标
- 硬件故障(Hardware Failure)是常态, HDFS可能有成百上千的服务器组成,每一个组件都有可能出现故障。因此故障检测和自动快速恢复是HDFS的核心架构目标。
- HDFS上的应用主要是以流式读取数据(Streaming Data Access)。HDFS被设计成用于批处理,而不是用户交互式的。相较于数据访问的反应时间,更注重数据访问的高吞吐量。
- 典型的HDFS文件大小是GB到TB的级别。所以,HDFS被调整成支持大文件(Large Data Sets)。它应该提供很高的聚合数据带宽,一个集群中支持数百个节点,一个集群中还应该支持千万级别的文件。
- 大部分HDFS应用对文件要求的是write-one-read-many访问模型。一个文件一旦创建、写入、关闭之后就不需要修改了。这一假设简化了数据一致性问题,使高吞吐量的数据访问成为可能。
- 移动计算的代价比之移动数据的代价低。一个应用请求的计算,离它操作的数据越近就越高效。将计算移动到数据附近,比之将数据移动到应用所在显然更好。
- HDFS被设计为可从一个平台轻松移植到另一个平台。这有助于将HDFS广泛用作大量应用程序的首选平台。
三、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 Shell CLI客户端
- 命令行界面(英语:command-line interface,缩写:CLI)是指用户通过键盘输入指令,计算机接收到指令后,予以执行一种人际交互方式。
- Hadoop提供了文件系统的shell命令行客户端,使用方法如下:
hdfs [OPTIONS] SUBCOMMAND [SUBCOMMAND OPTIONS]
SUBCOMMAND:Admin Commands、Client Commands、Daemon Commands。
- 跟文件系统读写使用相关的命令是 hdfs dfs [generic options]
说明
- HDFS Shell CLI支持操作多种文件系统,包括本地文件系统(file:///)、分布式文件系统(hdfs://nn:8020)等
- 操作的是什么文件系统取决于URL中的前缀协议。
- 如果没有指定前缀,则将会读取环境变量中的fs.defaultFS属性,以该属性值作为默认文件系统
hdfs dfs -ls file:/// #操作本地文件系统
hdfs dfs -ls hdfs://node1:8020/ #操作HDFS分布式文件系统
hdfs dfs -ls / #直接根目录,没有指定协议 将加载读取fs.defaultFS值
hadoop dfs、hdfs dfs、 hadoop fs 三者区别
- hadoop dfs 只能操作HDFS文件系统(包括与Local FS间的操作),不过已经Deprecated
- hdfs dfs 只能操作HDFS文件系统相关(包括与Local FS间的操作),常用
- hadoop fs 可操作任意文件系统,不仅仅是hdfs文件系统,使用范围更广
目前版本来看,官方最终推荐使用的是hadoop fs。当然hdfs dfs在市面上的使用也比较多。
- HDFS文件系统的操作命令很多和Linux类似,因此学习成本相对较低。
- 可以通过hadoop fs -help命令来查看每个命令的详细用法。
2. 微博案例--HDFS Shell实操
微博用户数据HDFS操作
需求:微博作为社交平台,拥有大量的用户评论数据。为了更好的分析微博用户的行为和习惯,进行精准的营销和推荐。可以将微博的用户评论数据上传到HDFS,供后续其他大规模文本、情感分析程序来处理。因为HDFS作为分布式文件存储系统,是整个大数据平台的最底层的核心。
1)目录规划:
2)创建规划目录
- 命令:hadoop fs -mkdir [-p] <path> ...
path 为待创建的目录
-p选项的行为与Unix mkdir -p非常相似,它会沿着路径创建父目录。
hadoop fs -mkdir /common
hadoop fs -mkdir /workspace
hadoop fs -mkdir /tmp/
hadoop fs -mkdir /warehouse
hadoop fs -mkdir /source
3)查看指定目录下内容
- 命令:hadoop fs -ls [-h] [-R] [<path> ...]
path 指定目录路径
-h 人性化显示文件size
-R 递归查看指定目录及其子目录
4)上传文件到指定目录下(1)
- hadoop fs -put [-f] [-p] <localsrc> ... <dst>
-f 覆盖目标文件(已存在下)
-p 保留访问和修改时间,所有权和权限。
localsrc 本地文件系统(客户端所在机器)
dst 目标文件系统(HDFS)
hadoop fs -mkdir -p /source/weibo/star/comment_log/20190810_node1.itcast.cn/
hadoop fs -put caixukun.csv /source/weibo/star/comment_log/20190810_node1.itcast.cn
5)上传文件到指定目录下(2)
- 命令:hadoop fs -moveFromLocal <localsrc> ... <dst>
和-put功能意义,只不过上传结束,源数据会被删除
hadoop fs -moveFromLocal caixukun.csv /tmp/
6)查看HDFS文件内容(1)
- hadoop fs -cat <src> ...
读取指定文件全部内容,显示在标准输出控制台。
注意:对于大文件内容读取,慎重。
hadoop fs -cat /source/weibo/star/comment_log/20190810_node1.itcast.cn/caixukun.csv
7)查看HDFS文件内容(2)
- hadoop fs -head <file>
查看文件前1KB的内容。
hadoop fs -head /source/weibo/star/comment_log/20190810_node1.itcast.cn/caixukun.csv
8)查看HDFS文件内容(3)
- hadoop fs -tail [-f] <file>
查看文件最后1KB的内容
-f选择可以动态显示文件中追加的内容。
hadoop fs -tail /source/weibo/star/comment_log/20190810_node1.itcast.cn/caixukun.csv
9)下载HDFS文件(1)
- hadoop fs -get [-f] [-p] <src> ... <localdst>
下载文件到本地文件系统指定目录,localdst必须是目录
-f 覆盖目标文件(已存在下)
-p 保留访问和修改时间,所有权和权限
hadoop fs -get /source/weibo/star/comment_log/20190810_node1.itcast.cn/caixukun.csv ./
10)合并下载HDFS文件(2)
- hadoop fs -getmerge [-nl] [-skip-empty-file] <src> <localdst>
下载多个文件合并到本地文件系统的一个文件中。
-nl选项表示在每个文件末尾添加换行符
11)拷贝HDFS文件
- 命令:hadoop fs -cp [-f] <src> ... <dst>
-f 覆盖目标文件(已存在下)
hadoop fs -mkdir -p /source/weibo/star/comment_log/20190811_node1.itcast.cn/
hadoop fs -cp /source/weibo/star/comment_log/20190810_node1.itcast.cn/caixukun.csv /source/weibo/star/comment_log/20190811_node1.itcast.cn/
12)追加数据到HDFS文件中
- hadoop fs -appendToFile <localsrc> ... <dst>
将所有给定本地文件的内容追加到给定dst文件。
dst如果文件不存在,将创建该文件。
如果<localSrc>为-,则输入为从标准输入中读取。
hadoop fs -appendToFile caixukun_new.csv /source/weibo/star/comment_log/20190811_node1.itcast.cn/caixukun.csv
13)查看HDFS磁盘空间
- hadoop fs -df [-h] [<path> ...]
显示文件系统的容量,可用空间和已用空间
14)查看HDFS文件使用的空间量
- hadoop fs -du [-s] [-h] <path> ...
-s:表示显示指定路径文件长度的汇总摘要,而不是单个文件的摘要。
-h:选项将以“人类可读”的方式格式化文件大小
hadoop fs -du -s -h -v /source/weibo/
15)HDFS数据移动操作
- hadoop fs -mv <src> ... <dst>
移动文件到指定文件夹下
可以使用该命令移动数据,重命名文件的名称
hadoop fs -mv /source/weibo/star/comment_log/20190810_node1.itcast.cn/caixukun.csv /tmp/caixukun_dirtydata.csv
16)修改HDFS文件副本个数
- hadoop fs -setrep [-R] [-w] <rep> <path> ...
修改指定文件的副本个数。
-R表示递归 修改文件夹下及其所有
-w 客户端是否等待副本修改完毕。
hadoop fs -setrep -w 2 /tmp/caixukun_dirtydata.csv
3. HDFS其他Shell命令操作
- 命令官方指导文档
Apache Hadoop 3.1.4 – Overview
- 友情提示
常见的操作自己最好能够记住,其他操作可以根据需要查询文档使用。
命令属于多用多会,孰能生巧,不用就忘。