`
shenchunhui
  • 浏览: 147187 次
  • 来自: 杭州
社区版块
存档分类
最新评论

Hbase 源码分析之当regionserver挂掉以后

阅读更多
当Master通过ZK获知Regionserver挂掉以后,通过调用expireServer接口进行处理
public synchronized void Hmaster.ServerManager.expireServer(final HServerInfo hsi){
获取serverName
从onlineserverlist中获取serverinfo
如果serverinfo为空,则抛sever不在线上的警告,return
如果已经存在于deadservers中,则抛警告,return
加到deadservers中
从onlineservers中删除
删除与该server的rpc连接
如果集群处于关闭中,则return
通过CatalogTracker判断挂掉的server之前是否有分配root或meta region
然后分别调用
this.services.getExecutorService().submit(new MetaServerShutdownHandler(this.master,this.services, this.deadservers, info, carryingRoot, carryingMeta));
或者
1 this.services.getExecutorService().submit(ServerShutdownHandler(this.master,this.services, this.deadservers, info));
//这两者的区别是 MetaServerShutdownHandler恢复时需要assignRoot()或assignMeta()
}


1.ServerShutdownHandler的procss接口如下
public void ServerShutdownHandler.process(){
1.1 split hlog
    获取挂掉的regionserver上的regionstate列表
判断是否需要assign root 或者 meta region
while(!this.server.isStopped()){
  try{
     等待meta恢复
      通过meta表获取挂掉的regionserver上所有Hregioninfo信息hris
     break
}catch(){}
}
遍历获取到的regionstate列表,hris中删除那些state不是CLOSING且不是PENDING_CLOSE的region
遍历hris中的region:
    //如果region所在的表disable或者该region已经split 则返回否
    if(检查是否需要assign)
1.2      this.services.getAssignmentManager().assign(e.getKey(), true);
}


1.1 split hlog
public void hbase.master. MasterFileSystem. splitLog(final String serverName){
获取splitLog锁
获取hdfs中挂掉的regionserver的hlog目录所在位置(默认为.logs/servername)
创建对象HLogSplitter splitter
1.1.1 调用splitter.splitLog()切分hlog
释放splitLog锁
}


1.1.1 splitter.splitLog()
public List<Path> hbase.regionserver.wal.HLogSplitter.splitLog(){
检查是否hasSplit
hasSplit置为true
对hdfs上的hlog目录做一些检查,如是否存在,目录下是否存在文件,没问题的话就调用
1.1.1.a List<Path> splitLog(logfiles)
}


1.1.1.a splitlog时,会有一个entryBuffers,读线程从hlog中读取edit放入entryBuffers,而写线程则从中获取buffer,写到hdfs中对应的region目录下recover.edits目录中
private List<Path> hbase.regionserver.wal.HLogSplitter.splitLog(final FileStatus[] logfiles){
new两个list processedLogs和corruptedLogs 用于存放已正常处理的logs和已损坏的logs
获取是否skipErrors = conf.getBoolean("hbase.hlog.split.skip.errors", true);
//负责将entryBuffers中的数据写入到hdfs中各个region目录下的recover.edits目录中
启动写线程outputSink.startWriterThreads(entryBuffers);默认为3个("hbase.regionserver.hlog.splitlog.writer.threads", 3);
遍历logfiles中的logfile{
通过lease机制检查logfile是否能够append
解析logfile,将其中的内容加载到内存,即放入entryBuffers中
}
对logfiles进行归档,把有损坏并且跳过的移到.corrupt目录中 
把处理好的移到.oldlogs中,然后删除.logs/挂掉的regionserver目录
等待写线程完毕
返回新写的在region目录/recover.edits目录下的各个logfile路径
}


1.2 分配region,分配前先检查region所在的表是否disable和是否集群处于关闭中,是的话就跳过,不然就加到rit后(RegionInTransaction),开始分配
private void hbase.master.AssignmentManager.assign(final RegionState state, final boolean setOfflineInZK,final boolean forceNewPlan)
{
将region在zk上的状态置为offline
获取regionplan(将region随机分配给在线的一个regionserver)
将region状态置为PENDING_OPEN
1.2.1向regionserver发送openregion的rpc请求(regionserver调用openregionopenRegion(HRegionInfo region)接口)
}


1.2.1 openRegion处理
regionserver异步地执行openRegionHandler
regionserver到zk上将该region的状态置为RS_ZK_REGION_OPENING
master检测到zk上该region状态为RS_ZK_REGION_OPENING后,会将该region状态置为OPENING,并定期检查opening状态有没有timeout
hregion执行replayRecoveredEditsIfAny(),即从log中将数据还原到table中。方法是将log解析出来后写到内存中(store),然后累积到一定值后直接刷到磁盘上
更新META表,写入该region信息
到zk上将该region状态置为RS_ZK_REGION_OPENED
master检测到RS_ZK_REGION_OPENED后,再把region状态更新为OPEN
分享到:
评论

相关推荐

    HBase源码分析

    HBase源码分析揭示了HBase在RPC通信机制方面的一些关键技术点,这包括了角色分配、通信信道建立、通信接口协议定义、对象序列化、传输控制和会话管理,以及在传输过程中可能出现的错误处理和重试机制。 HBase中的...

    HBase源码分析与开发实战

    HBase源码分析与开发实战视频技术讲解高阶视频教程以及课件,内部讲解资料 内容非常详细 值得想要提高薪水的人去学习了解

    hbase源码分析

    ### HBase源码分析 #### 一、HBase性能测试要点与分析 ##### 1.1 测试环境 - **硬件配置**: - 客户端:1台 - RegionServer:5台 - Master:1台 - ZooKeeper:3台 - **软件配置**: - CPU:每台服务器配备8...

    【No0057】HBase源码解析与开发实战.txt

    ### HBase源码解析与开发实战 #### 一、HBase简介 HBase是一个分布式的、面向列的开源数据库,该技术来源于 Fay Chang 所撰写的 Google 论文 “Bigtable:一个结构化数据的分布式存储系统”。就像 Bigtable 利用了...

    hbase源码包和测试用例

    HBase的源码分析有助于理解其内部工作原理。例如,`HRegionServer`是数据服务的主要组件,负责Region的管理和数据操作;`HMaster`负责Region的分配和负载均衡;`HStore`管理Column Family,包含一系列的`HStoreFile...

    hbase 源码包

    HBase 0.94.4的源码分析有助于我们深入了解其内部机制,从而更好地进行系统设计和优化。无论是对于开发者还是管理员,掌握HBase的核心原理都将极大地提升在大数据领域的实践能力。通过不断学习和实践,我们可以更好...

    HBase实战源码

    源码分析是理解HBase工作原理和技术细节的重要途径。HBase在大数据领域扮演着关键角色,它能够处理海量数据并提供实时访问。下面,我们将深入探讨HBase的核心概念和源码中的关键组件。 1. **HBase架构**:HBase基于...

    hbase权威指南源码

    《HBase权威指南》是一本深入探讨Apache HBase这一分布式列式数据库的著作,源码则是作者为了辅助读者理解书中理论知识而提供的实践材料。HBase是构建在Hadoop文件系统(HDFS)之上的开源数据库,专为处理大规模数据...

    hbase源码带中文注释

    HBase是一种分布式、高性能、基于列族的NoSQL数据库,由Apache基金会开发并维护,它构建在Hadoop文件系统(HDFS)之上,为大数据处理提供了实时的数据存储和查询功能。"hbase源码带中文注释"的资源对学习和理解HBase...

    Hbase源码笔记资料.zip

    hive编译,jars,HBaseScanner构建.pptx,HBase之RegionServer命令启动流程.pptx,扩展.docx,尚硅谷大数据技术之HBase.xmind,尚硅谷大数据技术之HBase.pdf等等 很全。

    hbase-0.98.1源码包

    HBase是Apache软件基金会开发的一个开源、分布式、版本化、基于列族的NoSQL数据库,它构建在Hadoop文件系统(HDFS)之上,专为处理海量数据而设计。源码包“hbase-0.98.1-src.tar.gz”提供了HBase 0.98.1版本的完整...

    hbase性能调优

    `hbase.regionserver.global.memstore.upperLimit` 和 `hbase.regionserver.global.memstore.lowerLimit` - **含义**:分别定义了RegionServer所有MemStore占用内存的比例上限和下限。 - **默认值**:分别为0.4和...

    HBase源码(hbase-2.4.9-src.tar.gz)

    HBase源码(hbase-2.4.9-src.tar.gz)是一个分布式的、面向列的开源数据库,该技术来源于 Fay Chang 所撰写的Google论文“Bigtable:一个结构化数据的分布式存储系统”。就像Bigtable利用了Google文件系统(File ...

    Hbase权威指南 随书源代码 源码包 绝对完整版

    Hbase权威指南 随书源代码 源码包 绝对完整版 maven工程,带pom文件,可以直接作为一个完整工程导入eclipse等ide。

    HBase源代码 hbase-0.98.23

    `org.apache.hadoop.hbase.regionserver.StoreFile`类管理每个列族的HFile,当一个Region的大小达到预设阈值时,`org.apache.hadoop.hbase.regionserver.HRegion`会触发分裂过程,这涉及到`org.apache.hadoop.hbase....

    HBase性能深度分析

    然而,随着HBase在各行业的广泛应用,用户对其性能表现的关注日益增强,尤其是实时数据插入性能,成为衡量HBase效能的关键指标之一。本文将深入探讨HBase的性能测试细节,重点剖析数据插入性能,并通过实证分析揭示...

    HBase配置

    配置`hbase.regionserver.heapsize`和`hbase.master.heapsize`以设定RegionServer和Master的Java堆大小,根据集群规模适当调整。 7. **Region分裂策略** `hbase.hregion.max.filesize`定义一个Region的最大大小,...

Global site tag (gtag.js) - Google Analytics