Hbase Client端分析

原创文章,请各位多多指导,有错误希望各位能及时告诉我,感激不尽~
1. 不管客户端官方实现是采用processBatchOfRows,还是processBatchOfDeletes这种批量添加,删除,最终插入,删除的核心还是还是getRegionServerWithRetries方法,批量添加,删除还是
a) 批量操作:
1. 生产Map<HServerAddress, MultiAction>,拿到传入的row list,即worklist,这里的rowlist就是缓存中的操作,然后通过row,定位regionlocation,然后得到HserverAddress,然后一个address与multiaction关联,multiaction是一批操作的集合,即put,get,delete 的集合。这个关联操作是在集合中进行的,也就是是说会向multiaction中添加action,action是用regionName,row,originalIndex三个参数构造的,我们知道,put,get,delete都实现了row接口,这样,我们就将serveraddress以及针对这个serveraddress有哪些操作关联了起来。
2. 接下来构造Map<HServerAddress,Future<MultiResponse>>对象,接下来遍历Map<HServerAddress, MultiAction>对象,调用:
futures.put(e.getKey(), pool.submit(createCallable(e.getKey(), e.getValue(), tableName)));方法,这样就会启用线程池去批量执行callable任务,这里的callable任务就是针对每个key -> serveraddress拿到multiaction去执行,然后返回future调用结果。而这里的createCallable方法,就会调用我所说的核心方法getRegionServerWithRetries。
3. 拿到返回的result,根据result的结果,如果为null,那么就放入worklist中,准备重试,返回的也可能是exception,那么就拿到这些exception,然后放入exception list中,接下来判断if (!exceptions.isEmpty()),那么就throw new RetriesExhaustedWithDetailsException,将异常包装之后,抛出。
所以,批量处理无非是启用线程池,将action提交到worklist中,由多个线程去处理,每个线程处理的任务是其实是multiple的,即他的一个任务中,又包含了多个put,get,delete任务,一个线程处理的就是一个serveraddress对应的一批任务。这里的serveraddress是由locateRegion(tableName, row.getRow(), true)确定的,而这个函数就是上面所诉的:Hbase理由代码分析中的核心函数。

猜你喜欢

转载自zlx19900228.iteye.com/blog/1018893