概述
本文对HDFS进行一个系统性的介绍,以便hdfs的理论知识一个整体性的了解,内容包括架构组成、读写理论,元数据同步、读写时机架感知策略,以及namenode与datanode成员之间的通讯逻辑等。
之后在工作中遇到有关其他HDFS的问题再详细、针对性地讨论。
文章目录
- 一. HDFS概述
- 1. HDFS特点
- 2. HDFS的组成架构
- 3. 文件块大小
- 二. HDFS的读写理论
- 1. 读写流程
- 1.1. 读数据流程
- 1.2.写数据流程
- 2. 最近距离是怎么计算的
- 3. 机架感知策略
- 三. HDFS成员相关理论
- 1. NameNode和SecondryNameNode的元数据管理
- 2. DataNode 与 NameNode
- datanode和namenode
- 心跳机制
- 数据完整性校验
一. HDFS概述
1. HDFS特点
特点 | 说明 |
---|---|
冗余容错,多副本提高可靠性 |
数据丢失自动恢复。在廉价的机器上,通过冗余来稳定集群,即使时常故障也没有问题
|
适合大数据,不适合小文件 |
小文件存储会增加name node的压力,甚至小文件存储的寻址时间会超过读取时间
|
不支持并发写入、文件随机修改 |
一个文件只能有一个线程写 ;仅支持数据append(追加),不支持文件的随机修改
|
处理数据延迟高 |
不适合低延迟毫秒的数据存储
|
简单来说HDFS适合大文件存储,通过冗余提高了可靠性;小文件对HDFS不友好,因为会增加HDFS的寻址时间。写文件到HDFS中时,不能并发写入近支持追加,所以对于数据处理时效性不高。
2. HDFS的组成架构
成员 | 作用 |
---|---|
NameNode |
处理客户端读写请求、管理namespace、配置副本策略:数据怎么存储和备份、管理block的映射信息
|
DataNode |
block的读写操作、存储block
|
Secondary NameNode |
不是standbyNameNode,主要是辅助nn,比如定期合并Fsimage和Edits,并推送给nn
|
client |
1. 文件切分:文件上传前切块,然后分块上传。
2. 与namenode通讯进行读写请求,会获取文件信息,
3. 当nn允许client读写时,client和datanode开始交互进行读写;
4. 提供shell及api等操作入口
|
在NameNode中的Namespace管理层是负责管理整个HDFS集群文件系统的目录树以及文件与数据块的映射关系。如下Namespace的内存结构:
以上是一棵文件目录树,可见Namespace本身其实是一棵巨大的树。在这棵树中INodeFile表示文件,INodeDirectory表示文件目录。在HDFS中的实现中,INodeFile和INodeDirectory都是继承INode的。
3. 文件块大小
默认hadoop2.x/3.x是128M,1.x是64M。
当寻址时间为文件传输是传输时间的1%,则认为是最佳状态。目前磁盘的传输速度为100MB/s
为什么块不能设置太小,也不能设置太大?
程序在下载块的时候分为寻址和数据传输两个步骤,如果块设置的太小,则总寻址时间增加;太大从磁盘的传输时间长,不利于程序数据处理。所以:block大小的设置主要取决于磁盘传输到速度。
二. HDFS的读写理论
1. 读写流程
1.1. 读数据流程
简单的说:client向namenode发送rpc请求,nn查找文件的元数据信息返回给client,client向就近(之后随机)的一台datanode发起读取数据的请求,然后下载数据。
数据传输:
- 客户端以packet为单位接收,先存在本地缓存,然后写入目标文件。
- 客户端读完一个块之后关闭链接,然后就近读取下一个文件块;如果列表没读完,会继续向NN请求
- 每读完一个block都会进行checksum的校验,校验不通过,client通知NN,然后从副本块的datanode继续读。
1.2.写数据流程
简单的说:
client首先向nn发起写请求,nn进行一系列校验之后返回是否可以上传,然后client发起上传第一个块的请求,nn返回datanode列表,client和dn建立连接然后进行数据传输与数据备份。传递完之后向nn请求上传第二个块,然后重复前面的操作。
详细地:
- 两次请求:
- 第一次NN判断(权限、目录是否存在)是否能够上传;
- 第二次NN计算文件切块(200M/128M=2),获取副本信息(dfs.replication=3),并返回写节点信息给client做上传准备。
- client上传前的准备:
- 对文件进行逻辑切块
- 上传前建立pipeline,client启动一个阻塞进程,直到所有的DataNode都完成响应。
- 开始上传:
- 文件块以packet为单位进行上传
- DN3接收client的数据,每接收完一个packet,client向DN3传递下一个packet,同时DN3传数据传给DN2…DN2再传给DN1,直到传递完这个块,关闭当前pipeline。
- 重复上传步骤。
2. 最近距离是怎么计算的
最近距离是hadoop采用的一种衡量带宽能力的近似方法
网络带宽是指在单位时间(一般指的是1秒钟)内能传输的数据量。
Hadoop将整个集群理解为树形结构,树的每个叶子节点代表集群中的每个机器,把数据中心(center)、机架(rack)和节点(node)分别映射到不同的层次。如下图
节点距离计算:两个节点到达最近的共同祖先的距离总和。
通过上述方式可以近似判断两个节点之间的带宽情况:
- distance(/d1/r1/n1, /d1/r1/n1) = 0 (同一节点上的两个应用程序,最近共同祖先都在本节点,距离为0)
- distance(/d1/r1/n1, /d1/r1/n2) = 2 (同一机架上的两个节点)
- distance(/d1/r1/n1, /d1/r2/n3) = 4 (同一数据中心里不同机架上的两个节点)
- distance(/d1/r1/n1, /d2/r3/n4) = 6 (不同数据中心的两个节点)
3. 机架感知策略
机架感知策略可以减少机架间写流量的情况,提高写性能。又因为机架故障的概率远小于节点故障的概率,所以该策略不影响数据可靠性和可用性。
策略具体描述为:
- 第一个副本在Client所在节点,如果client在集群外,随机选择一个
- 第二个副本在另一个随机机架的随机节点上
- 第三个副本在第二个副本所在机架剩余节点
三. HDFS成员相关理论
1. NameNode和SecondryNameNode的元数据管理
元数据信息包括:抽象目录树、文件和块、块和节点的对应关系。
集群的启动顺序:nameNode -> dataNode -> secondaryNameNode。
元数据交互过程
- nn启动时,会加载元数据文件(Fsimage和edits)到内存中,同时接收dataNode汇报的心跳和block的位置信息,将block位置信息加载到内存。
- 当写流程造成元数据更新时,dn通知nn什么文件的第几个block进行了上传,nn修改元数据内存,并写到本地文件(edits)中。
- snn会定期向nn询问是否触发checkpoint操作,触发之后,nn会滚动正在写的edits,即从edits_inprogress_xxx 到 edits文件 ing。接着将edits和fsimage拷贝到snn。snn进行合并,生成新的 fsimage.chkpoint,然后拷贝到nn,nn将 fsimage.chkpoint重命名为fsimage。
相关文件介绍
文件类型 | 介绍 |
---|---|
fsimage | 元数据镜像 |
edits | 操作日志文件[事务文件],这里面会实时记录用户的所有操作,会定时合并到fsimage |
seen_txid | 是存放事务id的文件,format之后是0,它代表的是检查点正常结束roll的edits事务id |
为什么有时读取文件速度大于网络带宽?
由于目前只有三台服务器,且有三个副本,数据读取就近原则,相当于都是读取的本地磁盘数据,没有走网络。
2. DataNode 与 NameNode
datanode和namenode
A. dn启动后向nn注册
B. 定时报告心跳给nn,心跳检测机制判断dn是否挂掉
C. 每6小时上报所有的块信息
心跳机制
当因为dn宕机或者是网络故障,nn不会马上判断dn挂掉,而是通过计算TimeOut判断。
TimeOut = 2A +10B
A=dfs.namenode.heartbeat.recheck-interval 默认5分钟 心跳检查间隔
B=dfs.heartbeat.interval 默认3秒,心跳间隔
数据完整性校验
Dn读取block时,会计算checkSum值,如果和创建时不一致则判断文件损坏。
Dn会定期校验block的checkSum值。
最后
以上就是寒冷云朵为你收集整理的【基础理论】hadoop基础(一):HDFS系统性介绍:HDFS组成架构、读写理论、机架感知、心跳策略等一. HDFS概述二. HDFS的读写理论三. HDFS成员相关理论的全部内容,希望文章能够帮你解决【基础理论】hadoop基础(一):HDFS系统性介绍:HDFS组成架构、读写理论、机架感知、心跳策略等一. HDFS概述二. HDFS的读写理论三. HDFS成员相关理论所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复