HBase 的 Split过程是一个较为重要的过程,牵扯到许多东西。
Client
1. HBaseAdmin.split
2. 判断split的是Region还是Table
3. 调用HBaseAdmin.split(final ServerName sn, final HRegionInfo hri,byte[] splitPoint)
4. PRC调用HRegionInterface.splitRegion
5. Server端(异步)完成。
Server端:
1. HRegionServer.splitRegion
此方法必须flushes the region & corces a compaction,flush是同步,compaction是异步
1. checkOpen 查看RegionServer的状态
2. region.flushcache(); flush该Region
3. region.forceSplit
1. 标志位splitRequest=true,explicitSplitPoint=splitkeypoing split的key的赋值
4. compactSplitThread.requestSplit 启动一个SplitRequest 线程处理split的请求
5. SplitRequest.run
1. 实例化SplitTransaction This class is not thread safe.Caller needs ensure split is run by one thread only.
splitdir=file:/E:/tmp/hadoop/data/william/{ParentHFileName}/.splits
建立table/{RegionName}/.split 文件夹
2. SplitTransaction.prepare
1. check info
2. 实例化两个RegionInfo: hri_a和 hri_b,赋予key的起始结束值,根据给定的splitkey
3. SplitTransaction.execute
1. createDaughters 对需要split的region进行预处理,比如presplit
0. presplit
1. fileSplitTimeout 获取对于fileSplitTimeout时间,默认30000
2. createNodeSplitting
create ephemeral node 在zookeeper里 (RegionTransitionData)
1. 在zookeeper里建立node: /hbase/unassigned/{parentHRegionFileName},状态splitting
2. close parent HRegion
3. splitStoreFiles :creates daughter region dirs under the parent splits dir 在Parent HFile下创建子目录
1. 创建.split临时目录 E:\tmp\hadoop\data\{TableName}\{ParentHRegionName}\.split
2. 在.split下,创建top和bottom两个文件,通过Reference写下该文件的引用部分(splitkey,top/bottom)
如:E:\tmp\hadoop\data\william\{ParentHRegionFileName}\.splits\{DaughterHRegionFile}\f1\hfile***
3. 将.split的两部分HFile移动到{tableName}/下
4. Offline parent in meta. 向.META.表Put Split的信息,如下:
{"totalColumns":3,"families":{"info":[{"timestamp":9223372036854775807,"qualifier":"regioninfo","vlen":82},
{"timestamp":9223372036854775807,"qualifier":"splitA","vlen":84},
"timestamp":9223372036854775807,"qualifier":"splitB","vlen":86}]},
"row":"william,,1371057759135.5a0dd042f18c323099b0cbfdb38bb228."}
2. openDaughters (异步)
1. 实例化两个DaughterOpener,分别管理两部分HRegion
2. openDaughterRegion : Open daughter regions, add them to online list and update meta.
两个DaughterOpener并发启动,将Regions加入到online列表兵update meta信息
1. checkCompressionCodecs
2. initialize HRegion (HRegion.initializeRegionInternals)
3. HLog.set(SeqNum)
3. check exception
4. postOpenDeployTasks (second one)
1. 遍历该HRegion下的所有Store
2. 触发MajorCompaction,触发条件是因为Store的文件是Reference ->
进入Compact的流程 {判断是isReference,则用HalfStoreFileReader读取HFile,返回多少条是否用Scanner决定? }
1. 在Daughter下创建.tmp文件,将scan得到的数据写进去
3. MetaEditor.addDaughter update META 中的数据
5. addToOnlineRegions // Should add it to OnlineRegions
6. postOpenDeployTasks (first one)
7. addToOnlineRegions // Should add it to OnlineRegions
(此时Region可用)
3. transitionZKNode :Finish off split transaction, transition the zknode 对于zknode事务性的更新处理,还有比如postsplit的处理
1. 对于Parent Node的Zk信息处理 ,更新Split的状态 (之后由Master来处理,CatalogJanitor 来清理多余文件夹)
关键类:
1. CompactSplitThread 管理所有对于region的compact和split的请求
2. SplitRequest 执行split的线程
3. SplitTransaction Split的过程对于split失败的情况进行处理
* SplitTransaction st = new SplitTransaction(this.conf, parent, midKey)
* if (!st.prepare()) return;
* try {
* st.execute(server, services);
* } catch (IOException ioe) {
* try {
* st.rollback(server, services);
* return;
* } catch (RuntimeException e) {
* myAbortable.abort("Failed split, abort");
* }
* }
并通过JournalEntry来记录整个Split过程运行的状态
4. ZKAssign 对于split的节点的分配和状态的控制
5. StoreFileSplitter,SplitTransaction的内部类,实际对HFile进行Split,文件的操作
6. Reference :A reference to the bottom half of the hsf store file.
7. HalfStoreFileReader,读取HFile进行切分copy
Others:
1. Region split进行到3.1.2时,kill整个进程。重启后能恢复到split之前的状态。
2. // add 2nd daughter first (see HBASE-4335) 在split的时候先做第二个的原因。
分享到:
相关推荐
Hbase1.3.1源码
HBase实战 hbase in action 源码
hbase-0.98.1-src.tar.gz hbase 0.98源码包
hbase权威指南源码
hbase 1.2.0源码,学习大数据nosql数据库时小白们可以用得到
HBase源码分析,详细的源码分析,专业的知识分析,绝对难得
hadoop hbase源码包 稳定版hbase-0.94.4.tar.gz
Hbase权威指南 随书源代码 源码包 绝对完整版 maven工程,带pom文件,可以直接作为一个完整工程导入eclipse等ide。
【No0057】HBase源码解析与开发实战
主要针对那些架构师及开发人员而设计,希望他们能更好地理解大数据应用程序的部署。在这之前,你应该具备基本的Hadoop知识,包括所需组件的设置以及成功安装过Hadoop集群,我们不会在Hadoop的配置或NodeManager功能...
hbase源码,适合研究分析底层实现。对hbase的原理的理解很有好处
hbase是一个开源的数据库,主要用于大数据集的分布式存储,本身是hadoop的一个子项目,区分于传统的数据库,它是按列存储的
HBase数据库连接例子,可以建表,删除表,插入,查询单条,查询全部
HBase源码(hbase-2.4.9-src.tar.gz)是一个分布式的、面向列的开源数据库,该技术来源于 Fay Chang 所撰写的Google论文“Bigtable:一个结构化数据的分布式存储系统”。就像Bigtable利用了Google文件系统(File ...
java操作Hbase之从Hbase中读取数据写入hdfs中源码,附带全部所需jar包,欢迎下载学习。
hadoop2.x、Hive、HBase源码解析+企业级应用视频,本人花钱买的视频,全部的还没有看,如果感觉老师讲的不好,请不要碰我,谢谢
HBase源码分析与开发实战视频技术讲解高阶视频教程以及课件,内部讲解资料 内容非常详细 值得想要提高薪水的人去学习了解
hive编译,jars,HBaseScanner构建.pptx,HBase之RegionServer命令启动流程.pptx,扩展.docx,尚硅谷大数据技术之HBase.xmind,尚硅谷大数据技术之HBase.pdf等等 很全。