使用Spark RDD实现hbase分布式Scan
主要思路
利用Spark RDD的分布式计算,将一个Scan任务按照自定义的范围切分为小的scan,使用这些RDD实现对scan的并行查询,提高查询效率。核心是手动实现RDD的compute方法与getPartitions方法。
关于Spark RDD
本文中使用到的关于Spark RDD方面的知识主要集中在RDD分区计算上,查看spark源码即可知道,spark RDD中有两个比较重要的方法,一个是compute 用于计算一个指定的分区给当前RDD,一个是getPartitions用于获取当前RDD的一组分区。
主要代码实现
下面是主要的代码实现,具体关于分区范围的值需要自己根据实际情况和自己的需求实现
class HBaseScanRDD(sc: SparkContext, val table: Table) //此处table值不应该出现,仅用于跳过编译错误
extends RDD[Result](sc, Nil) {var ranges = Seq.empty[HRegionInfo]
var regions = new ArrayHRegionInfooverride protected def getPartitions: Array[Partition] = {
var idx = 0
val ps = regions.flatMap { _ =>
val rs = ranges
idx += 1
if (rs.nonEmpty)
Some(idx - 1, rs) //这里的结果为自定义的HBasePartition
else
None
}
ps.as