HDFS
HDFS简介
HDFS产生背景
随着数据量越来越大,在一个操作系统管辖的范围内存不下了,那么就分配到更多的操作系统管理的磁盘中,但是不方便管理和维护,迫切需要一种系统来管理多台机器上的文件,这就是分布式文件管理系统。HDFS只是分布式文件管理系统中的一种。
HDFS概念
HDFS,它是一个文件系统,用于存储文件,通过目录树来定位文件;其次,它是分布式的,由很多服务器联合起来实现其功能,集群中的服务器有各自的角色。
HDFS的设计适合一次写入,多次读出的场景,且不支持文件的修改。适合用来做数据分析,并不适合用来做网盘应用。
HDFS优缺点
优点
第一点:高容错性
数据自动保存多个副本。它通过增加副本的形式,提高容错性。
某一个副本丢失以后,它可以自动恢复。
第二点:适合大数据处理。两个维度:数据规模和文件规模
数据规模:能够处理数据规模达到 GB、TB、甚至PB级别的数据。
文件规模:能够处理百万规模以上的文件数量,数量相当之大。
第三点:流式数据访问,它能保证数据的一致性。
第四点:可构建在廉价机器上,通过多副本机制,提高可靠性。
缺点
第一点:不适合低延时数据访问,比如毫秒级的存储数据,是做不到的。
第二点:无法高效的对大量小文件进行存储(重点)
1.存储大量小文件的话,它会占用 NameNode大量的内存来存储文件、目录和块信息。这样是不可取的,因为NameNode的内存总是有限的。
2.小文件存储的寻道时间会超过读取时间,它违反了HDFS的设计目标。
第三点:不支持并发写入、文件随机修改
1.一个文件只能有一个写,不允许多个线程同时写。
2.仅支持数据 append(追加),不支持文件的随机修改。
HDFS组成架构
Hdfs架构
Client:客户端。
文件切分。文件上传 HDFS 的时候,Client 将文件切分成一个一个的Block,然后进行存储。
与NameNode交互,获取文件的位置信息。
与DataNode交互,读取或者写入数据。
Client提供一些命令来管理HDFS,比如启动或者关闭HDFS。
Client可以通过一些命令来访问HDFS。
NameNode:就是Master,它是一个主管、管理者。
管理HDFS的名称空间。
管理数据块(Block)映射信息
配置副本策略
处理客户端读写请求。
DataNode:就是Slave,NameNode下达命令,DataNode执行实际的操作。
存储实际的数据块。
执行数据块的读/写操作。
Secondary NameNode:并非NameNode的热备。当NameNode挂掉的时候,它并不能马上替换NameNode并提供服务。
辅助NameNode,分担其工作量。
定期合并Fsimage和Edits,并推送给NameNode。
在紧急情况下,可辅助恢复NameNode。
1.5 HDFS 文件块大小
HDFS中的文件在物理上是分块存储(block),块的大小可以通过配置参数(dfs.blocksize)来规定,默认大小在hadoop2.x版本中是128M,老版本中是64M。
HDFS文件是分块存储
块的大小可以设置(dfs.blocksize)来规定
默认大小
Hadoop1.x 64MB
Hadoop2.x 128MB
HDFS Shell操作
基本语法
hdfs dfs 具体命令
命令大全
hdfs dfs
[-appendToFile <localsrc> ... <dst>]
[-cat [-ignoreCrc] <src> ...]
[-checksum <src> ...]
[-chgrp [-R] GROUP PATH...]
[-chmod [-R] <MODE[,MODE]... | OCTALMODE> PATH...]
[-chown [-R] [OWNER][:[GROUP]] PATH...]
[-copyFromLocal [-f] [-p] <localsrc> ... <dst>]
[-copyToLocal [-p] [-ignoreCrc] [-crc] <src> ... <localdst>]
[-count [-q] <path> ...]
[-cp [-f] [-p] <src> ... <dst>]
[-createSnapshot <snapshotDir> [<snapshotName>]]
[-deleteSnapshot <snapshotDir> <snapshotName>]
[-df [-h] [<path> ...]]
[-du [-s] [-h] <path> ...]
[-expunge]
[-get [-p] [-ignoreCrc] [-crc] <src> ... <localdst>]
[-getfacl [-R] <path>]
[-getmerge [-nl] <src> <localdst>]
[-help [cmd ...]]
[-ls [-d] [-h] [-R] [<path> ...]]
[-mkdir [-p] <path> ...]
[-moveFromLocal <localsrc> ... <dst>]
[-moveToLocal <src> <localdst>]
[-mv <src> ... <dst>]
[-put [-f] [-p] <localsrc> ... <dst>]
[-renameSnapshot <snapshotDir> <oldName> <newName>]
[-rm [-f] [-r|-R] [-skipTrash] <src> ...]
[-rmdir [--ignore-fail-on-non-empty] <dir> ...]
[-setfacl [-R] [{-b|-k} {-m|-x <acl_spec>} <path>]|[--set <acl_spec> <path>]]
[-setrep [-R] [-w] <rep> <path> ...]
[-stat [format] <path> ...]
[-tail [-f] <file>]
[-test -[defsz] <path>]
[-text [-ignoreCrc] <src> ...]
[-touchz <path> ...]
[-usage [cmd ...]]
常用命令
-help:查看命令的使用方式
hdfs dfs -help rm
-ls: 显示目录信息
hdfs dfs -ls /
-mkdir:在hdfs上创建目录
hdfs dfs -mkdir /bigdata
hdfs dfs -mkdir -p /kgc/test
-moveFromLocal从本地剪切粘贴到HDFS文件系统
hdfs dfs -moveFromLocal ./hello.txt /kgc/test
-appendToFile :追加一个文件到已经存在的文件末尾
hdfs dfs -appendToFile test1.txt /kgc/test/hello.txt
-cat :显示文件内容
hdfs dfs -cat /kgc/test/hello.txt
-tail:显示一个文件的末尾
hdfs dfs -tail /kgc/test/hello.txt
-chgrp 、-chmod、-chown:linux文件系统中的用法一样,修改文件所属权限
hdfs dfs -chmod 666 /kgc/test/hello.txt
hdfs dfs -chown kgc:kgc /kgc/test/hello.txt
-copyFromLocal:从本地文件系统中拷贝文件到hdfs路径去
hdfs dfs -copyFromLocal README.txt /
-copyToLocal:从hdfs拷贝到本地
hdfs dfs -copyToLocal /kgc/test/hello.txt ./
-cp :从hdfs的一个路径拷贝到hdfs的另一个路径
hdfs dfs -cp /kgc/test/hello.txt /hello1.txt
-mv:在hdfs目录中移动文件
hdfs dfs -mv /hello1.txt /kgc/test/
-get:等同于copyToLocal,就是从hdfs下载文件到本地
hdfs dfs -get /kgc/test/hello.txt ./
-getmerge :合并下载多个文件,比如hdfs的目录 /aaa/下有多个文件:log.1, log.2,log.3,...
hdfs dfs -getmerge /user/kgc/test/* ./merge.txt
-put:等同于copyFromLocal
hdfs dfs -put ./merge.txt /user/kgc/test/
-rm:删除文件或文件夹
hdfs dfs -rm /user/kgc/test/merge.txt
-rmdir:删除空目录
hdfs dfs -rmdir /test
-du统计文件夹的大小信息
hdfs dfs -du -s -h /user/kgc/test
hdfs dfs -du -h /user/kgc/test
-setrep:设置hdfs中文件的副本数量
hdfs dfs -setrep 10 /kgc/test/hello.txt
HDFS读写流程
HDFS写数据流程
1.客户端通过Distributed FileSystem模块向NameNode请求上传文件,NameNode检查目标文件是否已存在,父目录是否存在。
2.NameNode返回是否可以上传。不能上传会返回异常。
3.确定可以上传,客户端请求第一个 block上传到哪几个datanode服务器上。
4.NameNode返回3个datanode节点,假定分别为dn1、dn2、dn3。
5.客户端通过FSDataOutputStream模块请求dn1上传数据,dn1收到请求会继续调用dn2,然后dn2调用dn3,将这个通信管道建立完成。
6.dn1、dn2、dn3逐级应答客户端。
7.客户端开始往dn1上传第一个block(先从磁盘读取数据放到一个本地内存缓存),以packet(64KB)为单位,dn1收到一个packet就会传给dn2,dn2传给dn3;dn1每传一个packet会放入一个应答队列等待应答。
8.当一个block传输完成之后,客户端再次请求NameNode上传第二个block的服务器。(重复执行3-7步)。
HDFS读数据流程
HDFS的读数据流程
1.首先调用FileSystem.open()方法,获取到DistributedFileSystem实例
2.DistributedFileSystem 向Namenode发起RPC(远程过程调用)请求获得文件的开始部分或全部block列表,对于每个返回的块,都包含块所在的DataNode地址。这些DataNode会按照Hadoop定义的集群拓扑结构得出客户端的距离,然后再进行排序。如果客户端本身就是一个DataNode,那么他将从本地读取文件。
3.DistributedFileSystem会向客户端client返回一个支持文件定位的输入流对象FSDataInputStream,用于客户端读取数据。FSDataInputStream包含一个DFSInputStream对象,这个对象用来管理DataNode和NameNode之间的I/O
4.客户端调用read()方法,DFSInputStream就会找出离客户端最近的datanode并连接datanode
5.DFSInputStream对象中包含文件开始部分的数据块所在的DataNode地址,首先它会连接包含文件第一个块最近DataNode。随后,在数据流中重复调用read()函数,直到这个块全部读完为止。如果第一个block块的数据读完,就会关闭指向第一个block块的datanode连接,接着读取下一个block块
6.如果第一批block都读完了,DFSInputStream就会去NameNode拿下一批blocks的location,然后继续读,如果所有的block块都读完,这时就会关闭掉所有的流。
HDFS如何控制客户端读取哪个副本节点数据
HDFS满足客户端访问副本数据的最近原则。即客户端距离哪个副本数据最近,HDFS就让哪个节点把数据给客户端。
NameNode和SecondaryNameNode关系
NameNode和Secondary NameNode工作机制
第一阶段:namenode启动
1.第一次启动namenode格式化后,创建fsimage和edits文件。如果不是第一次启动,直接加载编辑日志和镜像文件到内存。
2.客户端对元数据进行增删改的请求
3.namenode记录操作日志,更新滚动日志。
4.namenode在内存中对数据进行增删改
第二阶段:Secondary NameNode工作
1.Secondary NameNode询问namenode是否需要checkpoint。直接带回namenode是否检查结果。
2.Secondary NameNode请求执行checkpoint。
3.namenode滚动正在写的edits日志
4.将滚动前的编辑日志和镜像文件拷贝到Secondary NameNode
5.Secondary NameNode加载编辑日志和镜像文件到内存,并合并。
6.生成新的镜像文件fsimage.chkpoint
7.拷贝fsimage.chkpoint到namenode
8.namenode将fsimage.chkpoint重新命名成fsimage
Fsimage和Edits
1.概念
2.使用oiv和oev命令查看fsimage和edits文件
# 1.查看oiv和oev命令
hdfs
oiv apply the offline fsimage viewer to an fsimage
oev apply the offline edits viewer to an edits file
# 2.oiv查看fsimage文件
# 基本语法
hdfs oiv -p 文件类型 -i镜像文件 -o 转换后文件输出路径
# 案例实操
hdfs oiv -p XML -i fsimage_0000000000000000023 -o /opt/install/hadoop/fsimage.xml
cat opt/install/hadoop/fsimage.xml
将显示的xml文件内容拷贝到eclipse中创建的xml文件中,并格式化。
# 3.oev查看edits文件
# 基本语法
hdfs oev -p 文件类型 -i编辑日志 -o 转换后文件输出路径
# 案例实操
hdfs oev -p XML -i
edits_0000000000000000012-0000000000000000013 -o /opt/install/hadoop/edits.xml
cat /opt/install/hadoop/edits.xml
将显示的xml文件内容拷贝到eclipse中创建的xml文件中,并格式化。


本文围绕HDFS分布式文件系统展开,介绍其产生背景、概念、优缺点、组成架构、文件块大小等基础知识。还阐述了HDFS的Shell操作命令,以及读写流程。此外,说明了HDFS控制客户端读取副本数据的原则,NameNode和Secondary NameNode的工作机制,最后提及查看Fsimage和Edits文件的方法。
740

被折叠的 条评论
为什么被折叠?



