hbase是一个nosql型数据库,本文我们会分析一下客户的数据是通过什么样的路径写入到hbase的。
HBase作为一种列族数据库,其将相关性较高的列聚合成一个列族单元,不同的列族单元物理上存储在不同的文件(HFile)内。一个表的数据会水平切割成不同的region分布在集群中不同的regionserver上。客户端访问集群时会首先得到该表的region在集群中的分布,之后的数据交换由客户端和regionserver间通过rpc通信实现,下面我们从hbase源码里探究客户端put数据的流程。本文参考的源码是1.1.2版本的hbase
1)客户端
put在客户端的操作主要分为三个步骤,下面分别从三个步骤展开解释:
(一)、客户端缓存用户提交的put请求
get/delete/put/append/increment等等等等客户可用的函数都在客户端的HTable.java文件中。
在HTable.java文件中有如下的两个变量:
private RpcRetryingCallerFactory rpcCallerFactory;
private RpcControllerFactory rpcControllerFactory;
protected AsyncProcess multiAp;
如上的几个变量分别定义了rpc调用的工厂和一个异步处理的进程
客户端的put请求调用getBufferedMutator().mutate(put),进入mutate这个函数可以看到它会把用户提交的此次put操作放入到列表writeAsyncBuffer中,当buffer中的数据超过规定值时,由后台进程进行提交。
(二)、将writeBuffer中的put操作根据region的不同进行分组,分别放入不同的Map集合
进程提交由函数backgroudFlushCommits完成,提交动作包含同步提交和异步提交两种情况,由传入的参数boolean控制。进入上述函数分析。