背景
HTable作为HBase的CRUD的客户端底层是怎么实现的,虽然HBase-The-Definitive-Guide 这本书的作者推荐在生产环境使用HTablePool
但了解HTable还是很有必要的
下面以一个简单的例子来说明
代码非常简单,就是初始化HTable和调用HTable实例的get获取ROW1的值
在介绍下面的内容之前先简单的说下HBase server
HBase server 基本上由zookeeper和HRegion server组成
前者主要是用于监控和管理HRegion server,后者才是提供数据服务的
HRegion server又分为master+server,master用于维护meta信息,
master和server的确定使用了leader follow方式,任何HRegion server都有可能成为Master
HTable模型
- HTable: 客户端API
- HConnection: HTable对zookeeper的网络连接
- ServerCallable:抽象一次和Region Server的交互,因此它需要有HConnection和HRegionLocation,同时需要有一个访问Region Server的接口
- HRegionInterfaceHRegionLocation:Region Server的地址
- HRegionInfo:Region Server的信息
- HRegionInterface:访问Region Server的接口的动态代理
- WritableRpcEngine$Invoker:动态代理的相关handle
- HBaseClient:Region Server的客户端
- 其他的就不解释了
HTable runtime
1)HTable的初始化step1
- 初始化对zookeeper的连接
- 会调用zookeeper的api,启动两个线程,一个是sendthread,一个是eventhtread,
- sendthread专门维护对zookeeper的连接,并且会监听zookeeper 的事件,比如节点变化的通知,一旦接到通知会将通知转发给eventhtread
- eventhtread处理zookeeper的变化
2)HTable的初始化step2
- 从zookeeper获取到root HRegionLocation[region=-ROOT-,,0.70236052, hostname=localhost, port=33032] 并cache
- 从root HRegion中获取到meta HRegionLocation[region=.META.,,1.1028785192, hostname=localhost, port=33032] 并cache
- 从meta HRegion 取更多hregion信息缓存到本地(见HConnectionManager$HConnectionImplementation.prefetchRegionCache)
- 从meta HRegion中获取表所在的HRegionLocation[region=testtable,,1332256150817.5c8417fb964377174f649af04a70ad5e., hostname=localhost, port=33032]并cache
3) HTable.get到底干了什么
- 从cache中获取表对应的HRegionLocation
- 从cache中获取HRegionLocation对应的Region server【一个实现了HRegionInterface的动态代理,使用了WritableRpcEngine$Invoker作为InvocationHandler】
- 调用动态代理的get,解下来就会调用WritableRpcEngine$Invoker的invoke
- 调用HBaseClient.call
4)仔细看看HBaseClient.call
- 初始化一个Call实例(封装了请求和响应)
- 连接到Region server(见HBaseClient.getConnection)得到HBaseClient.Connection实例,此时会启动一个读线程(每个region一个),专门读取服务端的响应,也会将请求写入读线程的队列中
- 发请求,见【HBaseClient.Connection.sendParam(call)】,如果是多个请求线程,由于此时共用一个连接,还存在同步问题,且网络写也是阻塞的,写完了还得等通知
- 读线程会不断的读取响应,读取一个相应响应就将请求队列中对应的请求删除,并通知主线程即客户端线程,如果读线程空闲超时会自动回收
- 客户端线程和读线程采用传统的wait + notify 通信,这也意味着客户端线程会阻塞
小结
- 从HTable 的实现中看到了所谓的传说中的RPC到底是咋回事
- 一个服务接口
- 实现了服务接口的动态代理
- 动态代理对应的invoke handle
- 当然还有底层网络客户端
- 另外也看到的HTable的io模型
- 多个客户线程同步+阻塞写,并将写注册到读线程的队列中
- 单线程绑定单连接(基本上是每个region对应一个),读取响应,删除队列中的请求标示,并通知客户线程
- 并没有使用NIO
- 和传统的连接池以及时髦的使用select的事件驱动比起来以及是一个比较怪异的实现
分享到:
相关推荐
htable2csv 将HTML表转换为.csv文件
基于传统的指纹图像处理理论,matlab实现,中间变量清晰可见,参数可调节。 它将可以帮助你: 1、省去2至3个月的入门熟悉...本Demo除实现指纹匹配算法外,将指纹搜索通过建立索引的方式实现,相关见Demo中Htable功能。
1.在HBase写数据的业务逻辑实现过程中,如下哪个接口或类是不需要涉及的? A. Put B. HTable C. HBaseAdmin D. PutList Answer: C 2.在MapReduce的应用程序开发中,下列哪个JAVA类负责管理和运行一个计算任务? A....
卡姆利 Kamailio命令行界面控制工具。 Kamailio是一个开源SIP(RFC3261)服务器,可从以下位置获得: kamcli的目标是成为...可以将用于kamcli的新命令实现为插件,每个命令都在位于kamcli / commands /中的文件中
为什么需要HBase HTable的逻辑组织 HBase的运行机制 HBase与 HDFS HBase的对外接口
simplehbase是java和hbase之间的轻量级中间件。 主要包含以下功能。 数据类型映射:java类型和hbase的bytes之间的数据转换。 简单操作封装:封装了hbase的put,get,scan等操作为简单的java...HTable count和sum功能。
wmic qfe list full /format:htable。是直接转换为html网页的存在 然后可以调用写到本地。但是无法取出来作为判断 于是我想到用超文本浏览器取打开这个html 。去读取文字 然后使用正则表达式获取补丁版本都有那些...
HTable table = new HTable(conf, "testtable"); // vv PutListExample List<Put> puts = new ArrayList(); // co PutListExample-1-CreateList Create a list that holds the Put instances. Put put1 = new ...
句法: htable = treeTable (pnContainer, headers, data, 'PropName',PropValue, ...) 输入参数: pnContainer - 容器 uipanel 或图形的可选句柄(默认值:gcf) headers - 列标题字符串的可选元胞数组数据-数据值...
网上的HBase书都比较老了,这是目前为止最新版本的HBase电子书。... Chapter 18: Using the HTable Class Part VI: Administration Chapter 19: Using the HBase Shell Chapter 20: Bulk Loading Data
secondaryIndexHTable = new HTable(hTable.getConfiguration(), secondaryIndexTableName); } catch (Exception e) { Throwables.propagate(e); } finally { try { hBaseAdmin.close...
asynchbase...这个 HBase 客户端跟 HBase 的客户端 HTable 有着很大的区别,不需要重写所有的 HBase API 交互代码,原生异步,而且使用一些线程就可以跟 HBase 进行高效的交互。 标签:Asynchronous
wmic qfe list full /format:htable 是直接转换为html网页的存在 然后可以调用写到本地 但是无法取出来作为判断 于是我想到用超文本浏览器取打开这个html 去读取文字 然后使用正则表达式获取补丁版本都有那些 再去...
该库的灵感来自David Santiago的并直接从他的库中取消了对HTable管理功能的支持。 发行版保留在clojars中。 最新版本是: com.compasslabs/clojure-hbase-schemas "0.90.4"描述引入了两个主要功能:模式和约束。 ...
与传统的 HBase 客户端 (HTable) 不同,每个要与之交互的 HBase 集群只需要一个客户端实例。 即使您想与多个表进行交互。 它避免了不必要的等待线程,即使在同步模式下也允许批量请求并行运行。 客户端提供客户端...
端点协处理器:就像数据库的“存储过程”一样,这种类型的协处理器必须通过“ HTableInterface”(或HTable)的“ CoprocessorService()”方法显式触发。 协处理器不是为最终用户设计的,而是由开发人员使用的。 ...
wmic qfe list full /format:htable 是直接转换为html网页的存在然后可以调用写到本地 但是无法取出来作为判断 于是我想到用超文本浏览器取打开这个html 去读取文字 然后使用正则表达式获取补丁版本都有那些
文章目录HBASE 工具类HBASE 高可用搭建 ...import org.apache.hadoop.hbase.client.HTable; import org.apache.hadoop.hbase.client.Put; import org.apache.hadoop.hbase.util.Bytes; import java.io.IO