HDFS相关概念
HDFS相关概念
Block是什么
1. Block是HDFS中数据存储的基本单位,即一个文件在HDFS中是由一个或者多个Block构成
2. Block的大小默认是128M,通过dfs.blocksize(hdfs-site.xml)来调节大小,单位是字节
3. 如果一个文件本身不到一个Block的大小,那么这个文件是多大则对应的Block就是多大。例如,一个文件是10M大小,则其对应的Block就是10M
4. HDFS会对Block进行编号 - Block ID
5. 切块的意义:
a. 能够存储超大文件
b. 能够进行快速的备份
NameNode是什么
1. NameNode是HDFS的主(核心)节点
2. NameNode的职责:
a. 管理DataNode
b. 记录元数据(metadata)
3. 元数据主要包含:
a. 文件的存储路径
b. 文件的权限
c. 文件大小
d. Block的大小
e. Block ID
f. 副本数量
g. BlockID和DataNode的映射关系,注意,默认情况下,一个BlockID对应三个DataNode的地址
4. 元数据是存储在内存以及磁盘中
a. 在内存中的目的是为了查询快
b. 在磁盘中的目的是为了崩溃恢复
5. NameNode的元数据在磁盘上的存储位置由hadoop.tmp.dir属性来决定
6. 元数据的存储文件:
a. edits:记录写操作的文件
b. fsimage:映像文件。记录元数据。需要注意,这个文件中的元数据和内存中的元数据并不是同步的
7. 当NameNode收到请求之后,将请求记录到edits_inprogress文件中,如果记录成功,则修改内存中的元数据,内存修改完成之后会给客户端返回一个ack信号,此时fsimage文件中的元数据是没有修改的
8. fsimage的更新/edits文件的滚动:
a. 空间:当edits文件达到指定大小(默认是64M,可以通过fs.checkpoint.size来调节)的时候,会产生滚动,将操作执行更新fsimage
b. 时间:距离上一次更新达到指定的时间(默认是3600s,可以通过fs.checkpoint.period来调节)之后,也会产生edits文件的滚动
c. 重启:当NameNode重启的时候,会触发edits文件的滚动,将操作执行更新到fsimage文件中
d. 强制:hadoop dfsadmin -rollEdits
9. edits_inprogress文件在滚动之后会产生一个新的edits以及一个新的edits_inprogress
10. NameNode通过心跳机制来管理DataNode
11. 默认情况下,DataNode每隔3s会给NameNode发送心跳,实际过程中,这个间隔时间会设置在10-30s之间(通过dfs.heartbeat.interval来调节,单位是s)
12. HDFS的心跳机制是通过RPC来实现的
13. 默认情况下,NameNode超过10min没有收到DataNode的心跳,则认为这个DataNode已经lost(丢失),NameNode会将这个DataNode的数据重新备份到其他节点上保证副本数量
14. 心跳信息:
a. 当前DataNode的状态(预服役、服役、预退役、退役)
b. 当前DataNode存储的Block ID
15. 当HDFS重新启动的时候,NameNode中的edits文件滚动,fsimage文件更新,NameNode会将fsimage中的元数据加载到内存中,然后等待DataNode的心跳。如果,没有接收到部分DataNode的心跳,则会将这一部分DataNode的数据进行重新备份。如果收到DataNode的心跳,NameNode会对DataNode的Block进行校验。这个过程称之为NameNode的安全模式
16. 安全模式中,如果校验成功,NameNode会自动退出安全模式;如果校验失败,NameNode会试图去恢复数据,然后重新校验
17. 如果在不合理的时间内,HDFS依然没有退出安全模式,则意味着数据产生了丢失,此时需要强制退出安全模式:hadoop dfsadmin -safemode leave
18. 也正是因为安全模式的存在,所以要求在伪分布式中,副本数据必须为1 - 因为安全模式的校验,所以副本数量不能超过节点数量
19. 安全模式中,HDFS只对外提供读服务不提供写服务
副本放置策略
1. 第一个副本:
a. 集群内部上传:谁上传第一个副本就放在谁身上
b. 集群外部上传:NameNode会挑选一个相对空闲的节点来存储数据
2. 第二个副本:
a. Hadoop2.7以前:第二个副本是放在和第一个副本不同机架的节点上
b. Hadoop2.7开始:第二个副本是放在和第一个副本相同机架的节点上
3. 第三个副本:
a. Hadoop2.7以前:第三个副本是放在和第二个副本相同机架的节点上
b. Hadoop2.7开始:第三个副本是放在和第二个副本不同机架的节点上
更多副本:放在相对空闲的节点上
机架感知策略
1. 所谓的机架本质上是一个Map映射,IP或者主机名作为键,机架作为值来使用
2. HDFS中所有的机架指的不是物理机架而是逻辑机架
3. 可以将不同物理机架上的节点配置在同一个逻辑机架上
实际过程中,往往是将同一个物理机架上的节点配置在同一个逻辑机架上
DataNode
1. 作用:存储Block
2. DataNode将Block存储在磁盘上,在磁盘上的位置由hadoop.tmp.dir属性来决定,会在dfs/data目录下
3. DataNode会定时的向NameNode发送心跳
DataNode存在4种状态:预服役、服役、预退役、退役
SecondaryNameNode
1. SecondaryNameNode并不是NameNode的备份,而是辅助NameNode进行edits文件的滚动
2. 当存在SecondaryNameNode的时候,edits文件的滚动过程是发生在SecondaryNameNode上;如果没有SecondaryNameNode,则edits文件的滚动是发生在NameNode上.到目前为止,HDFS集群只能是NameNode+SecondaryNameNode结构或者是双NameNode结构,实际过程中采用双NameNode结构而抛弃掉SecondaryNameNode
回收站
1. 在HDFS中,回收站策略默认是不开启的,即意味着删除文件这个操作会立即生效并且不能撤销
2. 如果需要开启回收站策略,那么需要在core-site.xml中进行配置:
<!-- 配置回收站垃圾清理的间隔时间,单位是min -->
<!-- 表示垃圾放入回收站中会暂存1天,如果超过1天还没有还原则会被清理 -->
<property>
<name>fs.trash.interval</name>
<value>1440</value>
</property>
如果需要将数据从回收站还原,使用的是hadoop fs -mv
HDFS相关目录说明
1. dfs目录是在格式化的时候出现
2. 实际过程中,data、name、namesecondary应该是出现在不同的节点上
3. in_use.lock表示当前主机已经启动了对应的进程,防止重复启动
4. HDFS会将每一次的写操作看作一个事务,然后分配一个全局递增的事务id - txid
5. 在HDFS第一次启动之后,隔1min自动进行一次edits文件的滚动,之后就按照指定的时间间隔进行滚动
6. edits文件的转化命令:
hdfs oev -i edits_0000000000000000003-0000000000000000010 -o edits.xml
7. 所有的edits文件的开头都是OP_START_LOG_SEGMENT,所有的edits文件的结尾都是OP_END_LOG_SEGMENT
8. 上传文件:
a. OP_ADD:表示在HDFS上创建一个同名._COPYING_文件
b. OP_ALLOCATE_BLOCK_ID:分配BlockID
c. OP_SET_GENSTAMP_V2:分配时间戳编号
d. OP_ADD_BLOCK:利用流将数据写到DataNode的Block中
e. OP_CLOSE:关流
f. OP_RENAME_OLD:重命名
9. 文件上传完成之后不能修改
10. fsimage_XXXX.md5会利用md5算法对fsimage_XXXX进行校验。即当fsimage文件被认为改动之后,那么校验就会失败
11. VERSION:
a. clusterID:在NameNode被格式化的时候自动计算产生。每格式化一次,都重新计算一次。NameNode会将clusterID分发给每一个DataNode,注意,每一个DataNode只接收一次clusterID
b. storageType:节点类型
c. blockpoolID:块池编号
HDFS相关流程说明
上传流程/写流程
1. 客户端发起RPC请求到NameNode
2. NameNode收到请求之后,会进行校验:
a. 校验指定目录是否有写权限
b. 校验指定目录下是否有同名文件
3. 如果校验失败则直接报错;如果校验成功,NameNode会给DataNode返回消息允许写入
4. 客户端收到请求之后,会将文件切块,向NameNode要第一个Block的地址
5. NameNode收到请求之后,等待DataNode的心跳,然后选定DataNode,将地址放入队列中返回给客户端
6. 客户端收到队列之后,从队列中将地址取出(默认是3个),从中选取较近的节点将第一个副本写入,第一个副本所在的节点通过pipeline(管道,本质上就是一个NIO中的Channel)将第二个副本写入到对应节点上,第二个副本所在的节点通过pipeline将第三个副本写入到对应节点上;如果写入成功,则第三个节点会给第二个节点返回ack,第二个节点给第一个节点返回ack,第一个节点给客户端返回ack
7. 客户端会向NameNode要下一个Block的地址,写入数据
8. 当写完所有的Block之后,客户端会给NameNode发送结束信号,NameNode就会关闭文件,实际上就是关流,此时文件关闭之后这个文件就不能更改
下载流程/读流程
1. 客户端发起RPC请求到NameNode
2. NameNode收到请求会查询元数据,检查要读取的路径是否正确,如果正确,会将这个文件的第一个Block对应的地址放入一个队列中返回给客户端
3. 客户端收到队列之后,从队列中取出全部地址,会从这些地址中选取一个较近的节点进行读取
4. 客户端读取第一个Block,读完第一个Block之后,会对这个Block进行校验,如果校验失败,客户端会先给NameNode发送报告信息,然后重新选取一个节点重新读取重新校验
5. 如果校验成功,客户端向NameNode发送请求获取下一个Block的地址,然后继续读取
6. 如果全部读取完成,那么客户端会通知NameNode关闭文件,实际上就是关流
删除流程
1. 客户端发起RPC请求到NameNode
2. NameNode收到请求之后,校验权限,如果校验成功,则NameNode会从元数据中删除掉对应的数据,然后给客户端返回一个ack(确认字符)表示成功。注意,此时文件对应的数据没有真正删除依然在DataNode上存储

浙公网安备 33010602011771号