- 浏览: 353637 次
- 性别:
- 来自: 杭州
最新评论
-
penkee:
为何我启动 zookKeeper bookie 10 不能创 ...
bookkeeper安装及测试体验 -
Golden-jin:
1楼也好时髦呀
bookkeeper简单分析 -
xGss2000:
要是减少到300个 region,block就0.04s了。话 ...
多region下的hbase写入问题 -
brandom520:
请问lz,我从hbase0.94版本上的数据导入到0.96.1 ...
在不同版本hdfs集群之间转移数据 -
huanghaifeng1990:
您好,我想请问一下,我执行了会发生OOM溢出的Deflater ...
perftools查看堆外内存并解决hbase内存溢出
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分钟检查一次)
-->否则,注册zookeeper watcher,如果注册成功则成为active master,否则阻塞并反复通过watcher检查在运行的master是否挂掉或stop状态
-->进入finishInitialization()函数并初始化master:
-->先检查hbase版本,如果是第一次启动hbase,则将版本信息写入/hbase/hbase.version,如果下次启动时这个文件不存在,则无法启动!如果不小心删掉了必须自己写一个版本 信息上去
--> 检查和保证root region的完好,如果root region还不存在,则创建root region以及第一个meta region
-->创建HConnectionImplementation实现的连接
-->创建server manager,后续绝大部分master工作都是通过server manager完成的
-->创建并启动CatalogTracker线程,用以跟踪root和meta两个特殊table的状态,它内部又启动RootRegionTracker和MetaNodeTracker两个线程
-->创建并启动RegionServerTracker线程,用以跟踪所有online region的状态,一旦有node delete状态则会通知server manager将其注销
-->创建并启动ClusterStatusTracker线程,用以跟踪整个cluster的up和down状态
-->向zookeeper注册AssignmentManager,用以管理region的分配
-->创建线程池ExecutorService,在其中运行以下线程
MASTER_META_SERVER_OPERATIONS
MASTER_SERVER_OPERATIONS
MASTER_CLOSE_REGION
MASTER_OPEN_REGION
MASTER_TABLE_OPERATIONS
--> 以守护方式运行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"文件夹(如果该文件夹存在则删除后覆盖之),然后将数据写入该文件夹
-->完成split Hlog的操作后,开始分配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线程的作用是定期均衡所有region server上的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,从region info中读出是否split的信息
-->如果己经split,则先获取splitA和splitB的region info
-->如果splitA和splitB的reference都不再指向父region了(从它们的regionPath可以得出),则将父region删除掉,删掉流程如下:
--> 将region的状态置为offline
-->将该region从regionsInTransition中删除掉
--> 将该region从regionPlan中删除掉,避免再进行balance之类的操作
-->将该region的region info从AssignmentManager的regions树中以及AssignmentManager中存放的每个servers中删掉
-->删除meta表里的该region的目录
-->通知meta region server删除该region
启动完成
发表评论
-
lease引发的血案
2011-12-19 23:01 6168今天线上出现了一个故障惊出一身冷汗,经过查明原来是lease引 ... -
hbase写被block住的典型案例分析
2011-11-10 22:32 5941今天一个线上集群出现莫名奇妙不能写入数据的bug,lo ... -
在不同版本hdfs集群之间转移数据
2011-10-26 18:56 7208本文仅供记录一下程序心得: 很多人会有这样一个需求:将 ... -
hbase中的deleteColumn
2011-10-26 16:59 5164Delete类的接口有两个方法:deleteColum ... -
splitlog期间丢失数据的问题
2011-10-18 22:26 3702splitlog是保证在重启或rs挂掉后,恢复hlog ... -
hbase中多次加载root及meta的bug
2011-10-18 22:24 3197执行以下case可以见到root或meta被加载两次: ... -
两次hbase丢失数据的故障及原因分析
2011-10-18 18:12 16792hbase的稳定性是近期社区的重要关注点,毕竟稳定的系 ... -
hbase中regionserver常见的oom原因分析
2011-09-15 10:40 9078首先要清楚reginserver中内存是如何使用的。 ... -
hbase的export与import工具
2011-09-01 08:01 11317hbase提供了导出表的方案,将指定的表导出到HDFS ... -
disable table失败的处理
2011-08-30 20:02 4344相信每一个维护hbase集群的运维人员一定碰到过dis ... -
使用zookeeper管理多个hbase集群
2011-08-16 15:30 18162zookeeper是hbase集群的"协调器 ... -
一次奇异的getRegionInfo异常定位
2011-08-10 19:55 2526今天在线上环境的 ... -
多region下的hbase写入问题
2011-08-10 13:13 9251最近在集群上发现hbase写入性能受到较大下降,测试环 ... -
hbase上应用lucene创建索引及检索
2011-07-21 17:14 11624hbasene(https://github.com/ ... -
hbase-0.90.4的主要更新
2011-07-15 22:15 2820apache邮件列表中提 ... -
hbase中缓存的优先级
2011-06-15 16:30 4135今天同事问到hbase中in-memory属性的作用, ... -
hbase交流记录
2011-06-02 10:34 3543前几天和公司的同事杨传辉(http://www.nosqlno ... -
secondary index for hbase
2011-05-07 23:05 5800最近因为业务需求 ... -
hdfs上的append测试
2011-05-04 23:42 6559hbase在写入数据之前会先写hlog,hlog目前是se ... -
hbase写入性能影响续
2011-04-18 15:28 10606今天发现hbase在写入一张新表时,写入过程中时常会出 ...
相关推荐
HBase源码分析揭示了HBase在RPC通信机制方面的一些关键技术点,这包括了角色分配、通信信道建立、通信接口协议定义、对象序列化、传输控制和会话管理,以及在传输过程中可能出现的错误处理和重试机制。 HBase中的...
三、HBase源码解析 1. **Region分配与负载均衡**:在`org.apache.hadoop.hbase.master`包下,RegionServerTracker类负责监控Region服务器状态,LoadBalancer类实现Region的负载均衡策略。 2. **元数据管理**:元...
《HBase实战源码》是针对Apache HBase这一分布式、高性能、基于列族的NoSQL数据库的深度解析书籍。源码分析是理解HBase工作原理和技术细节的重要途径。HBase在大数据领域扮演着关键角色,它能够处理海量数据并提供...
#### 二、HBase源码解析——Master篇 ##### 2.1 Master启动过程 - **初始化HMaster**:Master启动时,首先进行初始化操作。 - **创建RPC Server**:接着创建一个RPC Server,并启动它。 - **监听客户端请求**:...
HBase,作为Apache的一个开源项目,是构建在Hadoop之上的分布式、版本化、列族式的NoSQL数据库,它提供了高可靠性、高性能、可伸缩的数据存储解决方案。本文将基于hbase-0.98.23的源代码,深入解析其内部机制,帮助...
《深入剖析HBase 0.98.12.1源码》 HBase,作为Apache软件基金会的一个开源项目,是构建在Hadoop文件系统(HDFS)之上的分布式列式数据库,它提供了高可靠性、高性能、可伸缩的数据存储解决方案。HBase 0.98.12.1是...
《深入理解HBase:从HBaseTest源码解析开始》 HBase,作为Apache软件基金会的一个开源项目,是构建在Hadoop之上的分布式列式数据库,特别适合处理大规模数据。其设计灵感来源于Google的Bigtable,提供高吞吐量的...
《深入解析Hadoop之HBase 0.99.2源码分析》 在当今的信息化社会,大数据处理已经成为企业核心竞争力的关键要素。Hadoop作为开源大数据处理框架的领头羊,其生态中的HBase更是备受关注。HBase是基于Google Bigtable...
三、HBase源码解析 3.1 数据模型 HBase的数据模型在源码中主要体现在`org.apache.hadoop.hbase.regionserver`包下的`Region`类,它是实际存储数据的单元,包含对行、列的管理。 3.2 操作API 客户端与HBase交互的...
在本分享总结中,我们将深入探讨“HBase_介绍”和“HBase云存储”的相关主题,这将涵盖HBase的基础知识、其架构原理、在云计算环境中的应用以及相关的源码解析。首先,我们从HBase的基本概念和功能入手。 HBase是一...
《HBase分布式数据库v2.2.6稳定版源码解析》 HBase,作为Apache软件基金会的一个开源项目,是构建在Hadoop文件系统(HDFS)之上的分布式列式数据库,特别适合处理大规模的数据存储。HBase v2.2.6作为其稳定版本,为...
《HBase 0.90.4:分布式存储的魅力与技术深度解析》 HBase,作为Apache软件基金会的重要项目之一,是一款高度可扩展的、基于列族的分布式数据库,尤其适用于处理海量数据。HBase 0.90.4是其历史版本,尽管现在已经...
《HBase 1.3.6源码解析与大数据存储技术探析》 HBase,全称为Apache HBase,是一款开源的、分布式的、版本化的非关系型数据库(NoSQL数据库),它构建于Hadoop文件系统(HDFS)之上,是大数据处理领域的重要组件。...
**源码解析** HBase的源码是用Java编写的,对于开发者来说,深入研究源码可以帮助理解其内部机制和优化策略。关键模块包括: 1. **RegionServer**:处理客户端请求,管理数据分区(Region)。 2. **Master**:负责...
在大数据处理领域,Apache HBase是一个分布式的、版本化的NoSQL数据库,它构建于Hadoop之上,特别适合处理海量结构化数据。这篇博客“Hbase调用Java API实现批量导入操作”聚焦于如何利用Java编程语言高效地向HBase...
而HBase是构建在Hadoop文件系统(HDFS)之上,提供高可靠、高性能、列式存储、支持多版本、实时读写的分布式数据库,适用于大数据实时查询场景。 Java在大数据生态中扮演着连接不同组件的重要角色,它提供了丰富的...
《HBase权威指南》是HBase领域的经典著作,旨在深入解析这款分布式大数据存储系统的方方面面。随书提供的源代码是理解书中理论与实践结合的关键。在本文中,我们将围绕HBase的核心概念、架构以及如何通过源代码学习...
1. 下载:首先,从Apache官网下载HBase 0.98.12.1的源码或二进制包,例如文件名为“hbase-0.98.12.1-hadoop2-bin.tar.gz”。 2. 解压:使用`tar -zxvf hbase-0.98.12.1-hadoop2-bin.tar.gz`命令解压。 3. 配置:...
HBase,全称为Apache HBase,是一款开源的分布式列式数据库,是构建在Hadoop文件系统(HDFS)之上的NoSQL数据库。HBase 3.0作为其重要的版本更新,带来了许多新特性和性能优化,对于大数据处理和实时分析有着显著...