项目中,常常会向hbase中存储东西,put()也是会向hbase中存储,但是batch可以批处理方式进行存储,效率更快,所以自己决定学习和分析下batch()源码
hbase版本
hbase1.3.1, 不同版本可能会有些许差距
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-snDAxomo-1573199896561)(13CCA816219641719762E11945FECCB7)]
在Table.java的接口文件中具体源码如下:
因为接口文件中没有具体实现,跳转到HTable.java文件中的batch()方法, 具体代码如下:
其中:
- multiAp --是一个异步操作进程
表示批量提交操作在hbase中是异步进行的
- 通过submitAll()函数进行提交任务
底层中使用了AsyncProcess.java类中的submitAll()方法进行提交任务
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-aqQZt6vv-1573199896562)(F0A21E01080B4404984DBEE85DF46D79)]
具体代码如下:
createAsyncRequestFuture()方法具体代码如下:
AsyncRequestFutureImpl类的组成结构
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-CfbuuHl1-1573199896562)(7AE7C3718CB34295AFAA8CD2DF14988E)]
可以看出类中有两个runnable子类
AsyncRequestFutureImpl类的构造函数
然后程序就会执行groupAndSendMultiAction()这个函数, 对每个区域服务器的操作列表进行分组,并发送操作列表
- 首先会查找region的位置
- 获取对应的HRegionLocation
- 添加到队列中
- 调用sendMultiAction()进行发送