hbase 源码解析之master篇1

master启动过程:

-->首先初始化HMaster
    -->创建一个rpcServer,其中并启动
       -->启动一个Listener线程,功能是监听client的请求,将请求放入nio请求队列,逻辑如下:
           -->创建n个selector,和一个n个线程的readpool,n由"ipc.server.read.threadpool.size"决定,默认为10
           -->读取每个请求的头和内容,将内容放入priorityQueue中
       -->启动一个Responder线程,功能是将响应队列里的数据写给各个client的connection通道,逻辑如下:
           -->创建nio selector
           -->默认超时时间为15 mins
           -->依次将responseQueue中的内容写回各通道,并关闭连接
              -->buffer=8k(代码写死)
           -->如果该请求的返回没有写完,则放回队列头,推迟再发送
           -->对于超时未完成的响应,丢弃并关闭相应连接
       -->启动N(n默认为10)个Handler线程,功能是处理请求队列,并将结果写到响应队列
           -->读取priorityQueue中的call,调用对应的call方法获得value,写回out并调用doRespond方法,处理该请求,并唤醒writable selector
       -->启动M(m默认为0)个Handler线程以处理priority
    -->注册zookeeper watcher

-->block直至成为active master 
    -->先检查配置项"hbase.master.backup",自己是否backup机器,如果是则直接block直至检查到系统中的active master挂掉(默认每3分钟检查一次) 
    -->否则,注册zookeeperwatcher,如果注册成功则成为active master,否则阻塞并反复通过watcher检查在运行的master是否挂掉或stop状态

-->进入finishInitialization()函数并初始化master: 
    -->先检查hbase版本,如果是第一次启动hbase,则将版本信息写入/hbase/hbase.version,如果下次启动时这个文件不存在,则无法启动!如果不小心删掉了必须自己写一个版本信息上去 
    --> 检查和保证rootregion的完好,如果root region还不存在,则创建rootregion以及第一个meta region 
    -->创建HConnectionImplementation实现的连接 
    -->创建servermanager,后续绝大部分master工作都是通过servermanager完成的 
    -->创建并启动CatalogTracker线程,用以跟踪root和meta两个特殊table的状态,它内部又启动RootRegionTracker和MetaNodeTracker两个线程

-->创建并启动RegionServerTracker线程,用以跟踪所有online region的状态,一旦有node delete状态则会通知server manager将其注销

CatalogTracker AssignmentManager RegionServerTracker DrainingServerTrackerClusterStatusTracker

-->创建并启动ClusterStatusTracker线程,用以跟踪整个cluster的up和down状态 
    -->向zookeeper注册AssignmentManager,用以管理region的分配 
    -->创建线程池ExecutorService,在其中运行以下线程 
       MASTER_META_SERVER_OPERATIONS 
       MASTER_SERVER_OPERATIONS 
        MASTER_CLOSE_REGION 
        MASTER_OPEN_REGION 
        MASTER_TABLE_OPERATIONS

hbase.master.executor.openregion.threads5 
hbase.master.executor.closeregion.threads 5 
hbase.master.executor.serverops.threads  3 
hbase.master.executor.serverops.threads  5
CreateTableHandler
DeleteTableHandler
EnableTableHandler
DisableTableHandler
ModifyTableHandler
       --> 以守护方式运行LogCleaner线程,作用是每1分钟清理(.oldlogs)目录
       --> 启动一个http server:InfoServer,作用是在60010端口上提供界面展示
       --> 允许在初始化HMaster类时启动的Handler线程开始提供响应(通过开关标志)
    -->然后master需要等待regionserver的报告,满足以下这些条件后返回当前所有region server上的region数后继续: 
       a 至少等待4.5s("hbase.master.wait.on.regionservers.timeout") 
       b 成功启动regionserver节点数>=1("hbase.master.wait.on.regionservers.mintostart") 
       c 1.5s内没有regionsever死掉或新启动("hbase.master.wait.on.regionservers.interval")

-->然后splitLogAfterStartup,从hlog中恢复数据,这是一个很长的逻辑: 
        -->依次检查每一个hlog目录,查看它所属的region server是否online,如果是则不需要做任何动作,region server自己会恢复数据,如果不是,则需要将它分配给其它的region server 
        -->split是加锁操作: 
        --> 创建一个新的hlogsplitter,遍历每一个server目录下的所有hlog文件,依次做如下操作。(如果遇到文件损坏等无法跳过的错误,配 置"hbase.hlog.split.skip.errors=true"以忽略之) 
        -->启动"hbase.regionserver.hlog.splitlog.writer.threads"(默认为3)个线程,共使用128MB内存,启动这些写线程 
        -->先通过lease机制检查文件是否能够append,如果不能则死循环等待 
        -->把hlog中的内容全部加载到内存中(内存同时被几个写线程消费) 
             -->把有损坏并且跳过的文件移到/hbase/.corrupt/目录中 
             --> 把其余己经处理过的文件移到/hbase/.oldlogs中,然后删除原有的server目录 
             --> 等待写线程结束,返回新写的所有路径 
       -->解锁
    写线程逻辑: 
        -->从内存中读出每一行数据的key和value,然后查询相应的region路径。如果该region路径不存在,说明该region很可能己经被split了,则不处理这部分数 据,因为此时忽略它们是安全的。 
        -->如果上一步能查到相应的路径,则到对应路径下创建"recovered.edits"文件夹(如果该文件夹存在则删除后覆盖之),然后将数据写入该文件夹

-->完成splitHlog的操作后,开始分配root和meta表: 
      -->分配root表: 
          -->block住直到root的region server从transaction状态中恢复正常 
          -->检查root的region server在zookeeper中是否己经有值并且正常可访问,如果不正常或没有则删除原有节点再重新分配(随机分配) 
      --> 分配meta表: 
         -->过程同root表的分配

-->如果启动后online的region servers上的regions总数为0,则表示这是个fresh start,清除掉zookeeper上的所有节点,重新开始watching 
         --> 开始分配user表 
              -->扫描meta中的所有表,依次分配,分配方案如下: 
                   -->如果"hbase.master.startup.retainassign"为true(默认为true),则分配时按meta表中原有的信息来分配,即原来在哪里就还分到哪里,如果哪个region在原有的 server info中找不到所属的region server则从online region server中随机挑选 
                   -->否则随机循环添加region,会保证balance 
             -->分配方案设计好后,开始执行分配的线程,默认超时时间10分钟 
   -->如果启动后online的region servers不为0,则表示很可能master挂掉过,可能是重新启动的。此时系统中己有region servers了,需要先处理region server上的regions: 
        -->转入processFailover处理流程
           -->先调用rebuildUserRegions函数,它扫描.META.表,更新所有的server和对应的regionInfo信息,找出offline的server,加入deadServers
           -->处理deadServers
              -->遍历所有的region,在zk上创建它们的node,把它们加入transition和unassign列表,并置状态为offline
              -->调用ServerShutdownHandler的processDeadRegion方法,处理所有dead regions
                  -->跳过所有disabled的table对应的region
                  -->查看该region是否己经split,如果是,需要fix它的子region
                     -->查看子region的info是否找不到了,如果是的话修补之(即重新将meta表中的region信息添加进来并assign它)
           -->然后扫描zk中的transition列表,对不同的事件做不同处理
              -->RS_ZK_REGION_CLOSING:将它简单添加到regionsInTransition队列中
              -->RS_ZK_REGION_CLOSED:将它添加到regionsInTransition队列中并且创建一个ClosedRegionHandler线程去处理它
                  -->ClosedRegionHandler流程:
                     -->按root/meta/user region分优先级
                     -->如果这个region对应的table己经disabled或disabling,那么下线它并返回
                     -->下线这个region,然后再将它分配给一个server(不太明白为什么此时需要assign一次)
              -->M_ZK_REGION_OFFLINE:同上
              -->RS_ZK_REGION_OPENING:将它简单添加到regionsInTransition队列中
              -->RS_ZK_REGION_OPENED:将它添加到regionsInTransition队列中,如果它对应的原来的RS还存在,则创建一个OpenedRegionHandler线程来处理,否则不处理,等待meta扫描时去分配它
                  -->OpenedRegionHandler流程:
                     -->按root/meta/user region分优先级
                     -->先删除zk中己经打开的对应的node
                     -->上线这个region
                     -->如果这个region对应的table己经disabled或disabling,那么unassign它

--> 启动balancer线程并放入守候线程,默认循环时间为300秒 
    -->balancer线程的作用是定期均衡所有regionserver上的region数量,工作过程如下: 
        -->三种情况不进行balance: 
            -->balance开关没有打开(硬编码打开了) 
             -->有至少一个region正处于regionsInTransition状态(split结束但还没有清除) 
             -->有正在下线处理的region server 
        --> 制定出balance计划: 
             -->计算总的region数目,以及online server数量,每个server的region数目都会均衡到平均数。 
        -->执行balance计划: 
             --> 将执行计划放入assignment的执行计划列表 
             -->检查该region是否又进入了transaction状态,如果是则跳过 
             -->将该region置为pending_close状态 
             --> 向region server发送close region的信号 
        --> 真实执行计划在其它时候(下一篇文章介绍)

-->启动meta扫描线程并放入守候线程,默认循环时间为300秒 
         --> meta扫描线程的作用是定期清理己经split的region并将它删除,工作过程如下: 
             --> 连接meta server,scan表的info信息,扫描所有region,从regioninfo中读出是否split的信息 
             -->如果己经split,则先获取splitA和splitB的region info 
             -->如果splitA和splitB的reference都不再指向父region了(从它们的regionPath可以得出),则将父region删除掉,删掉流程如下: 
             --> 将region的状态置为offline 
              -->将该region从regionsInTransition中删除掉 
             --> 将该region从regionPlan中删除掉,避免再进行balance之类的操作 
             -->将该region的regioninfo从AssignmentManager的regions树中以及AssignmentManager中存放的每个servers中删掉 
             -->删除meta表里的该region的目录 
             -->通知meta region server删除该region

启动完成

更多精彩内容请关注:http://bbs.superwu.cn

关注超人学院微信二维码:

时间: 2024-10-10 11:26:00

hbase 源码解析之master篇1的相关文章

hbase 源码解析之master篇2

HMaster的RPC接口,分两类: HMaster与RegionServer通讯接口,总共只有两个-->regionServerStartup: 当regionserver启动时会调用该接口    -->将发请起求的RS的信息写入serverInfo,注意这里的hostname为master所识别的hostname,而非RS告诉master的    -->调用serverManager的regionServerStartup方法处理该请求       -->check该RS是否d

Android网络编程(七)源码解析OkHttp前篇[请求网络]

相关文章 Android网络编程(一)HTTP协议原理 Android网络编程(二)HttpClient与HttpURLConnection Android网络编程(三)Volley用法全解析 Android网络编程(四)从源码解析volley Android网络编程(五)OkHttp2.x用法全解析 Android网络编程(六)OkHttp3用法全解析 前言 学会了OkHttp3的用法后,我们当然有必要来了解下OkHttp3的源码,当然现在网上的文章很多,我仍旧希望我这一系列文章篇是最简洁易懂

HBase源码解析(二) HMaster主要类成员解析

本文基于HBase-0.94.1分析HMaster的主要类成员. HMaster是HBase主/从集群架构中的中央节点.通常一个HBase集群存在多个HMaster节点,其中一个为Active Master,其余为Backup Master. HMaster的主要类成员如下: 1.ZooKeeper侦听 这些类都继承自ZookeeperListener. /******************************ZooKeeperListener and ZooKeeperWatcher**

智能聊天机器人实现(源码+解析)

前言: 之前写了一篇  <美女图片采集器 (源码+解析)> 得到了众多朋友的支持, 发现这样系列的教程还是挺受欢迎的, 也激励我继续写下去. 也在那一篇文章中提过, 美女图片采集只是我先前那个完整APP中的一个功能罢了, 还有其他几个比较好玩的尚未开源, 之后有时间会逐一写篇教程. 今天带来的是智能聊天机器人实现(源码+解析), 和上一篇教程一样, 当你没有女朋友的时候, 可以用它来打发时间.这里的API是图灵机器人提供的, 实现一个十分强大的机器人. 具体功能包括: ? 支持聊天对话.智能问

Spring 源码解析之HandlerAdapter源码解析(二)

Spring 源码解析之HandlerAdapter源码解析(二) 前言 看这篇之前需要有Spring 源码解析之HandlerMapping源码解析(一)这篇的基础,这篇主要是把请求流程中的调用controller流程单独拿出来了 解决上篇文章遗留的问题 getHandler(processedRequest) 这个方法是如何查找到对应处理的HandlerExecutionChain和HandlerMapping的,比如说静态资源的处理和请求的处理肯定是不同的HandlerMapping ge

Android网络编程(十一)源码解析Retrofit

相关文章 Android网络编程(一)HTTP协议原理 Android网络编程(二)HttpClient与HttpURLConnection Android网络编程(三)Volley用法全解析 Android网络编程(四)从源码解析volley Android网络编程(五)OkHttp2.x用法全解析 Android网络编程(六)OkHttp3用法全解析 Android网络编程(七)源码解析OkHttp前篇[请求网络] Android网络编程(八)源码解析OkHttp后篇[复用连接池] Andr

死磕 java同步系列之Phaser源码解析

问题 (1)Phaser是什么? (2)Phaser具有哪些特性? (3)Phaser相对于CyclicBarrier和CountDownLatch的优势? 简介 Phaser,翻译为阶段,它适用于这样一种场景,一个大任务可以分为多个阶段完成,且每个阶段的任务可以多个线程并发执行,但是必须上一个阶段的任务都完成了才可以执行下一个阶段的任务. 这种场景虽然使用CyclicBarrier或者CountryDownLatch也可以实现,但是要复杂的多.首先,具体需要多少个阶段是可能会变的,其次,每个阶

ExcelReport第二篇:ExcelReport源码解析

导航 目   录:基于NPOI的报表引擎--ExcelReport 上一篇:使用ExcelReport导出Excel 下一篇:扩展元素格式化器 概述 针对上一篇随笔收到的反馈,在展开对ExcelReport源码解析之前,我认为把编写该组件时的想法分享给大家是有必要的. 编写该组件时,思考如下: 1)要实现样式.格式与数据的彻底分离. 为什么要将样式.格式与数据分离呢?恩,你不妨想一想在生成报表时,那些是变的而那些又是不变的.我的结论是:变的是数据. 有了这个想法,很自然的想到用模板去承载不变的部

“Tornado源码解析篇”导读索引

最近花了2周时间断断续续地阅读了 Tornado 的源码,写了“Tornado源码解析”这个系列专题.由于写得比较散,这里简单做一个索引与导读. 为什么要选择 Tornado 这个框架?先给大家讲一个小故事:赌王娱乐城 "[web.py inspired the] web framework we use at FriendFeed [and] the webapp framework that ships with App Engine..." — Brett Taylor, co-