hbase1.3
hbase将表横向切分为不同的region, 放在不同的server上, 那么指示客户端去哪里寻找需要的region的元信息存在哪里了呢:
答: 这些元信息也存在了region(root和meta)中, 被放置在server上, 且只有zookeeper知道, 分为root表和meta表的是在0.96版本之前. 但是开发人员发现,对于一般的集群, 仅仅meta表就够用了, 所以在那之后,暂时取消了root表, 取消root表对于第一次读也带来了便利, 少一次获取root表的rpc. 客户端会缓存这些元信息, 以减少后续操作的rpc.
客户端通过conf创建连接, 所有的连接由HConnectionManager
类管理, 这个类提供了根据conf创建HConnection的接口, 且内部维持一个Map, 对于相同的conf, 总是返回相同的HConnection实例, 可以让客户端HTable有效利用元信息缓存. 因为所有的客户端实例都共享相同的HConnection的缓存, 有region的位置, zookeeper信息等, 所以, 对于HConnection实例的清理会不那么方便, 目前是客户端调用#deleteConnection(Configuration)方法, 关闭zookeeper客户端, HConnection实例的资源, 关闭连接服务器的代理.虽然清理Hconnection实例本身不会有大问题(会拖慢关闭的速度, 打印一些zookeeper的错误日志), 但是若是在其他客户端使用HConnection的时候清理, 可能会造成一些问题, 因此, 使用起来仍然小心.
- 若不想你的Hconnection被共享, 则创建的时候为"hbase.client.instance.id"指定一个独特的值.
- 可以添加钩子来关闭HConnection实例
网友评论