HBase-1.2.1之查找Region位置的源码学习
2016-07-28 17:00
267 查看
首先需要清楚的是:
zookeeper上存放的是meta表在region的地址
真正的meta表数据是存放在region上的,和其他普通的数据表是一样的。
以get操作为例:
--->RpcRetryingCaller.java中的callWithRetries()方法
--->callable.prepare(tries !=0)
--->RegionServerCallable.java中的prepare(finalBoolean reload)
--->this.location= regionLocator.getRegionLocation(row,reload);
--->connection.getRegionLocation(tableName,row,reload);//获得Region的位置
--->…….
--->ConnectionManager中的
locateRegionInMeta(tableName,row,useCache,retry,replicaid);
--->regionInfoRow = rcs.next();1230行
--->…
--->ClientSmallReversedScanner.loadCache();(在Meta表中查到位置)
--->setStub(getConnection.getClient(this.location.getServerName()));
--->getClient(finalServerName serverName);//建立到该regionserver的连接
--->callable.call(getRemainingTime(callTimeout));
--->HTable中的get方法中重写了该call方法:826行。
zookeeper上存放的是meta表在region的地址
真正的meta表数据是存放在region上的,和其他普通的数据表是一样的。
以get操作为例:
在HTable中的get方法中的
return rpcCallerFactory.<Result>newCaller().callWithRetries(callable,this.operationTimeout);
--->RpcRetryingCaller.java中的callWithRetries()方法
--->callable.prepare(tries !=0)
--->RegionServerCallable.java中的prepare(finalBoolean reload)
--->this.location= regionLocator.getRegionLocation(row,reload);
--->connection.getRegionLocation(tableName,row,reload);//获得Region的位置
--->…….
--->ConnectionManager中的
locateRegionInMeta(tableName,row,useCache,retry,replicaid);
--->regionInfoRow = rcs.next();1230行
--->…
--->ClientSmallReversedScanner.loadCache();(在Meta表中查到位置)
--->setStub(getConnection.getClient(this.location.getServerName()));
--->getClient(finalServerName serverName);//建立到该regionserver的连接
--->callable.call(getRemainingTime(callTimeout));
--->HTable中的get方法中重写了该call方法:826行。
--->ClientProtos.GetRequest request =RequestConverter.buildGetRequest(getLocation().getRegionInfo().getRegionName(), getReq);//注意此时已经得到了region的位置信息(在哪个regionserver上,且建好了连接)
--->ClientProtos.GetResponse response = getStub().get(controller, request);
--->RSRpcService中的get(final RpcController controller, final GetRequest request)
在找到region之后,调用callable的call方法中,给request传过去的是getLoaction().getRegionInfo().getRegionName();即传过去的是regionName。
RegionName的构成:看HRegionInfo中的createRegionName()方法。由此可见,在RegionName中包含的信息有表名tableName。
/** * Make a region name of passed parameters. * @param tableName * @param startKey Can be null * @param id Region id (Usually timestamp from when region was created). * @param replicaId * @param newFormat should we create the region name in the new format * @return Region name made of passed tableName, startKey, id and replicaId */ public static byte [] createRegionName(final TableName tableName, final byte [] startKey, final byte [] id, final int replicaId, boolean newFormat)
相关文章推荐
- QT中的setGeometry参数
- Eclipse FindBugs插件安装与使用
- 视频会议亮点剖析
- 仿IOS 带字母索引的滑轮控件
- 搭建SSH框架时遇到的问题及解决方法
- jfinal2.2 + druid + oracle 11g ORA-00911: 无效字符
- 设计模式GOF23——单例模式
- jenkins和docker 使用docker作为slave
- 数据挖掘——各种分类算法的优缺点
- GDT(全居描述符表)和LDT(局部描述符表)
- 观止云技术实践| 可追溯日志:视频云时代的新运维大胸器
- 深入理解ThreadLocal
- HDU 1044 Collect More Jewels【BFS+DFS+建立距离图】
- STM32F4采集核心板调试记录
- 牛客网 7-28 网络基础 操作系统 编译与体系结构 30题知识点总结
- 用virtual environment让库管理变得简单
- UITextField 只允许输入数字和字母 解决联想中文等问题
- wildfly 在 jee war 外部写配置文件
- MongoDB系列一:CentOS7.2下安装mongoDB3.2.8
- 数据库的垂直划分和水平划分