HDFS介绍
-
HDFS就是分布式文件管理系统,适合一次写入,多次读出,不支持修改
-
优缺点:(优)有副本高容错,处理大数据;(缺)不适合处理小文件,不合适低延迟处理数据
-
HDFS组成
NameNode(nn) 管理元数据,处理客户端请求 DataNode(dn) 储存实际数据块,执行客户端操作 SecondaryNameNode 辅助nn,定期完成checkpoint操作,不可作为热备 -
HDFS文件块(block)默认情况下为128M,传输时间1%为寻址时间,nn寻址时间为10ms,100M/s为一般速度。如果block太小会增加寻址时间,如果太大会增加传输时间,HDFS块的大小取决于传输磁盘效率。
-
HDFS命令
start-dfs.sh/stop-yarn.sh 启动hdfs/关闭yarn hadoop fs (-moveFromLocal/-put/-appendToFile/-copyFromLocal/ )本地文件 集群目录路径 本地剪切至hdfs/本地复制/追加一个文件到已存在文件末尾/与put相同 hadoop fs (-copyToLocal/-get)集群文件 本地路径 从hdfs下载到本地 hadoop fs -getmerge 集群目录路径 本地文件名 合并一个目录下的多个文件到一个文件 hadoop fs -setrep n 文件路径 设定n个文件副本 -
Windows下HDFS客户端
-
配置环境变量
-
创建maven工程
-
配置maven变量
<dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.12</version> </dependency> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-slf4j-impl</artifactId> <version>2.12.0</version> </dependency> <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-client</artifactId> <version>3.1.3</version> </dependency> </dependencies>
-
创建log4j2.xml(日志信息)
-
-
客户端操作API
/*获取文件系统操作对象*/ Configuration conf = new Configuration("name","value"); //name为配置的名称,value为配置所需的值,可参考hdfs-site.xml FileSystem fis = FileSystem.get(new URI("hdfs://hadoop102:9820"),conf,"atguigu"); fis.copyFromLocalFile();//上传文件 fis.copyToLocalFile();//下载文件 fis.rename();//修改文件名称 RemoteIterator<LocatedFileStatus> ListFiles; ListFiles = fis.listFiles();//获取文件详情,返回值是整个目录下所有文件信息的集合 ListFiles.getBlockLocations();//获取文件存储的块信息 FileStatus[] status = fis.listStatus() for (FileStatus fileStatu : listStatus) { filestatu.isFile();//判断是不是文件 filestatu.isDirectory();//判断是不是文件夹 }
-
HDFS数据流上传
-
首先客户端准备上传文件(DIstributed FileSystem),如果上传文件大于128M,则客户端会对文件进行切分;
-
客户端向nn发送一个RPC请求,nn对文件检测是否存在,并返回是否可以上传。;
-
客户端请求上传第一个block文件;
-
nn返回一个存储数据的节点位置,dn1,dn2,dn3;
-
客户端会最近的dn1进行传输连接;
-
dn1则会与nn分配的dn2,dn3建立连接;逐级应答后,dn1则返回应答成功信息到客户端;
-
传输数据(从磁盘读取数据放到一个本地内存缓存),以Packet为单位,每一个Packet的大小为64K,每传输一个packet会放入一个应答队列等待应答,Packet由512字节数据+4个crc检验的chunk组成;
-
客户端传输成功消息传达至nn;
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-39hTrAe3-1602923577812)(C:\Users\cf\AppData\Roaming\Typora\typora-user-images\image-20201014204247911.png)]
-
-
副本节点选择
第一个副本在Client所处的节点上。如果客户端在集群外,随机选一个(节点最近原则)。
第二个副本在另一个机架的随机一个节点
第三个副本在第二个副本所在机架的随机节点
-
HDFS文件读取
- 客户端向nn发送下载请求(DistributedFileSystem);
- nn返回查找到的dn地址并返回给客户端;
- 客户端挑选一个最近的dn进行数据的读取;
- dn开始传输数据给客户端(以Packet为单位chunk校验);
- 客户端收到Packet后再本地缓存,然后写入目标文件;
-
nn和2nn工作机制
nn中的元数据的存储方式为内存+磁盘(Fsimage+Edits),snn辅助操作为CheckPoint
-
第一次启动集群或者格式化集群后,再磁盘上创建Fsimage(镜像文件)和Edits(日志文件),后续如果需要重启nn,则直接磁盘中读取Fsimage和Edits到内存;
-
客户端发起操作请求,写入滚动日志edits_inprogress;
-
nn在内存中对元数据进行增删改;
-
snn会对nn进行CheckPoint操作(每一个小时 || 操作次数达到1百万);
-
将滚动前的编辑日志和镜像文件拷贝到snn(edits+fsimage);
-
snn记载日志和镜像文件到内存并合并;
-
生成新的镜像文件fsimage.chkpoint;
-
拷贝fsimage.chkpoint到nn;
-
nn将fsimage.chkpoint重新命名为fsimage;
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VmQKMQmF-1602923577813)(C:\Users\cf\AppData\Roaming\Typora\typora-user-images\image-20201015111037182.png)]
-
-
Fsimage和Edits解析
-
Fsimage是HDFS文件系统元数据的一个永久性的检查点,包括文件系统中的所有目录和文件inode的序列化信息;
-
Edits存放HDFS文件系统的所有更新操作(增删改);
hdfs oiv -p XML -i fsimage -o ~/ hdfs oev -p XML -i edits -o ~/
-
-
集群安全模式
- nn启动时,将镜像文件载入内存,并执行编辑日志的过程时,集群会进入安全模式,这个期间中nn的文件系统对于客户端来说只读的;
- nn会在30秒后退出安全模式,如果集群中没有块则nn不会进入安全模式;
hdfs dfsadmin -safemode get (功能描述:查看安全模式状态) hdfs dfsadmin -safemode enter (功能描述:进入安全模式状态) hdfs dfsadmin -safemode leave (功能描述:离开安全模式状态) hdfs dfsadmin -safemode wait (功能描述:等待安全模式状态)
-
dn的工作机制
-
一个数据块再dn上存储的包含两个文件;一个是数据块,一个是元数据包含数据块的长度,数据块的校验和,以及时间戳;
-
dn再启动后会向集群注册,通过后,每一个小时会向nn上报所有块信息;
-
dn每三秒会向nn发送一个心跳包,心跳包返回结果带有nn对于数据块的操作;
-
如果超过十分钟+三十秒nn没有收到dn发送过来的心跳包则遗弃该节点,该节点不再使用;
-
dn上的数据检验为CheckSum来进行,以此来保存数据的完整性;
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CFaLRLfy-1602923577815)(C:\Users\cf\AppData\Roaming\Typora\typora-user-images\image-20201015113335137.png)]
-
-
白名单和黑名单
-
未加入到白名单配置文件中的节点,不被集群使用,直接抛弃
-
加入到黑名单的节点,集群会将节点进行强制退出,但是再节点退役前,集群会将节点上的数据复制到其他节点的数据块上。
(配置hdfs-site.xml) <property> <name>dfs.hosts.exclude</name> <value>/opt/module/hadoop-3.1.3/etc/hadoop/blacklist> </property> hdfs dfsadmin -refreshNodes (刷新节点信息)
-
如果数据不均衡,可以通过命令使得集群再平衡
start-balancer.sh
-