使用SparkRDD實現HBase分布式scan

2021-12-29 21:29:24 字數 1324 閱讀 6682

利用spark rdd的分布式計算,將乙個scan任務按照自定義的範圍切分為小的scan,使用這些rdd實現對scan的並行查詢,提高查詢效率。核心是手動實現rdd的compute方法與getpartitions方法。

本文中使用到的關於spark rdd方面的知識主要集中在rdd分割槽計算上,檢視spark原始碼即可知道,spark rdd中有兩個比較重要的方法,乙個是compute 用於計算乙個指定的分割槽給當前rdd,乙個是getpartitions用於獲取當前rdd的一組分割槽。

下面是主要的**實現,具體關於分割槽範圍的值需要自己根據實際情況和自己的需求實現

class hbasescanrdd(sc: sparkcontext, val table: table) //此處table值不應該出現,僅用於跳過編譯錯誤

extends rdd[result](sc, nil)

ps.asinstanceof[array[partition]]

}@developerapi

override def compute(partition: partition, context: taskcontext): >iterator[result] =

}//並行scan

scans.par.map .map(toresultiterator)

.fold(iterator.empty: iterator[result])

}//這裡用於獲取scanner的值

private def toresultiterator(scanner: resultscanner): iterator[result] = else

}cur.isdefined

} override def next(): result =

}iterator}}

case class hbasepartition(

override val index: int,

scanranges: seq[hregioninfo]) extends partition以上**只是用於描述思路,實際使用時還需要對**細節進行處理

注意:由於spark原始碼定義rdd為private[spark],所以該類只能放置與名稱為org.apache.hadoop.hbase.spark的包或子包中,否則會出現編譯錯誤。

u非tips: 由於hbase的scan在服務端查詢時,會分為兩類scanner,乙個查詢memstore,乙個查詢hfile,

其中查詢hfile的scanner會根據設定引數」hbase.storescanner.parallel.seek.enable」

決定是否使用多執行緒對檔案進行查詢,所以建議將該引數設定為true。

Spark RDD使用原則

如今隨著資料量的不斷增加,hadoop已經難以滿足處理需求,逐漸發展起來的spark基於記憶體的平行計算已經得到了廣泛的應用。spark博大精深,編寫起來比hadoop方便很多,簡單的幾行 就可以實現hadoop複雜的 簡單方便!著名的例子就是單詞統計。對於spark效能的調優部分可以檢視美團點評團...

使用sqoop將mysql資料匯入hbase

下表 1 通過hbase shell 開啟hbase。2 建立乙個hbase表 3 將so表的資料匯入到hbase中。opt檔案 connect 資料庫 username 資料庫使用者名稱 password 資料庫密碼 table 需要sqoop的表 columns 表中的列 hbase table...

使用Apache HTTPServer實現負載均衡

採用http 模式配置方法 修改conf目錄下的httpd.conf檔案 第一步 載入module loadmodule proxy module modules mod proxy.so loadmodule proxy balancer module modules mod proxy bala...