HDFS(Hadoop Distributed File System)是一个分布式文件系统;
使用场景:适合一次写入,多次读出的场景。一个文件经过创建、写入和关闭之后就不需要改变。
优点:
1)高容错性
数据自动保存多个副本。它通过增加副本的形式,提高容错性。
某一个副本丢失以后,它可以自动恢复。
2)适合处理大数据
数据规模:能够处理数据规模达到GB、TB、甚至PB级别的数据;
文件规模:能够处理百万规模以上的文件数量,数量相当之大。
3)可构建在廉价机器上,通过多副本机制,提高可靠性。
缺点:
1)不适合低延时数据访问,比如毫秒级的存储数据,是做不到的。 //不能像Mysql那样快速增删改查;
2)不适合大量的小文件进行存储。
存储大量小文件的话,它会占用NameNode大量的内存来存储文件目录和块信息。这样是不可取的,因为NameNode的内存总是有限的;
3)不支持并发写入、文件随机修改。
一个文件只能有一个写,不允许多个线程同时写;
仅支持数据append(追加),不支持文件的随机修改

(1)NameNode(nn)管理者:存储文件的元数据,即文件与数据块的映射表以及数据块与数据节点的映射表;
向DataNode下达命令;
和客户端Client交互;
(2)DataNode(dn) 工作者:在本地文件系统存储文件块数据,以及块数据的校验和。
DataNode执行NameNode的命令;
(3)Secondary NameNode(2nn) 副本:每隔一段时间对NameNode中的 元数据 备份;
在紧急情况下,可辅助恢复NameNode。 (只能恢复一部分)
假设客户端要查找某个 .avi文件:

client提交查找.avi视频的需求,此时RM找到节点开启一个container。
client→Yarn→Map: 由ApplicationMaster向ResourceManager提出申请资源,由ApplicationMaster开启MapTask,这就是Map阶段;
→Reduce→HDFS: 检索完成后会把结果汇总后写到磁盘上,这就是Reduce阶段。这个过程中,NameNode负责计量操作,DataNode负责存储操作,2nn负责备份数据操作。
配置文件:
core-site.xml、hdfs-site.xml、yarn-site.xml、mapred-site.xml 四个配置文件
1.文件块存储在磁盘,如果设置太小,导致块文件很多,会增加寻址时间,程序一直在找块的起始位置;
2.如果块设置的太大,从磁盘传输数据的时间太长,读取不灵活,一旦故障造成资源浪费;
寻址时间为传输时间的1% 则为最佳传输状态;
数据块大小默认为128mb ;
总结:HDFS块的大小设置主要取决于磁盘传输速率。(如果是固态硬盘,可以设置为256mb)
(1)启动脚本
整体启动/停止 HDFS :[abc@hadoop102 hadoop-3.1.3] sbin/ start-dfs.sh/ stop-dfs.sh
整体启动/停止 YARN :[abc@hadoop102 hadoop-3.1.3] sbin/ start-yarn.sh/ stop-yarn.sh
组件逐一启动:
hdfs --daemon start/stop namenode/datanode/secondarynamenode
yarn --daemon start/stop resourcemanager/nodemanager
(2)上传命令
本地拷贝到HDFS:
hdfs dfs -put ./wuguo.txt /sanguo
剪切到 HDFS:
hdfs dfs -moveFromLocal ./wuguo.txt /sanguo
追加一个文件到已存在的文件末尾:
hdfs dfs -appendToFile ./liubei.txt /sanguo/shuguo.txt
(3)下载命令
hdfs dfs -get /sanguo/shuguo.txt ./(客户端地址)
(4)HDFS内命令
-ls: 显示目录信息:
-cat: 显示文件内容
-chgrp、-chmod、-chown:Linux: 文件系统中的用法一样,修改文件所属权限
-mkdir: 创建路径
-cp: 从 HDFS 的一个路径拷贝到 HDFS 的另一个路径
-mv: 在 HDFS的目录中移动文件
-tail: 显示一个文件的末尾 1kb 的数据
-rm: 删除文件或文件夹
-rm -r: 递归删除目录及目录里面内容
-du 统计文件夹的大小信息 -s意味总大小 -h易读计量单位
-setrep: 设置 HDFS 中文件的副本数量

9和5的节点距离是:共同祖先是8,距离为1+2=3
NameNode中的元数据存在哪?
由于存磁盘效率低,所以元数据需要存放在内存中;
由于安全性问题,所以在磁盘中有备份文件Fsimage(数据+元数据);
引入Edits日志文件:
如果同时更新 Fsimage,就会导致效率过低,但如果不更新,就会发生一致性问题,一旦 NameNode 节点断电,就会产生数据丢失。
因此,引入Edits操作文件(不进行计算, 只进行操作的追加,效率很高)。
每当元数据有更新或者添加元数据时,修改内存中的元数据并追加到 Edits 中;
引入SecondaryNameNode节点:
当 Edits 太大,就将Edits和Fsimage进行合并,
合并的触发条件:① 定时时间到 ② Edits中数据满了。
Edits的操作+fsimage镜像文件,合并了就是内存中最新的数据;
1)通常情况下,SecondaryNameNode 每隔一小时执行checkpoint一次;
2)或者操作次数(默认100万次)达到上限,2nn执行一次checkpoint;(每1分钟检查一次文件数是否到了100w次)
当DataNode启动的时候,DataNode将自身信息告诉NameNode。作用是使得这个DataNode成为HDFS集群中的成员;
DataNode向 NameNode注册通过后,会周期性(6 小时)的向NameNode 汇报 所有的块信息(块是否完好)以维持NameNode和数据块之间的映射关系,这一步完成后,DataNode才正式启动完成;
DN 扫描自己节点块信息列表的时间(自查时间)也是 6 小时一次,查完就向nn报道;
默认3秒一次;
如果超过 10 分钟+30秒(10次心跳)没有收到某个 dn的心跳,则认为该节点不可用。,则以后nn就不会允许客户端往该节点读、写数据;
作用:
①告诉NameNode 当前块的状态
②心跳机制是NameNode和DataNode 交互的主要方式,NameNode通过心跳响应中将命令给到DataNode ;