概述:

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

Hadoop HDFS 文件备份 hdfs默认备份_linux


和元数据相关的文件 :

在Linux中进入cd /home/software/hadoop-2.7.1/tmp/dfs

在tmp的dfs下有三哥文件夹,name是存元数据的,而data是存block的。

Hadoop HDFS 文件备份 hdfs默认备份_大数据_02


在Linux中进入cd /home/software/hadoop-2.7.1/tmp/dfs/name

然后使用ls命令,就可以看见如下:

Hadoop HDFS 文件备份 hdfs默认备份_Hadoop HDFS 文件备份_03


edits:操作文件,用于记录HDFS的写操作

fsimage:元数据(映像)文件,用于记录HDFS的元数据

原数据更新过程:
当NameNode收到写操作的时候,先将写操作记录到edits_inprogress文件中,如果记录成功,则修改内存中的元数据,如果修改成功,则给客户端返回一个ack信号表示成功。注意,此时fsimage文件中的元数据并没有发生改变 。

Hadoop HDFS 文件备份 hdfs默认备份_大数据_04


当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只接收一次clusteridNameNode每次格式化都会产生一个新的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的存储位置的

Hadoop HDFS 文件备份 hdfs默认备份_Hadoop HDFS 文件备份_05


在Linux中查看block的存储位置:

首先需要使用cd /home/software/hadoop-2.7.1/tmp/dfs进入到dfs文件中。接着按照下面的图片描述,就可以找到block了。(后面会使用浏览器去看block)

Hadoop HDFS 文件备份 hdfs默认备份_大数据_06


dataNode发送心跳时的加密信息是什么?

DataNode会为每一个Block生成一个.meta文件,.meta实际上是对这个Block的校验:.meta文件中存储了一个校验值,这个校验值根据Block大小、生成时间、存储内容等信息进行非对称加密(默认是md5)计算出来的一个整数。DataNode给NameNode发送心跳的时候是包含这个加密值的 - 如果更改了Block的内容,那么.meta文件中的内容也会重新计算

hdfs的基本命令:

启动Hadoop:start-all.sh

可以通过ip:50070,使用浏览器访问hdfs,上传了一个txt文件。

Hadoop HDFS 文件备份 hdfs默认备份_元数据_07

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天就永久删除