概述:
hdfs是用来做分布式存储的系统。
结构: hdfs使用的也是主从结构,主节点叫NameNode,从节点叫DataNode。
存储格式: hdfs会对存储的数据进行切块(block),以block的形式进行存储。
备份: hdfs会对存入其中的block进行备份(副本),HDFS中默认的副本策略是3,即需要复制2次,加上原来的副本构成3个副本 。
HDFS提供了一套类似于Linux的文件系统,即仿照Linux,允许用户产生不同的目录,同时为不同的路径设计权限。根路径是/
块(block):
Block是HDFS中的基本存储单位,即所有的数据都是以Block形式存储 。
每一个Block都会分配一个编号BlockID 。
block大小和切分原则: Block默认大小不超过128M(通过属性dfs.blocksize来调节,配置在hdfs-site.xml文件,单位是字节,如果不配置默认是134217728B) 。
如果上传的文件不足一个Block大小,那么这个文件是多大对应的Block就是多大。例如一个文件15M,那么对应的Block就是15M 。
block的时间记录: HDFS会记录每一个Block上传的时间,但是并不是直接记录时间,而是给时间戳一个编号Generation Stamp 。
存储位置: block存储于dataNode中,一个DataNode可能会存储很多个Block 。
主节点(NameNode):
作用: 管理从节点(dataNdoe),存储元数据。
元数据: 元数据是对数据进行描述的数据,元数据中不包含具体的数据内容。
数据描述包括以下内容:
1.文件的上传路径
2.上传的用户名以及对应的权限
3.文件的大小
4.Block的大小
5.文件和BlockID的映射关系
6.BlockID和DataNode的映射关系
7.文件的副本数量
NameNode存储元数据的位置: NameNode会将元数据维系在磁盘以及内存中
元数据的存储位置由属性hadoop.tmp.dir来决定,如果不配置则默认放在/tmp下,所以需要更改路径
cd /home/software/hadoop-2.7.1/etc/hadoop
vim core-stie.xml
和元数据相关的文件 :
在Linux中进入cd /home/software/hadoop-2.7.1/tmp/dfs
在tmp的dfs下有三哥文件夹,name是存元数据的,而data是存block的。
在Linux中进入cd /home/software/hadoop-2.7.1/tmp/dfs/name
然后使用ls命令,就可以看见如下:
edits:操作文件,用于记录HDFS的写操作
fsimage:元数据(映像)文件,用于记录HDFS的元数据
原数据更新过程:
当NameNode收到写操作的时候,先将写操作记录到edits_inprogress文件中,如果记录成功,则修改内存中的元数据,如果修改成功,则给客户端返回一个ack信号表示成功。注意,此时fsimage文件中的元数据并没有发生改变 。
当edits_inprogress文件达到指定条件的时候,产生一个新的edits_inprogress用来记录新的写操作,同时原来的edits_inprogress会滚动改名为edits,新生成的edits文件会将其中写操作全部取出重新执行,来更新fsimage中的元数据
edits_inprogress滚动为edits的条件:
空间:edits_inprogress文件达到指定大小(默认是64M,通过属性fs.checkpoint.size来调节,配置在core-site.xml,单位是字节)之后,会滚动生成edits
时间:当距离上一次滚动的间隔时间达到指定大小(默认是1h,通过属性fs.checkpoint.period来调节,配置在core-site.xml,单位是秒)的时候,edits_inprogress也会滚动
重启:当NameNode重启的时候,自动触发edits_inprogress文件的滚动
强制:通过hadoop dfsadmin -rollEdits来进行强制滚动
主节点(NameNode)管理从节点(dataNode):
- NameNode通过心跳机制来管理DataNode - DataNode会定时给NameNode发送心跳信息 。
- 心跳信息通过RPC方式发送 。
- 心跳间隔时间默认为3s,通过属性dfs.heartbeat.interval来调节,单位是秒 。
- 如果NameNode超过10min没有收到DataNode的心跳,则认为这个DataNode已经lost(丢失),那么会将这个DataNode上的block备份到其他节点上保证副本数量
心跳信息:
- clusterid: 集群编号。在NameNode被格式化(hadoop namenode -format)的时候,自动计算产生一个clusterid。NameNode会将clusterid发送给每一个DataNode,DataNode收到clusterid之后会存储在本地。之后DataNode和NameNode的每一次通信都需要携带clusterid。NameNode在收到DataNode的信号之后会先校验clusterid是否一致,如果不一致则直接抛弃。如果一致,NameNode才会处理DataNode的请求。DataNode只接收一次clusterid。NameNode每次格式化都会产生一个新的clusterid,如果NameNode被格式化多次,就会发现NameNode联系不上DataNode,此时通过jps命令查看,发现要么缺少NameNode要么缺少DataNode
- DataNode的节点状态:预服役、服役、预退役
- Block的存储信息: 实际上就是它的加密值,NameNode收到这个加密值之后会自己计算然后比较是否一致
安全模式:
NameNode在重启的时候,自动进入安全模式(safe mode)。如果在进行操作的时候发现HDFS处于安全模式中,那么需要等待一会儿,等它自动退出安全模式。如果在合理的时间内,HDFS没有退出安全模式,那么说明数据产生了无法挽回的丢失,此时只能强制退出安全模式:hadoop dfsadmin -safemode leave 。
- 当NameNode产生重启的时候,首先会先触发edits_inprogress文件的滚动,产生edits文件之后会更新fsimage文件中的元数据
- 当fsimage文件中的元数据更新完成之后,NameNode会将fsimage中的元数据加载到内存中
- 元数据加载完成之后,NameNode等待DataNode的心跳
- 如果NameNode没有收到DataNode的心跳,则会试图备份这个DataNode上的数据到其他的DataNode上
- 如果NameNode收到DataNode的心跳,则会进行校验,去校验Block信息(Block的数量、Block的大小等)
- 如果校验失败,则NameNode会试图恢复这个数据;恢复完成之后会再次校验
- 如果所有的DataNode都校验成功,则NameNode会自动退出安全模式
注意:在安全模式中,HDFS不对外提供写服务
block的副本存放机制:
在HDFS中,默认采用多副本机制,默认副本数量为3,通过dfs.replication属性来进行设置,配置在hdfs-site.xml中
策略:
第一个副本
如果是集群内部上传,则谁上传第一个副本就放在谁身上
如果是集群外部上传,则谁相对空闲就放到谁身上
第二个副本
Hadoop2.7之前:第二个副本是放在和第一个副本不同机架的节点上
Hadoop2.7开始:第二个副本是放在和第一个副本相同机架的节点上
第三个副本
Hadoop2.7之前:第三个副本是放在和第二个副本相同机架的节点上
Hadoop2.7开始:第三个副本是放在和第二个副本不同机架的节点上
更多副本:放置在相对空闲的DataNode上
从节点(dataNode):
作用: 存储数据,数据是以Block形式存在
DataNode将数据存储在磁盘上,在磁盘上的存储位置由属性hadoop.tmp.dir来决定
cd /home/software/hadoop-2.7.1/etc/hadoop
vim core-stie.xml
这个dir决定的是元数据和block的存储位置的
在Linux中查看block的存储位置:
首先需要使用cd /home/software/hadoop-2.7.1/tmp/dfs进入到dfs文件中。接着按照下面的图片描述,就可以找到block了。(后面会使用浏览器去看block)
dataNode发送心跳时的加密信息是什么?
DataNode会为每一个Block生成一个.meta文件,.meta实际上是对这个Block的校验:.meta文件中存储了一个校验值,这个校验值根据Block大小、生成时间、存储内容等信息进行非对称加密(默认是md5)计算出来的一个整数。DataNode给NameNode发送心跳的时候是包含这个加密值的 - 如果更改了Block的内容,那么.meta文件中的内容也会重新计算
hdfs的基本命令:
启动Hadoop:start-all.sh
可以通过ip:50070,使用浏览器访问hdfs,上传了一个txt文件。
hadoop fs -put /home/a.txt /b.txt
将/home/a.txt上传到HDFS的根目录下并且重命名为b.txt
hadoop fs -mkdir /log
在HDFS的/下创建子目录log
hadoop fs -get /a.txt /home
将HDFS的/a.txt下载到本地的/home目录下
hadoop fs -mv /a.txt /b.txt
重命名
hadoop fs -mv /a.txt /log/a.txt
剪切
hadoop fs -cp /a.txt /c.txt
复制
hadoop fs -chmod 777 /a.txt
修改权限
hadoop fs -ls /
查看/下的子文件和子目录
hadoop fs -lsr /
递归查看
hadoop fs -rm /a.txt
删除文件
hadoop fs -rmdir /test
删除目录,要求目录为空
hadoop fs -rmr /log
递归删除目录
回收站机制
1.在HDFS中,回收站机制默认是不开启的(即值默认为0),所以一个文件如果被删除,会立即从HDFS上移除,这个操作不可撤销
2.回收站机制需要core-site.xml中配置
<property>
<name>fs.trash.interval</name>
<value>1440</value>
</property>
1440表示允许在回收站零时存储1天,超过1天就永久删除