sparkOnHbase 解決spark讀取hbase數據後不能分佈式操作

版權聲明:本文爲博主原創文章,未經博主允許不得轉載。 https://blog.csdn.net/humanity11/article/details/78058123

問題描述在hbase數據庫中保存了許多的圖像幀數據,其中圖像一行幀數據用在數據表中對應一個rowkey,需要用這許多的rowkey合成一個圖像,發現很慢,和單機上合成圖像有的一比;

影響因爲圖像需要實時合成,合成數據的快慢直接影響了用戶的體驗;

之前的解決思路:在hbase中的rowkey對應的一行圖像幀數據很多,需要先對其進行處理,比如去掉圖像行幀數據中的格式、校驗圖像行等無關信息的去除。之前的解決思路是:通過spark連接hbase,掃描需要合成圖像的行,將其全部讀取出來轉換成rdd,然後查詢出來的數據parallelized操作分區,接着對rdd中數據進行map操作如數據過濾,處理完了後collect合併圖像行,最後調用jar包將圖像行合成圖像,其中合成圖像那裏很快,在處理圖像行幀數據時很慢,無解。

新的思路:http://www.tuicool.com/articles/6ZBnQz2,在這裏似乎已經做好了。其中有一段是這樣描述的:

SparkOnHBase Design : We experimented with many designs for how Spark and HBase integration should work and ended up focusing on a few goals:

Create RDDs through Scan actions or from an existing RDD which are used to generate Get commands.(通過scan和存在的rdd中生成新的rdd,用於生成get命名)爲此他們看了下GraphX API in Spark的實現方式。

最終他們寫了個類HBaseContext,將sparkcontext和hbase結合在一起,完美的解決了sparkrdd 與hbase相結合的問題。 看段代碼:

//造點數據,這些數據就認爲是數據表中的rowkey吧
val rdd = sc.parallelize(Array(
(Bytes.toBytes("1")),
	…
	(Bytes.toBytes("6")),
	(Bytes.toBytes("7"))))
//創建HBaseContext
val conf = HBaseConfiguration.create()
//讀取配置文件,如果將這2個xml放在該類的路徑下如:resource,HBaseConfiguation默認讀取,下面可以省略
conf.addResource(new Path("/etc/hbase/conf/core-site.xml"))
conf.addResource(new Path("/etc/hbase/conf/hbase-site.xml"))
val hbaseContext = new HBaseContext(sc, conf);//將sc和hbase結合在一起
//This is the method we are going to focus on
val getRdd = hbaseContext.bulkGet[Array[Byte], String](
  tableName,  //查詢數據的表名
  2,  //設置批查詢的大小,一般小於 1000
  rdd,  //RDD 用於生成記錄的get
  record => {	 //將查詢記錄轉換成get的方法
	 new Get(record)
  },
  (result: Result) > {  //這個方法用來將查詢結果轉換成序列的對象
	 val it = result.list().iterator()
	 val b = new StringBuilder
	 b.append(Bytes.toString(result.getRow()) + ":")
	 while (it.hasNext()) {
		val kv = it.next()
		val q = Bytes.toString(kv.getQualifier())
		if (q.equals("counter")) {
		  b.append("(" + Bytes.toString(kv.getQualifier()) + "," + Bytes.toLong(kv.getValue()) + ")")
		} else {
		 b.append("(" + Bytes.toString(kv.getQualifier()) + "," + Bytes.toString(kv.getValue()) + ")")
		}
	 }
	 b.toString
  }).collect
上面的getRdd就是處理好的行數據信息rdd集合了。


總結

hbaseContext類結合了sparkrdd的特點,整合hbase表數據Region能最大性能的發揮出spark分佈式多核運算的特點。回想之前思路失敗的原因是,將數據從habse中查詢出來後,之後對圖像幀數據所做的所有操作都是在同一個分區下的map操作,或者說始終是基於父類的窄依賴suffle,導致了數據的處理並沒有完全使用集羣的資源。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章