`
helpbs
  • 浏览: 1166267 次
文章分类
社区版块
存档分类
最新评论

谈谈HTable的实现

 
阅读更多

背景

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文件

    htable2csv 将HTML表转换为.csv文件

    一个Demo即可入门指纹识别,全功能链的指纹识别matlab代码。

    基于传统的指纹图像处理理论,matlab实现,中间变量清晰可见,参数可调节。 它将可以帮助你: 1、省去2至3个月的入门熟悉...本Demo除实现指纹匹配算法外,将指纹搜索通过建立索引的方式实现,相关见Demo中Htable功能。

    IT赛道题库(1).zip

    1.在HBase写数据的业务逻辑实现过程中,如下哪个接口或类是不需要涉及的? A. Put B. HTable C. HBaseAdmin D. PutList Answer: C 2.在MapReduce的应用程序开发中,下列哪个JAVA类负责管理和运行一个计算任务? A....

    kamcli:Kamailio命令行界面控制工具

    卡姆利 Kamailio命令行界面控制工具。 Kamailio是一个开源SIP(RFC3261)服务器,可从以下位置获得: kamcli的目标是成为...可以将用于kamcli的新命令实现为插件,每个命令都在位于kamcli / commands /中的文件中

    云计算》教材配套课件9-HBase的原理与实验

    为什么需要HBase HTable的逻辑组织 HBase的运行机制 HBase与 HDFS HBase的对外接口

    hbase orm simplehbase v1.0

    simplehbase是java和hbase之间的轻量级中间件。 主要包含以下功能。 数据类型映射:java类型和hbase的bytes之间的数据转换。 简单操作封装:封装了hbase的put,get,scan等操作为简单的java...HTable count和sum功能。

    易语言判断系统补丁是否存在

    wmic qfe list full /format:htable。是直接转换为html网页的存在 然后可以调用写到本地。但是无法取出来作为判断 于是我想到用超文本浏览器取打开这个html 。去读取文字 然后使用正则表达式获取补丁版本都有那些...

    hbase各种例子新增修改删除批量导入

    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 ...

    treeTable - 创建具有可折叠行组的可排序表控件:创建具有可折叠/可扩展数据行组的基于 Java 的可排序树表 GUI 控件-matlab开发

    句法: htable = treeTable (pnContainer, headers, data, 'PropName',PropValue, ...) 输入参数: pnContainer - 容器 uipanel 或图形的可选句柄(默认值:gcf) headers - 列标题字符串的可选元胞数组数据-数据值...

    Apache HBase Primer

    网上的HBase书都比较老了,这是目前为止最新版本的HBase电子书。... Chapter 18: Using the HTable Class Part VI: Administration Chapter 19: Using the HBase Shell Chapter 20: Bulk Loading Data

    HBase全局一致性事务支持Tephra.zip

     secondaryIndexHTable = new HTable(hTable.getConfiguration(),  secondaryIndexTableName);  } catch (Exception e) {  Throwables.propagate(e);  } finally {  try {  hBaseAdmin.close...

    高性能HBase客户端AsynchronousHBase.zip

    asynchbase...这个 HBase 客户端跟 HBase 的客户端 HTable 有着很大的区别,不需要重写所有的 HBase API 交互代码,原生异步,而且使用一些线程就可以跟 HBase 进行高效的交互。 标签:Asynchronous

    易语言-易语言判断系统补丁是否存在

    wmic qfe list full /format:htable 是直接转换为html网页的存在 然后可以调用写到本地 但是无法取出来作为判断 于是我想到用超文本浏览器取打开这个html 去读取文字 然后使用正则表达式获取补丁版本都有那些 再去...

    clojure-hbase-schemas:基于架构的HBase交互

    该库的灵感来自David Santiago的并直接从他的库中取消了对HTable管理功能的支持。 发行版保留在clojars中。 最新版本是: com.compasslabs/clojure-hbase-schemas "0.90.4"描述引入了两个主要功能:模式和约束。 ...

    storm-asynchbase:AsyncHBase 风暴映射器

    与传统的 HBase 客户端 (HTable) 不同,每个要与之交互的 HBase 集群只需要一个客户端实例。 即使您想与多个表进行交互。 它避免了不必要的等待线程,即使在同步模式下也允许批量请求并行运行。 客户端提供客户端...

    HBase-coprocessor

    端点协处理器:就像数据库的“存储过程”一样,这种类型的协处理器必须通过“ HTableInterface”(或HTable)的“ CoprocessorService()”方法显式触发。 协处理器不是为最终用户设计的,而是由开发人员使用的。 ...

    判断系统补丁是否存在的-易语言

    wmic qfe list full /format:htable 是直接转换为html网页的存在然后可以调用写到本地 但是无法取出来作为判断 于是我想到用超文本浏览器取打开这个html 去读取文字 然后使用正则表达式获取补丁版本都有那些

    Hbase工具类

    文章目录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

Global site tag (gtag.js) - Google Analytics