HDFS知识点汇总(含读、写、删流程)
------------ 本文来自 阿P官方博客
思考1:HDFS的作用?思考2:HDFS的意义?思考3:HDFS的优缺点?tips:学习HDFS重点学会读、写、删流程。概念性的东西,看看就好。
一、思考
1:为什么Hadoop要引入HDFS进行分布式存储,为什么不使用传统方式进行(1台主机)存储?
一台主机承受的并发能力有限。
一台主机存储量有限,一般来说8TB应该是没有问题的。
2:HDFS分布式的存储,怎么写入、怎么读取?
利用NameNode节点管理DataNode
利用DataNode节点存储数据。
3:如果客户端发送给NameNode单条数据时,数据量非常大,一个DataNode无法存储,如何存储?
存储数据时,HDFS会将数据切块(block),分别存储到不同的DataNode上。
4:如果某个DataNode宕机,数据块丢失,如何处理?
数据备份策略(复本策略)。默认复本数量为3(该数据块存储3份)。
二、块(block)
1.block是HDFS基本存储单元。
2.在Hadoop2.x版本上,默认block是128M。
3.如果文件大小<128M,文件不会分块。
4.id:用来标记复本。相同复本id一样
5.由于block的存储,HDFS更适合存储超大文件、快速备份。
三、管理节点(NameNode)
1.概述
是HDFS的最核心内容
在1.x中,最多设置1个
在2.x以上,最多可以设置2个。如果设置两个,不能设置SecondaryNameNode
2.用处:
用于管理DataNode
记录元数据Meta
四、NameNode元数据
1.元数据内容
记录切块数量
记录数据库存储位置
记录数据库复本数量
记录文件权限
元数据存储
内存:可快速查找
磁盘:可进行崩溃恢复。
磁盘存储位置:{hadoop.tmp.dir}/dfs/current/name
2.edits_…*文件:记录写操作
3.fsimage_…*文件:记录元数据。一般称为检查点(注意:与内存中的元数据,并不是同步的)
4.工作机制
客户端请求写入HDFS
HDFS主NameNode节点生成一个edits*文件。
每次客户端写入HDFS,都会更新一次edits*文件。
当edits*达到以下任一条件,会更新到fsimage*下
空间维度。达到指定大小,默认64M时。在core-site.xml中指定。
时间维度。达到指定时间,默认1h时。在core-site.xmk中指定。
NameNode重启时。
强制重启。
注意:上步骤的更新过程由NameNode从节点进行。
5.此工作机制可以节省节点内存和CPU。不会造成浪费。
五、NameNode管理DataNode流程
1.心跳机制:DataNode每隔一段时间,会发生给NameNode一条信息。默认3s
当前节点状态(以下四种状态):
In Service
Dead(官方给的是Lost)
Prepare Service
退役
block信息
2.若NameNode长时间没有收到DataNode的信息,那么就认为DataNode信息丢失。默认10分钟(一般200次左右)。
3.若DataNode信息丢失,NameNode会将DataNode的数据再次备份到其他DataNode,以保证复本数量。
4.当NameNode重启或启动时:
将edits*中的操作重新写入fsimage*。
将fsimage*元数据加载到内存中
5.安全模式
在启动或者DataNode块损坏太多,HDFS会进入安全模式,安全模式无法进行任何操作
若DataNode心跳都成功或者失败的DataNode可进行修复,则自动退出安全模式。
若等待很久,数据可能无法恢复。此时可以强制退出安全模式(这件事在生产环境下不要做或者少做!!!)
tips1:4000~5000节点时,安全模式一般是30min~1h
tips2:因为有安全模式的问题,伪分布式下,复本数量必须为1。
六、复本放置策略
1.在Hadoop2.7版本以前
客户端不是当前DataNode
上传数据时,NameNode选择相对空闲的节点,存放第一个复本。
客户端是当前DataNode
上传数据时,第一个复本为当前节点。
第二个复本放在和第一个复本不同机架的节点上。
第三个复本放在和第二个复本相同机架的节点上。
超过三个复本,随机放
2.在Hadoop2.7版本以后
第一个复本放置策略不变
第二个复本放在和第一个复本相同机架的节点上
第三个复本放在和第二个复本不同机架的节点上
超过三个复本,随机放。
七、机架感知策略
1.前文所说的机架并不是物理结构,而是逻辑结构。
2.通俗一点说,就是一个简单的ip=>name的映射。
3.实际使用中,一般会将一个物理机架上的所有节点,放到一个逻辑机架上。
4.为什么这么放置?
防止同属一个物理机架的服务器宕机,导致我们的HDFS块文件丢失。这也是HDFS安全可靠的原因之一
八、数据节点(DataNode)
1.概念
DataNode存储数据,以block的形式存储
磁盘存储位置(参考):{hadoop.tmp.dir}/dfs/data/current/BP-419704509-127.0.0.1-1588068492492/current/finalized/subdir0/subdir0
2.DataNode会通过心跳机制发送给NameNode信息。心跳机制通过RPC方式发送信息。
十、NameNode从节点(Secondary NameNode)
1.与NameNode并不是严格意义上的主从关系。仅用来辅助NameNode进行元数据合并,不能做到和NameNode实时热备。
2.对集群影响不大,能起到一定的备份作用。
3.在Hadoop2.0以上,为了NameNode的热备,舍弃了Secondary NameNode。
十一、HDFS命令
1.hadoop fs
-rmdir {dir}:删除
-get {file}:下载
-cat {file}:查看
-ls {file}:查看子目录
-tail {file}:查看文件最后1k字节的数据
-mv {file} {file1}:file剪切、重命名到file1
-cp {file} {file1}:file复制到file1
-rm {file}:删除文件(默认情况,不可恢复。可通过配置回收站机制,让其可以恢复)
2.开启回收站功能的配置
vim core.site.xml:加入以下内容
`
<property>
<name>fs.trash.interval</name>
<value>1440</value><!--存储时间:分钟-->
</property>
`
十二、hdfs目录说明
1.存放目录:{hadoop.tmp.dir}
2.创建时机:在NameNode被格式化的时候产生
3.子目录
name:NameNode节点才会有
./in_use.lock:标记NameNode是否使用
data:DataNode节点才会有
namesecondory:SecondoryNameNode节点才会有
4.流程
HDFS在启动后,会将写操作记录到edits_inprogress
而这个文件大小固定位1M。若超过1M,则每次容量会增加1M(扩容)。
十四、HDFS流程
1.读流程
客户端发送请求(RPC)到NameNode中
NameNode收到请求后,进行以下几步校验
校验文件存在与否
tips1:利用网络拓扑来计算距离远近:离公共节点的距离
tips2:若最近的节点宕机,则会从新选择最近节点。
读完一个block,会依次读取下一个。直到所有block都读完。
tips:若文件足够大(几TB),NameNode会分几次返回block。
为了提高并发量和吞吐量。
NameNode要管理所有DataNode,降低NameNode工作任务,可以提高集群的稳定性。
2.写流程
客户端发起RPC请求到NameNode
该请求包含对文件信息的描述
NameNode收到请求后,进行以下几步校验
用户是否权限
检查是否有同名文件
tips1:在写的时候,复本如何放置,见前文所说的`复本放置策略`。
tips2:一个block默认三个复本,只有所有复本都返回正确的ACK信号,才会进行下一个block的复本放置
当写完所有的block都放置成功后,客户端通知NameNode关流,同时将该文件更改为不可再写。
3.删流程
客户端发起请求(RPC)到NameNode
NameNode收到请求后,进行以下几步校验
校验文件存在与否
校验客户端是否有删除权限
将操作记录到edits_inprogess中
删除内存中记录,并返回ACK信号,表示删除成功。
等待DataNode的心跳,如果该DataNode存在要删除的数据,则对该节点发送指令进行删除。
十五、HDFS特点
1.存储超大文件 - 分块
2.快速应对和检测故障 - 心跳
3.保证数据高可靠 - 复本
4.简易的一致性模型 - 一次写入,多次读取。在Hadoop2.0开始,允许追加。
5.支持横向扩展 - 能够另一些低廉的设备进行横向扩展
纵向:数量不变,提高性能
横向:增加数目,提高性能
6.不建议存储大量小文件
7.不支持低延迟访问
8.不支持事务