HBase采用了和Hadoop相同的RPC机制,作为它的主要通信手段.这是一个轻量的,不同于Java标准的RMI的一种方式.所以它的实现必须克服一些问题.如:
1) 如何分配RPC角色和通信信道,使得RPC通信可以实现.
2) 通信接口或协议的内容
3) 如何传输对象(Object),即序列化.
4) 传输,并发及会话控制
5) 其它的保障,如出错,重试等.
对于第一个问题,首先要确定RPC通信的角色.请参看下表.
HBase通信信道 |
HBase的通信接口 |
客户端 |
服务端 |
HBase Client |
Master Server |
HMasterInterface |
HBase Client |
Region Server |
HRegionInterface |
Region Server |
Master Server |
HMasterRegionInterface |
HBase RPC有明显的客户端和服务端之分.由HBase Client,Region server, Master server三者组成了三个信道.最右边的一列是通信两端之间约定的通信接口.客户端调用这个接口,而服务端实现这个接口.
所以最基本的工作流程就是
1) 客户端取得一个服务端通信接口的实例.
2) 客户端调用这个实例中的方法
3) 客户端向服务端传输调用请求
4) 服务端接口实现被调用
5) 服务端向客户端传输结果
那么除此之外的通信是不存在的吗?比如Master向Region server发出请求.答案是—否,原因很简单,一个Master server的实例也可以以HBase Client的角色来访问Region Server,即调用它的HRegionInterface接口.事实上确实如此,Master必须调用Region server的接口来完成它的工作.但是有一点可以确定的,没有Master server向Region server主动发布命令的接口,而只有Region server主动向Master server报告和获取命令的接口,即HMasterRegionInterface.
HBase解决第二个问题,要参考三个通信接口.这三者可以说是HBase架构的基因,只看这三个接口的源码,就可以让你大致了解HBase的工作思想.

1) HMasterInterface, 由Master server实现,相当于是总管,所以它提供的方法归纳为
a) 对表的增删改的操作,及对表上线,下线的操作
b) 对表的列的增删改操作
c) 关闭这个HBase集群和取得集群的状态的方法.
说到底,Master server在前两项任务上充当了HBase Client的角色.只是它比较特别一点,因为它主要操作的是Root和Meta表.这两个表是HBase数据架构的元数据表
以下是题外话,对于HBase Client来说是如何获得这个实例呢?请参考org.apache.hadoop.hbase.client.HConnection.getMaster()这个方法.而HConnction的实例是来自org.apache.hadoop.hbase.client.HConnectionManager的getConnection()的静态方法.HConnection真正的实现是HConnectionManager.TableServers
2) HRegionInterface, 由Region Server实现.这是HBase主要的数据操作接口.它的功能有
a) Get 操作,读表记录的操作
b) Put 操作,检查及Put的组合操作,列值的增值的操作,即写表记录的操作
c) Delete 操作,删除表记录的操作
d) Scan操作,分为打开Scanner,得下一条或多条的记录及关闭Scanner的操作
e) 行锁及解锁操作
f) 定位(查找)的操作
g) 取得本Region server上Region信息,服务器信息的操作
Region server顾名思义就是为Region服务的服务器.所以它的主体的方法都是针对一个Region的.一个Region也就是一个表的横向片断,表太大了,所以要分给不同的Region Server来管理.从HBase client的角度来说,因为一个对数据表的操作可能要跨多个Region,也就是要访问多个Region server.所以这个工作就必须由client来完成.HBase client的API就是要解决这个复杂性.
HRegionInterface的实例同样来自HConnection接口的实例HConnectionManager.TableServers.
3) HMasterRegionInterface, 由Master server实现.它只有两个的方法,
a) 向Master server报告我启动了,Master server就回给它当前的配置,如文件系统,hbase的根目录
b) 向Master server报告状态,及管理的Region的信息,顺便从Master server取得要执行的命令.有哪些命令和报告呢,参考org.apache.hadoop.hbase.HMsg.Type.有命令: 打开,关闭,切分,压缩和停止Region;报告有Region serve打开,关闭,切分,压缩,更新,Region正退出等.
值得注意的是,我们如从CRUD(Create, Read, Update, Delete)这个角度来看这套接口,似乎是不完整的.注意HMasterInterface,它只提供了CUD三个对表的操作.哪么对表的读取在哪里呢?另一方面可以看到的是HRegionInterface指供了完整的CRUD.所以有一个潜在的方法就是对表的读取可以通过HRegionInterface对Root表及Meta表的读取来完成,事实上,HBase的客户端代码也是这样做的,它利用scanner扫描Root和Meta表来读取表的信息.
第三个问题相对比较简单,可以看到它是利用org.apache.hadoop.io.Writeable这个接口来进行序列化的,而不是通过标准的Serialize接口.Writeable接口有两个方法,分别是
1) write(DataOutput out) 对应将数据写入流中
2) readFields(DataInput in) 从流中读出这数据实例化这个对象.
还要一个隐含的要求,就是实现这个接口的类要有公有的无参构造器.最后会说明理由.
也就是说只要实现这个接口的类的实例就可以在HBase的RPC中传输,作为函数调用的参数z或返回值.
具体一些来说, org.apache.hadoop.hbase.io.HbaseObjectWritable是真正被传输用到的,它是一个封装器,在它的类有两个静态的表,一个是类code(一个内部分配的Byte)到类实例的映射表,还有一个是类实例到类code的映射表.在这两个表静态初始化时,将HBase中所有要传输的类(Writable),原型数据(int, boolean)及一些特别的类(Stirng, 数组)等都编成code存入这张表中.对于它的实例来说,它提供了set,get方法将一个对象存入或读出,然后按不同对象采用不同的方法来将数据存入流中或从流中读出.
重新归纳一下这个序列化的过程,
1) Client调用RPC接口时,一些原型值,String,或Writable对象传入了前述三个接口的方法.
2) 这些参数被装入HbaseObjectWritable对象中.
3) HbaseObjectWritable将这些对象的类code(查静态表)写入流中,并将对象实例的数据写入流中.
4) Server将接收的参数反序列化.先生成HbaseObjectWritable实例
5) 用这个实例从流中读到类code,实例化.然后按它的类型读出它的数据.
6) 这样就可以调用HbaseObjectWritable.get()方法将这个构建出的对象取出了.
另一部分返回结果的传输与上述过程类似
请注意第5步,其中的实例化,对于Writable对象而言,必须要实现无参构造器.这样才能帮助它方便的实例化成.其实是还可以有其它实例化的方法,WritableFactory这儿就不详述了.
第四个问题和第五个问题将涉及传输的两端,将分别在客户端和服务端分别讲到.
分享到:
相关推荐
总的来说,HBase的源码分析涉及到客户端与服务器的交互、RPC通信机制、数据存储流程以及系统架构等多个层面。理解这些核心机制对于优化HBase性能、排查问题以及进行二次开发都至关重要。通过对HBase源码的深入学习,...
4. RPC机制:理解HBase如何通过HBaseRpcController和RpcServer实现客户端与服务器之间的通信。 5. 并发控制:学习RegionSplitPolicy、RegionSplitter等类,理解HBase如何处理并发请求和Region分裂。 6. 客户端API:...
HBase源码分析与开发实战视频技术讲解高阶视频教程以及课件,内部讲解资料 内容非常详细 值得想要提高薪水的人去学习了解
### HBase源码分析 #### 一、HBase性能测试要点与分析 ##### 1.1 测试环境 - **硬件配置**: - 客户端:1台 - RegionServer:5台 - Master:1台 - ZooKeeper:3台 - **软件配置**: - CPU:每台服务器配备8...
HBase 0.94.4的源码分析有助于我们深入了解其内部机制,从而更好地进行系统设计和优化。无论是对于开发者还是管理员,掌握HBase的核心原理都将极大地提升在大数据领域的实践能力。通过不断学习和实践,我们可以更好...
可以参考:http://baike.baidu.com/view/32726.htm)机制分析的博客一直耽搁了下来。昨天晚上胡老大和我抱怨说:最近乱的很。呵呵,老是往武汉跑,能不乱嘛。不过差不多腾讯面试的事就该告一段落了。五一期间,...
HBase的源码分析有助于理解其内部工作原理。例如,`HRegionServer`是数据服务的主要组件,负责Region的管理和数据操作;`HMaster`负责Region的分配和负载均衡;`HStore`管理Column Family,包含一系列的`HStoreFile...
- **高级配置**:对于已经熟悉HBase基础操作的读者,书中还介绍了如何根据具体需求调整配置参数,以获得更佳的性能表现。 #### 七、总结 通过上述内容可以看出,《HBase权威指南》全面而深入地介绍了HBase的相关...
hbase官网下载地址(官网下载太慢): https://downloads.apache.org/hbase/ 国内镜像hbase-2.4.16: https://mirrors.tuna.tsinghua.edu.cn/apache/hbase/2.4.16/hbase-2.4.16-bin.tar.gz
HBase源码(hbase-2.4.9-src.tar.gz)是一个分布式的、面向列的开源数据库,该技术来源于 Fay Chang 所撰写的Google论文“Bigtable:一个结构化数据的分布式存储系统”。就像Bigtable利用了Google文件系统(File ...
通过对 HBase 的源码解析与开发实战的学习,我们不仅能够深入了解 HBase 的内部工作机制,还能掌握如何高效地使用 HBase 进行大数据的存储与处理。无论是对于从事大数据领域工作的专业人士还是希望深入学习大数据...
通过分析源码,可以了解到HBase如何进行远程调用和数据序列化。 7. **HBase Prefix Tree**: 这是一个优化HBase查询性能的模块,利用前缀树数据结构来加速范围查询。源码分析有助于提升对空间和时间复杂度的理解。 ...
源码分析是理解HBase工作原理和技术细节的重要途径。HBase在大数据领域扮演着关键角色,它能够处理海量数据并提供实时访问。下面,我们将深入探讨HBase的核心概念和源码中的关键组件。 1. **HBase架构**:HBase基于...
ch: java.nio.channels.SocketChannel[connected local=/dw1:54889 remote=/dw2:62010] ``` **原因分析** 该错误通常是由于网络延迟或者HDFS NameNode负载过高导致的。在高并发写入情况下,客户端与NameNode之间...
* 数据分析:HBase可以用于数据分析,满足数据挖掘和机器学习的需求 * 实时数据处理:HBase可以用于实时数据处理,满足流数据处理的需求 HBase表设计 HBase表设计是指设计HBase表的结构和schema,以满足具体的业务...
搭建pinpoint需要的hbase初始化脚本hbase-create.hbase
通过分析源码,开发者可以深入理解分布式数据库的设计思想,而jar包则使开发者能够快速构建基于HBase的应用。不过需要注意的是,0.94.13已经是较旧的版本,最新的稳定版本可能会包含更多的功能和改进,因此在生产...
通过分析和实践《HBase权威指南》的源码,读者不仅可以深化理论知识,还能掌握实际操作技巧,为解决实际项目中的问题提供有力支持。对于想深入理解HBase工作原理和优化技巧的开发者来说,这份源码是一份宝贵的资源。