文件系统
什么是文件系统?
- 是一种存储喝组织数据的方法,他是的对文件访问和查询变得简单容易
- 使用文件和树形目录的抽象逻辑概念代替了硬盘等物理设备使用数据块的概念,用户使用文件来保存数据不必关心数据底层存在硬盘哪里,只需要记住这个文件的所属目录和文件名
- 文件系统通常使用硬盘和 光盘这样的存储设备,并维护文件在设备中的物理位置
- 文件系统是一套实现了数据的存储、分级组织、访问和获取等操作的抽象数据类型。
基本概念:
文件名
元数据
元数据又称之为解释性数据,记录数据的数据。
文件系统元数据一般指文件的大小、最创建时间、最后修改时间、底层存储位置等信息+
分类
基于磁盘的文件系统
是在非易事介质上存储文档的经典方式。用以在多次会话之间保持文件的内容。
虚拟文件系统
在内核中生成文件系统,比如proc
proc文件系统是一个虚拟文件系统,通过它可以使用一种新的方法在Linux内核空间和用户间直剑进行通讯
网络文件系统
网络文件系统(NFS)是一种将远程主机上的分区京网络挂载到本地系统的一种机制。允许本地计算机访问另一台计算机上的数据,对此类文件系统中文件的操作都通过网络进行连接
海量数据存储遇到的问题
1. 性能低
单节点IO 性能瓶颈无法逾越,难以支撑海量数据的高并发吞吐场景
2. 可拓展性差
无法实现快速部署和弹性拓展、动态扩容、缩容成本高,技术实现难度大
如何支撑高效率的计算分析
传统存储方式意味着数据存储是存储,当需要处理数据的时候把数据移动过来。
程序和数据存储属于不同的技术厂商实现,无法有机统一整合在一起
问题解决
1. 如何解决海量数据存的下的问题——分布式存储
单机纵向拓展: 缺内存加内存,缺磁盘加磁盘,缺点是不能够一直加下去
多级横向拓展:采用多台机器存储,一台不够就加机器,理论上无上限。
采用多级横向拓展,意味着迈入了分布式存储
2. 如何解决海量数据文件查询便捷问题——元数据记录
当文件被分布式存储在多台机器后,后续获取文件的时候如何能够快速找到文件位于那台机器上,可以借助于源数据记录
来解决这个问题,把文件和其存储的机器的位置记录下来
,类似于图书馆查阅图书系统
3. 如何解决大文件传输效率慢的问题——分块存储
通常做法是分块存储
,把大文件拆分成若干个小块,分别存储在不同的机器上,并行操作提升效率
。
此外分块存储还可以解决数据存储负载均衡问题,此时源数据记录信息也应该更加详细:文件分了几块、分在了那些机器上。
4. 如何解决硬件故障数据丢失问题——副本机制
采用冗余存储
。采用副本机制
,副本越多,数据越安全,当然冗余也越多。
5. 如何解决用户查询视角统一规整问题——抽象目录树结构
采用目录树结构,带有层次感的namespace(命名空间)
,因此可以把分布式文件系统的元数据记录这一块也抽象成统一的目录树结构
。
分布式文件系统HDFS
简介
-
HDFS意为Hadoop分布式文件系统,时Apache Hadoop的核心组件之一,作为大数据生态圈底层的分布式存储服务而存在。
-
分布式文件系统
解决大数据如何存储问题
。分布式意味着时横跨在多台计算机
上的存储系统 -
HDFS 是一种能够在普通硬件上运行的分布式文件系统,它是
高度容错
的,适应于具有大数据的应用程序。它非常适合于存储大型数据(比如TB、PB) -
HDFS使用多台计算机存储文件,并且
提供统一的访问接口
,像是访问一个普通文件系统一样使用分布式文件系统
设计目标
硬件故障是常态
。HDFS可能有成百上千的服务器组成,每一个组件都有可能出现故障,因此故障检测和自动快速恢复时HDFS的核心架构目标
- HDFS 上的应用主要是以
流式读取数据
,HDFS被设计成用于批处理,而不是用户交互式的。相对于数据访问的反应时间,更加注重于数据访问的高吞吐量
- 点醒的HDFS文件大小是GB、TB级别的。所以HDFS被调整成支持大文件,他应该提供很高的聚合数据宽带,一个集群中支持数百个节点,一个集群中还应该支持千万级别的文件
- 大部分HDFS应对文件要求是
write-one-read-many
访问模型,一旦文件创建、写入、关闭之后就不需要修改了,这一假设简化了数据一致性问题,是高吞吐量的数据访问成为了可能 移动计算的代价比移动数据的代价低。
一个应用请求的计算,离他操作数据越近就越高效。将计算移动到数据附近比将数据移动到应用所在显然更好- HDFS 被设计成为可从一个平台轻松移植到另一个平台,这有助于HDFS广泛应作为应用程序的首选平台。
应用场景
HDFS重要特征
主从架构
HDFS采用的是master/slave架构,一般一个HDFS集群是有一个NameNode和一定数量的DataNode组成。NameNode是HDFS主节点,DataNode是HDFS从节点,两种角色各司其职,共同协调
完成分布式的文件存储服务。
分块存储机制
HDFS中的文件在物理上是分布存储的,块的大小可以通过配置参数来规定,位于hdfs-default.xml中:dfs.blocksize。默认大小是128M
副本机制
- 文件的所有block都会存在副本。每个文件的block大小(dfs.blocksize)和副本系数(dfs.replication)都是可以进行配置的。副本系数可以在文件创建的时候指定,也可以在之后通过命令改变。
- 默认dfs.replication的值是3,这表示会有额外两份副本,带上本身一共三份。
namespace
- HDFS支持传统的
层次型文件组织结构
。用户可以创建目录把文件保存在这些目录里。文件系统名字空间的层次结构和大多数现有的文件系统类似:用户可以创建、删除、移动或者重命名。 - NameNode负责为维护文件系统的namespace名称空间,任何对文件系统名称空间或者属性的修改都将被记录在NameNode记录下来
- HDFS会给客户端提供一个
统一的抽象的目录树
,客户端通过路径来访问文件。
元数据管理
在HDFS中,NameNode管理的元数据有两种类型:
-
文件自身属性信息
文件名称、权限、修改时间、文件大小、复制因子、数据块大小
-
文件块位置映射信息
记录文件快和DateNode之间的映射信息,即哪块位于那个节点上
数据块存储
文件的各个block的具体存储管理由DateNode节点承担,每一个block都可以在多个DataNode上存储
HDFS Shell CLI 客户端操作
命令行界面
:是指用户通过键盘输入指令计算机界收到指令后予以执行一种人际互动方式
HDFS Shell CLI支持操作多种文件系统,包括本地文件系统(file:///)、分布式文件系统(hdfs://nn:8020)等。
操作的是什么文件系统取决于URL中的前缀协议。
如果没有指定前缀,则将会读取环境变量中的fs.defaultFS属性,以该系统的默认值作为默认文件系统。
hadoop dfs 、hdfs dfs、 hadoop fs 之间的区别
hadoop dfs 只能操作HDFS文件系统,包括与Local FS间的操作,不过已经弃用了
hdfs dfs 只能操作HDFS文件系统相关(包括与Local FS间的操作) 比较常用
hadoop fs 可以操作任意文件系统,不仅仅是hdfs文件系统,使用广泛
目前版本来看,官方最终推荐的是hadoop fs。
操作指令
创建文件夹:
hadoop fs -mkdir [-p]
…
path 带创建的目录
-p选项和Linux的相似,会沿着父目录进行创建
这里进行一个测试
指令:
hadoop fs -mkdir /KFC
刷新页面:
可以看到我们已经创建了KFC这个文件夹
如果再次创建则会提示文件夹已经存在,如图:
查看文件夹
指令:
hadoop fs -ls [-h] [-r]
-h表示人性化显示
-r表示递归显示该文件夹下的子文件夹
测试
普通查看
hadoop fs -ls /
解释: 查看根目录下的所有文件
递归显示:
hadoop fs -ls -R /
解释: 递归显示根路径下的资源
人性化显示
hadoop fs -ls -h /
上传文件
上传文件一共有两个指令
上传文件到指定目录下(1)
指令:
hadoop fs -put [-f] [-p] <localsrc>…<dst>
-f 表示 覆盖目标文件(已存在的情况下)
-p 表示保存访问和修改时间,所有权和权限
localsrc 本地文件系统(客户端所在机器)
dst 目标文件系统(HDFS)
测试
将opt/sofeware下的hadoop安装包 上传到文件系统上的source文件夹下
hadoop fs -put file:///opt/software/hadoop-3.3.1.tar.gz /source
在这里file://
其实也可以不写,默认就是在本地文件系统下
文件上传到指定目录下(2)
指令:
hadoop fs -moveFromLocal <localsrc> … <dst>
作用和-put的作用相同,不同的是,-put上传后会保留源文件,而-moveFromLocal会删除源文件
测试
hadoop fs -moveFromLocal file:///a.txt /tmp
运行结果:
去检查a.txt是否存在
发现a.txt已经被删除了
查看文件内容
hadoop fs -cat <src>…
读取指定文件的全部内容,显示在标准输出控制台。
注意:对于大文件读取要慎重
案例: 读取tmp下的a.txt文件
通过网页进行查看:
hadoop fs -head <file>
查看文件前1kb的内容
hadoop fs -tail [-f] <file>
显示文件后1kb的内容
-f 动态进行显示
文件下载
hadoop fs -get [-f] [-p] <src>… <localdst>
下载文件到本地文件系统指定目录,localdst必须是目录
-f 覆盖目标文件(已存在的情况下)
-p 保留访问时间和修改时间/所有权和权限
换个服务器,在hadoop134下是没有a.txt文件,这里将从hdfs文件系统上进行一个下载
hadoop fs -get /tmp/a.txt /root
这时候已经出现了a.txt文件,表明已经下载成功
hadoop fs -getmerge [-nl] [-skip-empty-file] <src>… <localdst>
下载多个文件合并到本地文件系统的一个文件中
-nl 选项表示在每个文件末尾添加换行符
-skip-empty-file 表示跳过空文件
创建4个小文件:
echo 1 >> 1.txt
echo 2 >> 2.txt
echo 3 >> 3.txt
touch 4.txt
查看文件大小
将这四个文件上传到HDFS 上的/tmp/small上
hadoop fs -put 1.txt 2.txt 3.txt 4.txt /tmp/small
进行合并
hadoop fs -getmerge -nl -skip-empty-file /tmp/small/* ./5.txt
显然文件已经下载成功且只有一个文件
查看文件内容
拷贝文件:
指令: hadoop fs -cp [-f] <src>… <dst>
-f 覆盖目标文件(已经存在)
直接创建一个新的文件夹cxk 随后将small下的4个文件给复制到新文件中.
指令:
hadoop fs -mkdir /tmp/cxk
hadoop fs -cp -f /tmp/small/* /tmp/cxk
运行结果:
显然已经复制成功
追加文件内容
指令: hadoop fs -appendToFile <localsrc>… <dst>
将所有给定本地文件的内容追加到给定的dst文件中
dst如果不存在,那么就创建该文件
如果<localdst>为-,则输入为从标准输入中读取
测试:
本地存在1.txt内容为1,上传到/tmp/small上的2.txt的内容为2
将1.txt文件的内容追加到2.txt上
hadoop fs -appendToFile 1.txt /tmp/small/2.txt
查看2.txt的内容:
hadoop fs -cat /tmp/small/2.txt
查看HDFS的磁盘空间
命令: hadoop fs -df [-h] [<path>…]
显示文件系统的容量/可用空间和已用空间
测试
hadoop fs -df -h /
查看根路径下磁盘的使用空间
查看HDFS文件使用的空间量
指令: hadoop fs -du [-s] [-h] <path>…
-s 表示显示指定路径文件长度汇总摘要,而不是单个文件的摘要
-h 人性化显示
测试
hadoop fs -du -s -v -h /tmp/small
查看一/tmp/small文件的大小
size 可以得知占用位数为8,同时由于备份了3份所以一共24
数据的移动
指令: hadoop fs -mv <src>… <dst>
移动文件到指定文件夹下
可以使用此命令移动数据,从而实现重命名文件
测试
hadoop fs -mv /tmp/small/1.txt /tmp/small/11.txt
将tmp/small下的1.txt文件名称改成2.txt
查看结果:
修改HDFS文件副本的个数
指令: hadoop fs -setrep [-R] [-w] <rep> <path>…
修改指定文件的副本个数.
-R 表示递归,修改文件夹以及其所有
-w 客户端是否等待副本修改完毕.
测试
直接修改/tmp/small/11.txt的副本个数,将其修改成 1
hadoop fs -setrep -w 2 /tmp/small/11.txt
刚开始出现一个".",等结束后出现done,表示修改成功,这是因为加上了一个-w ,表示等待同步完成在结束,去web UI上进行查看
副本个数变成了两个