1.HDFS概述
为什么需要hdfs分布式文件管理系统
- 数据量越来越多,在一个操作系统管辖的范围存不下了,那么就分配到更多的操作系统管理的磁盘中,但是不方便管理和维护,因此迫切需要一种系统来管理多台机器上的文件,这就是分布式文件管理系统 。
- 是一种允许文件通过网络在多台主机上分享的文件系统,可让多机器上的多用户分享文件和存储空间。通透性。让实际上是通过网络来访问文件的动作,由程序与用户看来,就像是访问本地的磁盘一般。
- 容错。即使系统中有某些节点宕机,整体来说系统仍然可以持续运作而不会有数据损失【通过副本机制实现】。
- 分布式文件管理系统很多,hdfs只是其中一种,不合适小文件。
hdfs架构
图解
端口号:master/node1/node2:50070
UI:用户界面(简称UI,亦称使用者界面)是系统和用户之间进行交互和信息交换的媒介,它实现信息的内部形式与人类可以接受形式之间的转换。用户界面是介于用户与硬件而设计彼此之间交互沟通相关软件,目的在使得用户能够方便有效率地去操作硬件以达成双向之交互,完成所希望借助硬件完成之工作,用户界面定义广泛,包含了人机交互与图形用户接口,凡参与人类与机械的信息交流的领域都存在着用户界面。
2.HDFS三个组件
1.NameNode
- NameNode主要是用来保存HDFS的元数据信息,比如命名空间信息,块信息等。当它运行的时候,这些信息是存在内存中的。但是这些信息也可以持久化到磁盘上。NameNode是整个文件系统的管理节点。它维护着整个文件系统的文件目录树,文件/目录的元信息和每个文件对应的数据块列表。接收用户的操作请求。
- 文件包括:
fsimage:元数据镜像文件。存储某一时段NameNode内存元数据信息。
edits:操作日志文件,namenode启动后一些新增元信息日志。
fstime:保存最近一次checkpoint的时间以上这些文件是保存在linux的文件系统中。
hdfs-site.xml的dfs.namenode.name.dir属性
2.DateNode
- 提供真实文件数据的存储服务。
- 文件块(block):最基本的存储单位。对于文件内容而言,一个文件的长度大小是size,那么从文件的0偏移开始,按照固定的大小,顺序对文件进行划分并编号,划分好的每一个块称一个Block。2.0以后HDFS默认Block大小是128MB,以一个256MB文件,共有256/128=2个Block.(hdfs-site.xml中dfs.blocksize属性)
- 不同于普通文件系统的是,HDFS中,如果一个文件小于一个数据块的大小,并不占用整个数据块存储空间
- Replication,多复本,默认是三个。(hdfs-site.xml的dfs.replication属性)
3.secondary namenode
图解
3.HDFS其它组件
1.client,namenode,datanode,secondary namenode 图解
2.Trash回收站
- 和Linux系统(桌面环境)的回收站设计一样,HDFS会为每一个用户创建一个回收站目录:/user/用户名/.Trash/,每一个被用户通过Shell删除的文件/目录,fs.trash.interval是在指在这个回收周期之内,文件实际上是被移动到trash的这个目录下面,而不是马上把数据删除掉。等到回收周期真正到了以后,hdfs才会将数据真正删除。默认的单位是分钟,1440分钟=60*24,刚好是一天。
- 配置:在每个节点(不仅仅是主节点)上添加配置 core-site.xml,
增加如下内容:
注意:如果删除的文件过大,超过回收站大小的话会提示删除失败需要指定参数 -skipTrash
3.FileSysterm
- fileSysterm是使用java代码操作hdfs的api接口 —->>> 应用到IDEA中
文件操作
create 写文件
open 读取文件
delete 删除文件
API:是一些预先定义的接口(如函数、HTTP接口),或指软件系统不同组成部分衔接的约定。用来提供应用程序与开发人员基于某软件或硬件得以访问的一组例程,而又无需访问源码,或理解内部工作机制的细节。- 目录操作
mkdirs 创建目录
delete 删除文件或目录
listStatus 列出目录的内容
getFileStatus 显示文件系统的目录和文件的元数据信息
getFileBlockLocations 显示文件存储位置
4.HDFS之数据储存 ——>>>>写文件,读文件
1.数据存储—>>写文件
写文件流程分析:
- 客户端通过调用DistributedFileSystem的create方法创建新文件
- DistributedFileSystem通过RPC调用namenode去创建一个没有blocks关联的新文件,创建前,namenode会做各种校验,比如文件是否存在,客户端有无权限去创建等。如果校验通过,namenode就会记录下新文件,否则就会抛出IO异常
- 前两步结束后会返回FSDataOutputStream的对象,象读文件的时候相似,FSDataOutputStream被封装成DFSOutputStream.DFSOutputStream可以协调namenode和datanode。客户端开始写数据到DFSOutputStream,DFSOutputStream会把数据切成一个个小packet,然后排成队列data quene。
- DataStreamer会去处理接受data queue,他先问询namenode这个新的block最适合存储的在哪几个datanode里,比如副本数是3,那么就找到3个最适合的datanode,把他们排成一个pipeline.DataStreamer把packet按队列输出到管道的第一个datanode中,第一个datanode又把packet输出到第二个datanode中,以此类推。
- DFSOutputStream还有一个对列叫ack queue,也是有packet组成,等待datanode的收到响应,当pipeline中的所有datanode都表示已经收到的时候,这时akc queue才会把对应的packet包移除掉。如果在写的过程中某个datanode发生错误,会采取以下几步:1) pipeline被关闭掉;2)为了防止丢包ack queue里的packet会同步到data queue里;3)把产生错误的datanode上当前在写但未完成的block删掉;4)block剩下的部分被写到剩下的两个正常的datanode中;5)namenode找到另外的datanode去创建这个块的复制。当然,这些操作对客户端来说是无感知的。
- 客户端完成写数据后调用close方法关闭写入流
- DataStreamer把剩余得包都刷到pipeline里然后等待ack信息,收到最后一个ack后,通知namenode把文件标示为已完成。
2.写文件图解如下:
3.数据存储—>>读文件
读文件流程分析:
- 首先调用FileSystem对象的open方法,其实是一个DistributedFileSystem的实例
- DistributedFileSystem通过rpc获得文件的第一个block的locations,同一block按照副本数会返回多个locations,这些locations按照hadoop拓扑结构排序,距离客户端近的排在前面.
- 前两步会返回一个FSDataInputStream对象,该对象会被封装成DFSInputStream对象,DFSInputStream可以方便的管理datanode和namenode数据流。客户端调用read方法,DFSInputStream最会找出离客户端最近的datanode并连接。
- 数据从datanode源源不断的流向客户端。
- 如果第一块的数据读完了,就会关闭指向第一块的datanode连接,接着读取下一块。这些操作对客户端来说是透明的,客户端的角度看来只是读一个持续不断的流。
- 如果第一批block都读完了,DFSInputStream就会去namenode拿下一批blocks的location,然后继续读,如果所有的块都读完,这时就会关闭掉所有的流。
- 如果在读数据的时候,DFSInputStream和datanode的通讯发生异常,就会尝试正在读的block的排第二近的datanode,并且会记录哪个datanode发生错误,剩余的blocks读的时候就会直接跳过该datanode。DFSInputStream也会检查block数据校验和,如果发现一个坏的block,就会先报告到namenode节点,然后DFSInputStream在其他的datanode上读该block的镜像
- 该设计的方向就是客户端直接连接datanode来检索数据并且namenode来负责为每一个block提供最优的datanode,namenode仅仅处理block location的请求,这些信息都加载在namenode的内存中,hdfs通过datanode集群可以承受大量客户端的并发访问。
4.读文件图解如下:
5.hdfs命令
HDFS命令:
hadoop fs 选项
hdfs dfs 选项
以上两种方式都可以操作HDFS
操作:
1.上传文件
-put
hdfs dfs -put 本地文件路径 HDFS远程路径
-moveFromLocal
hdfs dfs -moveFromLocal 本地文件路径 HDFS远程路径
2.查看目录信息
-ls
hdfs dfs -ls HDFS远程路径
* -h 以格式化文件大小单位展示
hdfs dfs -ls -h HDFS远程路径
* -R 展示给定路径下所有文件目录及其子目录的信息
hdfs dfs -ls -R HDFS远程路径
3.下载文件
-get
hdfs dfs -get HDFS远程路径 本地文件路径
-copyToLocal
hdfs dfs -copyToLocal HDFS远程路径 本地文件路径
4. 复制
-cp
hdfs dfs -cp HDFS远程路径 本地文件路径
注意:如果想要表示目标路径为一个目录,那么需要在路径最后添加/
5.删除
-rm
hdfs dfs -rm HDFS远程路径
-r -f 强制删除不为空的目录
* -skipTrash 跳过垃圾回收机制
hdfs dfs -rm -r -f -skipTrash HDFS远程路径
skipTrash保存时间为1天
6.创建目录
-mkdir
hdfs dfs -mkdir HDFS远程路径
* -p 迭代创建目录
hdfs dfs -mkdir -p HDFS远程路径
7.移动
-mv
hdfs dfs -mv HDFS远程路径 HDFS远程路径
8.追加上传文件
-appendToFile
hdfs dfs -appendToFile 本地文件路径 HDFS远程路径
9.查看文件
-cat
hdfs dfs -cat HDFS远程路径
-tail
hdfs dfs -tail HDFS远程路径
* -f 监听HDFS文件
hdfs dfs -tail -f HDFS远程路径
10.查看空间
-du 查看指定目录的空间占用情况
hdfs dfs -du HDFS远程路径
-dh 查看HDFS中空间使用情况
hdfs dfs -df -h /
11. 权限
chmod
hdfs dfs -chmod 命令选项 HDFS远程路径
6.MAVEN,HDFS,IDEA
1.添加依赖,pom.xml文件
2.添加resources文件 hdfs-site.xml
3.添加日志文件log4j.properties
4.IDEA代码实现 ——>>>>Gitee仓库查看代码内容
- Code01FileSystem
- Code02UpFile 上传文件(改用户名为本机windows名称)
- Code03UpFile 设置用户名上传文件
- Code04ReplicationOperator 设置副本个数
- Code05Download 从远程系统下载文件到本地系统
- Code06Rename 修改文件名
- Code07FileStatus 查看文件状态及内容
- Code08Delete 删除文件