一。流程图
二。原理
在使用HTable前要建立一个HTablePool实例。明白这个可以考虑为table的factory:get 或close,或close pool都可以。这个实例会同时建立一个内部object:PoolMap,其实不是真正的map,只是一个wrapper而已。这个map包含以table为key,相对应key为values的Pool,这种pool三种类型,详细见上图。可以说这个map是对三种pool的一个proxy:get table ,close table etc.相应的操作会直接在相应pool中进行,如Resuable#get(),因为这些pool都已经实现了base class:Pool<Table>
再来看这三种类型pool的特点:
pool | features | 适用 |
Resuable | 重用池,内部利用一个queue,在close放到tail,get时取头部 | 一般情况都可以,避免因不同线程使用不同数量htable造成过载。 |
ThreadLocal | 线程本地池,就是一个线程只出来一个htable | 如果明确有些线程使用htables多,其它少 |
RoundRobin |
轮转,内部使用一个按maxsize arry,每次get时根据计数返回对应htable 由于这方式需要在使用前必须实例化maxsize对象,现在已经在94.2中没有使用 |
N/A |
再之,如果在建立Htablepool时使用不变的Configuration,那么最终所有的htable共享HConnection,因为建立connection是依据config所zk,hbase master等信息建立的。所以如果不是在cross cluster情况下不建议使用multi config。由于HConnection中也存在一个zkclient,所以如果只有一个HConnection也意味着共享了zk client。
所以在通常情况下,若干个rowkeys进行访问时,出现Thread:RS = M:N,如果所有rows在同一RS下,那么将出现N=1,即会阻塞访问。
刚开始使用时不清楚此机制,所以我们一直自己建立threadpool来并发访问,看来这是没必要的。#1
在HTablePool#getTAble()时,返回了一个封装了HTable的PooledTable,目的是为了可以在close()时可以进行干预:供PoolMap post process。以便进行回推还是按照maxsize直接抛弃。而对PooledHTable的使用时,直接使用组合方式(内嵌)的HTable,所以对客户端而言是透明的。
HTable内在threadpool,所以在进行访问时相同RS的会直接打包到一个caller下便于直接访问。所以如果同一次访问的rowkyes很大而且刚好命中在同一RS,那么使用#1处理方式很有必要。
由于使用HTablePool建立的HTable默认是autoFlush=true,所以在执行过程中没有必要立即调用flushCommits(),因为在close()时会默认执行了。另外如果对数据没有严格的安全要求,也可以不必总调用close()来结束操作,可以在系统完毕后再利用一个shutdown hook即可。这样对提高整体入库速度是有提高的。
怎样保证Pool是线程安全?除了ThreadLocal外,ResulablePool已经extends了ConcurrentLinkedQueue;RoundRobin extends CopyOnWriteArrayList,故在二者上的操作其实基本上是直接访问parent的methods,所以是安全的.
Ref:
相关推荐
ycsb-hbase14-binding-0.17.0
HBase(hbase-2.4.9-bin.tar.gz)是一个分布式的、面向列的开源数据库,该技术来源于 Fay Chang 所撰写的Google论文“Bigtable:一个结构化数据的分布式存储系统”。就像Bigtable利用了Google文件系统(File System...
hbase的hbase-1.2.0-cdh5.14.2.tar.gz资源包
HBase 元数据修复工具包。 ①修改 jar 包中的application.properties,重点是 zookeeper.address、zookeeper.nodeParent、hdfs....③开始修复 `java -jar -Drepair.tableName=表名 hbase-meta-repair-hbase-2.0.2.jar`
赠送jar包:hbase-prefix-tree-1.4.3.jar; 赠送原API文档:hbase-prefix-tree-1.4.3-javadoc.jar; 赠送源代码:hbase-prefix-tree-1.4.3-sources.jar; 赠送Maven依赖信息文件:hbase-prefix-tree-1.4.3.pom; ...
phoenix-hbase-2.2-5.1.2-bin.tar.gz
被编译的hive-hbase-handler-1.2.1.jar,用于在Hive中创建关联HBase表的jar,解决创建Hive关联HBase时报FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask. org.apache.hadoop....
赠送jar包:hbase-hadoop-compat-1.1.3.jar; 赠送原API文档:hbase-hadoop-compat-1.1.3-javadoc.jar; 赠送源代码:hbase-hadoop-compat-1.1.3-sources.jar; 赠送Maven依赖信息文件:hbase-hadoop-compat-1.1.3....
phoenix-client-hbase-2.2-5.1.2.jar
赠送jar包:hbase-prefix-tree-1.1.3.jar; 赠送原API文档:hbase-prefix-tree-1.1.3-javadoc.jar; 赠送源代码:hbase-prefix-tree-1.1.3-sources.jar; 赠送Maven依赖信息文件:hbase-prefix-tree-1.1.3.pom; ...
hbase-1.2.1-bin.tar.gz.zip 提示:先解压再使用,最外层是zip压缩文件
hbase-client-2.1.0-cdh6.3.0.jar
赠送jar包:hbase-metrics-api-1.4.3.jar; 赠送原API文档:hbase-metrics-api-1.4.3-javadoc.jar; 赠送源代码:hbase-metrics-api-1.4.3-sources.jar; 赠送Maven依赖信息文件:hbase-metrics-api-1.4.3.pom; ...
赠送jar包:hbase-hadoop-compat-1.1.3.jar; 赠送原API文档:hbase-hadoop-compat-1.1.3-javadoc.jar; 赠送源代码:hbase-hadoop-compat-1.1.3-sources.jar; 赠送Maven依赖信息文件:hbase-hadoop-compat-1.1.3....
赠送jar包:hbase-common-1.4.3.jar; 赠送原API文档:hbase-common-1.4.3-javadoc.jar; 赠送源代码:hbase-common-1.4.3-sources.jar; 赠送Maven依赖信息文件:hbase-common-1.4.3.pom; 包含翻译后的API文档:...
Hbase-1.2.4-bin.tar.gz,HBASE的Linux版安装包。Hadoop学习必备
hbase-2.2.6-bin.tar.gz HBase是一个分布式的、面向列的开源数据库,该技术来源于 Fay Chang 所撰写的Google论文“Bigtable:一个结构化数据的分布式存储系统”。就像Bigtable利用了Google文件系统(File System)所...
phoenix-hbase-1.4-4.16.1-bin
赠送jar包:hbase-client-1.4.3.jar; 赠送原API文档:hbase-client-1.4.3-javadoc.jar; 赠送源代码:hbase-client-1.4.3-sources.jar; 赠送Maven依赖信息文件:hbase-client-1.4.3.pom; 包含翻译后的API文档:...