Hadoop HDFS
一、概述
1.HDFS 是用于进行分布式存储的组件
2.根据Google的论文设计实现的
HDFS 特点:
(1)好处
1.能够存储超大文件 - 切块block
2.快速的应对和检测故障 - NameNode和DataNode之间的心跳检测
3.保证数据的高可用 - 副本备份
4.简易的一致性模型 - 一次写入多次读取,在Hadoop2.0开始,允许追加
5.能够利用低廉的设备来进行横向扩展
存储:纵向 - 在数量不变的前提下提供性能 性能和价钱--指数型
横向 - 可以增加数量 性能和价钱 - 线性型
(2)不建议
1.不建议存储大量小文件 - 因为每一个小文件会产生一个元数据,而元数据存在内存中和fsimage,而在内存中存储的数据有限
2.不支持低延迟访问 - 由于数据量很大
3.不支持事务
二、技术架构
(1)概述
1、在HDFS中,存在两类主要的节点:NameNode和DataNode
2、NameNode负责管理DataNode,DataNode负责存储数据
3、在存储数据的时候会将数据进行切块
4、为了防止产生数据丢失,会将数据进行备份,备份称之为副本 - replication(hdfs-site.xml文件)。
在Hadoop中默认副本数量为3,备份2次加上原来的数据共3个,伪分布式情况下值为1
(2)Block
1、在存储数据的时候,会将数据进行切块,每一块称之为是一个Block
2、Block是HDFS的基本存储单位
3、在Hadoop2.0版本中,每一个Block是 128M,可以通过dfs.blocksize来更改块的大小,在更改的时候,单位是字节
4、如果一个文件的大小不足128M,那么这个文件是多大,在HDFS上就占多大
5、在HDFS中,会对Block进行编号 - BlockID,第一个BlockID是随机创建的,后续的是全局递增的
6、将数据切块的意义:
a.便于存储超大文件
b.便于进行快速的备份
(3)NameNode
用于管理DataNode和记录元数据Meta
元数据Meta:
1.元数据:大小是150B左右
a.记录数据的虚拟存储路径
b.记录文件的切块数量
c.记录数据块的存储位置
d.记录数据块的副本数量
e.记录文件的权限
2.NameNode将元数据维系在内存以及磁盘中
3.元数据维系在内存中的目的是为了快速查询
4.元数据维系在磁盘中的目的是为了崩溃恢复
5.元数据的存储位置是由hadoop.tmp.dir(core-site.xml文件)属性决定的,如果不配置则默认使用 根目录下的 /tmp
6.元数据在磁盘汇总是以edits文件和fsimage文件的形式存在的
※edits:记录写操作
※fsimage:记录元数据,fsimage中的元数据和内存中的元数据并不是同步的
7.当NameNode接收到请求后,会先将该请求记录到edits_inprogress文件中,如果记录成功,则将该请求同步更新到内存中,修改内存中的元数据,内存修改完成之后会给客户端返回一个ack表示成功。为什么要先写edits_inprogress文件,再更新内存?如果先写内存,再写文件,此时挂了,会导致内存数据丢失,而先写磁盘文件,如果挂了,后面可以从磁盘文件中找寻回到内存中
8.在HDFS中,会给每一次的写操作分配一个编号 - 事务id - txid(Transaction ID) 如:edits_inprogress_0000000000000000022 后面的编号
9.当edits文件达到条件的时候,会将操作更新到fsimage文件中,修改fsimage文件中的元数据:
※空间维度:当edits_inprogress达到指定大小的时候就会触发更新,默认64M大小,由fs.checkpoint.size(core-site.xml)属性来指定,默认单位字节
※时间维度:当距离上一次更新时间达到指定时间间隔的时候,就会触发更新,默认1小时,大小可以由fs.checkpoint.period来指定,默认单位是秒
※重启更新:NameNode重启之后,会自动的将edits_inprogress中的操作更新到fsimage中
※强制更新:执行 hadoop dfsadmin - rollEdits 命令->强制更新操作
10.在更新的时候,会将edits_inprogress重命名为 edits_xxxxx_xxxxxx,如edits_0000000000000000003-0000000000000000021,同时产生一个新的edits_inprogress
11.在Hadoop中,如果存在SecondaryNameNode,则更新过程时发生在SecondaryNameNode上
12.在HDFS中,最核心的节点是NameNode,但是在Hadoop1.0版本汇总只有1个NameNode,
在Hadoop2.0版本中,进行了改变,完全分布式下,允许多设置一个NameNode,代价是丢掉SecondaryNameNode
13.HDFS在启动之后,将写操作记录到 edits_inprogress,edits_inprogress 初始化默认大为1M
管理DataNode
1.NameNode通过心跳机制来管理DataNode:DataNode每隔定长时间会给NameNode发送心跳信息
2.默认情况下,DataNode每隔3s给NameNode发送一条信息
3.如果NameNode长时间(默认10min)没有收到某个DataNode的心跳信息,则认为这个DataNode已经lost(丢失),此时NameNode会将这个DataNode中数据再次备份,保证副本数量
4.心跳信息:NameNode接收DataNode的心跳数据,a.当前 节点的状态 b.当前节点存放的数据块Block信息
5.NameNode重新启动之后,将edits中操作更新到fsimage中,将fsimage中的元数据加载到内存中,等待DataNode的心跳(如果DataNode没有心跳过来则要重新备份保证副本数量,校验数据总量),这个过程称之为是安全模式(safe mode)。如果所有的校验都成功了,HDFS会自动退出安全模式
6.因为在安全模式的问题,所以在伪分布式下,副本数量必须为1 - 如果副本数量不为1,则副本默认为3,则在重启NameNode的时候,
根据 "副本的放置策略"的原则,试图将副本备份为3,会失败,一直循环,会导致HDFS一直处于安全模式
(4)副本的放置策略
1.在HDFS中,默认多副本策略,副本数量为3
2.副本放置策略
a.第一个副本:如果是外部客户端上传数据,则此时NameNode会选择一个相对空闲的DataNode节点存放;
如果内部上传(DataNode部署的机器作为客户端),则第一个副本存放在本节点上
b.第二个副本:在Hadoop2.7之前,第二个副本要放在和第一个副本不同机架的节点上 (机架:请看"机架感知策略")
在Hadoop2.7之后,第二个副本放在和第一个副本相同机架的节点上
c.第三个副本:在Hadoop2.7之前,第三个副本要放在和第二个副本相同机架的节点上
在Hadoop2.7之后,第三个副本要放在和第二个副本不相同机架的节点上
d.更多副本:随机挑选空闲节点存放
(5)机架感知策略
1.在Hadoop中所指的机架并不是物理结构,而是逻辑上的结构
2.可以通过映射关系来指定节点对应的机架,也就意味着同一个物理机架上的节点可以映射到不同额逻辑机架上
3.实际使用中,一般会将一个或者几个物理机架上的所有节点放在一个逻辑机架上
(6)DataNode
1.用于存储数据,注意数据以Block形式存储
2.数据在DataNode上的存储位置由 hadoop.tmp.dir 属性决定,存储目录是
hadoop.tmp.dir属性值/dfs/data/current/BP-833565589-172.16.35.186-1592711419002(块池)/current/finalized/subdir0/subdir0
3.DataNode会通过心跳机制(RPC)来向NameNode发送心跳信息
(6)SecondaryNameNode
1. SecondaryNameNode 只是辅助NameNode进行元数据的合并
过程:将edits文件和fsimage文件拷贝到SecondaryNameNode上,然后将edits中的元数据合并到fsimage中,最后将合并好的数据返回到NameNode上
2.SecondaryNameNode 能起到一定备份的作用,但并不能做到和NameNode之间进行实时热备 - 在实际开发中,一旦利用到SecondaryNameNode进行备份,往往意味着数据已经产生了丢失,如:当SecondaryNameNode从NameNode上将edits和fsimage文件进行拷贝后,在将edits中的元数据合并到fsimage中的同时,NameNode还在接受请求操作,如果此时NameNode挂了,那么NameNode接收到的请求将会丢失,即请求中的数据会丢失。
3.在HDFS,最核心节点一定是NameNode,也因此在Hadoop2.0的完全分布式中,为了做到NameNode的热备,舍弃了SecondaryNameNode
(7)回收站机制
1.在HDFS中,回收站默认是不开启的,也就意味着一旦删除某个文件则这个文件就会被立即移除
2.可以通过 fs.trash.interval 来指定在回收站中停留的时间
开启回收站机制,需要停止hadoop后,修改配置文件 core.site.xml
<!-- 开启回收站策略,需要指定文件在回收站中停留的时间,默认单位是 min 分钟 -->
<!-- 被删除的文件在回收站中会停留1440分钟(1天),如果超过这个时间,回收站中的文件就会被删除--> <property> <name>fs.trash.interval</name> <value>1440</value> </property>
备注:
hadoop-env.sh - 环境变量
core-site.xml
fs.* 开头的属性
hadoop.* 开头的属性
hdfs-site.xml
dfs.* 开头的属性
mapred-site.xml
mapreduce.* 开头的属性
yarn-site.xml
yarn.* 开头的属性
slaves