HBase經過七年發展,終於在今年2月底,發布了 1.0.0 版本。這個版本提供了一些讓人激動的功能,並且,在不犧牲穩定性的前提下,引入了新的API。雖然 1.0.0 兼容舊版本的 API,不過還是應該盡早地來熟悉下新版API。並且了解下如何與當下正紅的 Spark 結合,進行數據的寫入與讀取。鑒於國內外有關 HBase 1.0.0 新 API 的資料甚少,故作此文。
本文將分兩部分介紹,第一部分講解使用 HBase 新版 API 進行 CRUD 基本操作;第二部分講解如何將 Spark 內的 RDDs 寫入 HBase 的表中,反之,HBase 中的表又是如何以 RDDs 形式加載進 Spark 內的。
環境配置
為了避免版本不一致帶來不必要的麻煩,API 和 HBase環境都是 1.0.0 版本。HBase 為單機模式,分布式模式的使用方法類似,只需要修改HBaseConfiguration的配置即可。
開發環境中使用 SBT 加載依賴項
name := "SparkLearn" |
HBase 的 CRUD 操作
新版 API 中加入了 Connection,HAdmin成了Admin,HTable成了Table,而Admin和Table只能通過Connection獲得。Connection的創建是個重量級的操作,由於Connection是線程安全的,所以推薦使用單例,其工廠方法需要一個HBaseConfiguration。
val conf = HBaseConfiguration.create() |
創建表
使用Admin創建和刪除表
val userTable = TableName.valueOf("user") |
插入、查詢、掃描、刪除操作
HBase 上的操作都需要先創建一個操作對象Put,Get,Delete等,然后調用Table上的相對應的方法
try{ |
Spark 操作 HBase
寫入 HBase
首先要向 HBase 寫入數據,我們需要用到PairRDDFunctions.saveAsHadoopDataset。因為 HBase 不是一個文件系統,所以saveAsHadoopFile方法沒用。
def saveAsHadoopDataset(conf: JobConf): Unit
Output the RDD to any Hadoop-supported storage system, using a Hadoop JobConf object for that storage system
這個方法需要一個 JobConf 作為參數,類似於一個配置項,主要需要指定輸出的格式和輸出的表名。
Step 1:我們需要先創建一個 JobConf。
//定義 HBase 的配置 |
Step 2: RDD 到表模式的映射
在 HBase 中的表 schema 一般是這樣的:
row cf:col_1 cf:col_2
而在Spark中,我們操作的是RDD元組,比如(1,"lilei",14), (2,"hanmei",18)。我們需要將 RDD[(uid:Int, name:String, age:Int)] 轉換成 RDD[(ImmutableBytesWritable, Put)]。所以,我們定義一個 convert 函數做這個轉換工作
def convert(triple: (Int, String, Int)) = { |
Step 3: 讀取RDD並轉換
//read RDD data from somewhere and convert |
Step 4: 使用saveAsHadoopDataset方法寫入HBase
localData.saveAsHadoopDataset(jobConf) |
讀取 HBase
Spark讀取HBase,我們主要使用SparkContext 提供的newAPIHadoopRDDAPI將表的內容以 RDDs 的形式加載到 Spark 中。
val conf = HBaseConfiguration.create() |
附錄
更完整的代碼已上傳到 Gist 。
- HBaseNewAPI.scala HBase 的 CRUD 操作
- SparkOnHBase.scala Spark 操作 HBase
