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上存储

posted @ 2020-04-13 17:12  Spaaacer  阅读(464)  评论(0)    收藏  举报