HDFS学习笔记【Datanode/BlockManager】

背景说明

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的话

  • 构造对象,构造BPOfferService,构造BPServiceActor
  • startAll启动工作线程
    其他的也类似

总结

BlockPoolManager逻辑上管理块池.
BPOfferService 主要作用就是启动工作线程,确定Active NN,BPServiceActor对外封一下提供块汇报服务,添加删除数据块服务。
BPServiceActor具体起独立线程向NN心跳,汇报,执行命令NN的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值