背景说明
Datanode存储多个块池的数据块,BlockPoolManager管理块池。
BlockPoolManager管理多个块池
BlockOfferService对象管理的单个块池
BlockServiceActor封装了对单个Namenode的操作
与Namenode交互
BockServiceActor与Namenode交互
- 心跳(heartbeat)
- 增量块(blockReceivedAndDeleted)
- 全量块(blockReport)
- 缓存块 (cacheReport)
具体的块操作,还是FsDatasetImpl,FsVolumeList,FsVolume,BlockPoolSplic实现
BlockServiceActor
与单个的Namenode通信,独立线程。
- NN握手,获得NS信息
- 向NN注册当前的DN
- 定向发送汇报信息
- 执行NN的指令
字段
- nnAddr
- state
NN状态 - bpos
上一级BPOfferService的引用 - lastBlockReport
- bpThread
- bpNamenode
NM RPC请求的代理 - dn,dnConf
DN对象的引用 - bpRegistration
- shouldServiceRun
- runningState
BPServiceActor状态,有CONNECTING,INIT_FAILED,RUNNING,EXITED,FAILED状态。 - pendingIncrementalBRperStorage
保存汇报之间的DN存储块变化
构造方法
BPServiceActor(InetSocketAddress nnAddr, BPOfferService bpos){
this.dn = bpos.getDataNode();
this.dnConf = dn.getDnConf();
}
start,stop,join方法用于启动BPServiceActor的工作线程
- start
BPOfferService调用,启动了直接返回,没启动守护线程的方式启动 - stop
BlocakPoolManager调用
shouldServiceRun设置为false,中断bpThread线程 - join
调用bpThread的join方法
工作线程的run方法
- BPServiceActor.connectToNNAndHandshake()
初始化BockPool存储
NN上注册当前Datanode - BPServiceActor.offerService
循环调用,一直到shouldRunService字段为false时停止
定期向NN发送汇报信息 - BPServiceActor状态机,表示线程的运行状态。
connectToNNAndHandshake
- 获取NN RPC代理
- 获取NS信息,确认NS信息
从NN获取NS信息
向BPOfferService确认NS信息,需要确认是否和之前NS一致(毕竟HA)
确认的是blockPoolId,nsId,Cluster是否一致 - DN初始化块池
初始化了DataStorage对象
FsDatasetImpl对象
BlockScanner对象
DirectoryScanner对象 - 注册
向BPOfferService注册
向NN注册
offerService
BPServiceActor的主方法,在DN关闭/客户端手动修改shouldOfferService参数时,停止。
- 定期发送心跳
默认3s
DN注册信息
DN存储信息
DN缓存信息
DN写文件连接数
DN读写使用的线程数
public HeartbeatResponse sendHeartbeat(DatanodeRegistration registration,
StorageReport[] reports,
long dnCacheCapacity,
long dnCacheUsed,
int xmitsInProgress,
int xceiverCount,
int failedVolumes) throws IOException;
- 心跳响应
包括DatanodeCommand数组
包括NNHAStatusHeartbeat对象
public class HeartbeatResponse{
private final DatanodeCommand[] commands;
private final NNHAStatusHeartbeat haStatus;
private final RollingUpgradeStatus rollingUpdateStatus;
}
- 心跳响应步骤
响应HA信息
bpos.updateActorStatesFromHeartbeat(),通过txid字段确定。
处理NN指令
processCommand(resp.getCommands());
这一部分是调用BPOfferService.processCommandFromActor()方法处理的。 - 汇报增加或者删除的block
300s
pendingIncrementalBRperStorage存储了DataStorage存储的两次汇报之间的数据块(发布响应模式)。
BPServiceActor提供了notifyNamenodeBlock方法,增加的话,立刻通知namenode(offerService方法)
notifyNmaenodeBlock(bInfo,storageUuid,now){
synchronized(pendingIncrementalBRperStorage){
addPendingReplicationBlockInfo();
sendImmediateIBR = true;
if(noew){
//唤醒offerService方法,汇报给NN
pendingIncrementalBRperStorage.notifyAll();
}
}
}
notifyNamenodeDeletedBlock()方法
- 数据块汇报
时间是6个小时,默认
调用DatanodeProtocol.reportReceivedDeleteBlocks()汇报最近添加删除的
FSDatasetImpl获取当前块池汇报信息 - 数据块汇报
cacheReport(10进行一次)
执行Namenode的携带指令 - 执行数据块扫描
- 线程睡眠等待
pendingIncrementalBRperStorage对象上等待,直到到期或者被唤醒(添加块) - 忽略异常
除了Datanode注册信息错误,不合法(不在include列表),VERSION信息错误外,忽略。
BPOfferService
BPOfferService管理一个NS在一个Datanode上的块池
BPOfferService管理两个BPServiceActor的引用。(HA)模式。
BPOfferService管理多个Namnode引用哪个是Active的。(bpServiceToActive)
维护一些重要的信息
服务块池NS信息,块池在NS上的注册信息(NS,ClusterID,BPID),Active信息。
字段
- NamespaceInfo bpNsInfo
当前BPOfferService服务的NS信息。握手得到 - DatanodeRegistration bpRegistration
Namenode上的注册信息,Datanode注册时得到 - DataNode dn
当前DataNode对象的引用 - BPServiceActor
- bpServices
当前命名空间中所有Namnode对应的BPServiceActor的列表。 - lastActiveClaimTxId
方法
- 触发汇报
trySendErrorReport
reportRemoteBadBlock
reportBadBlocks
调用BPServiceActor对象对应的方法,reportBadBlocks
BPServiceActor调用ClientProtocol.reportBadBlocks向NM汇报 - 添加和删除数据块
BPOfferService.notifyNamenodeReceivedBlock()
BPOfferService.notifyNamenodeDeletedBlock()
BlockPoolManager
负责和管理所有的BPOfferService实例,对外提供添加,删除,启动,停止,关闭BPOfferService类的接口。
字段
- bpByNameserviceId
id与BPOfferService映射 - bpByBlockpoolId
blockId与BPOfferService映射 - offerServices
管理的offerServices
方法
1) 构造队列
BlockPoolManager中是目前已经有的NS
命名空间列表中是DN配置的
这两个不匹配,将要变动的NS放入到 toAdd,toRemove,toRefresh队列中
2)处理队列
如果是Add的话文章来源:https://www.toymoban.com/news/detail-407293.html
- 构造对象,构造BPOfferService,构造BPServiceActor
- startAll启动工作线程
其他的也类似
总结
BlockPoolManager逻辑上管理块池.
BPOfferService 主要作用就是启动工作线程,确定Active NN,BPServiceActor对外封一下提供块汇报服务,添加删除数据块服务。
BPServiceActor具体起独立线程向NN心跳,汇报,执行命令NN的。文章来源地址https://www.toymoban.com/news/detail-407293.html
到了这里,关于HDFS学习笔记【Datanode/BlockManager】的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!