天天看點

使用spark分析雲HBase的資料

  雲HBase具有很好的線上入庫和查詢能力,不過在分析上面有比較大的欠缺,這篇文章主要介紹如何使用Spark對雲HBase中資料做複雜分析。

HBase原生API:HBase原生API适合基于row key做點查,這個是HBase最擅長的查詢場景

Phoenix:Phoenix作為HBase的SQL層,使用二級索引的技術,擅長多條件組合查詢;Phoenix沒有自己的計算資源,類似groupby這樣的複雜查詢需要借助HBase的協處理器來完成,這樣一方面性能不好,同時會影響HBase叢集的穩定性;

Spark:具有豐富的算子支援複雜分析,使用Spark叢集的計算資源,通過并發分析的方式可以提高性能,同時不影響HBase叢集的穩定性。

  Spark分析HBase資料有“RDD API”、“SQL API”、“HFILE”三種方式,相關對比如下:

方式

特點

優點

缺點

RDD API

1、使用hadoop 社群的TableInputFormat、TableRecordReader工具類,來做split、資料scan;

2、具體API為 newAPIHadoopRDD();

1、spark、HIVE都內建了TableInputFormat、 TableRecordReader工具類

1、這種方式需要把表的所有資料全部scan到spark計算引擎做過濾、複雜計算等;

2、不支援HBase scan API中blockcache的開關以及cachesize的配置,在高并發scan大表時會影響HBase叢集的穩定性

SQL API

1、通過spark的sql 優化器,支援謂詞下推、列裁剪、分區裁剪等優化,盡可能的把優化下推到存儲端,進而提高性能;

2、 具有sql的schema到HBase column的映射,不用寫複雜的類型轉換;

3、支援HBase scan API中blockcache的開關以及cachesize的配置,使用者可以根據場景調整,進而保證雲Hbase的穩定性

1、充分列用HBase的存儲特性,将優化下推到資料源端提高性能

1、使用scan API在分析大表時會增加HBase叢集的load以及memory使用

HFILE

1、spark直接分析表的HFILE,直讀HDFS,完全不用使用HBase叢集資源;

2、spark直接分析表的HFILE與Scan的方式對比,可以減少一次對HFile中資料的序列化和反序列化,提高性能;

1、可以有效解決在高并發scan時導緻HBase叢集load高以及記憶體消耗;

2、直讀HFILE有較好的性能表現

1、spark分析HFILE需要結合HBase的snapshot表的方式來保證分析資料的一緻性

  對于資料動态更新增加的小表推薦使用SQL API的方式,可以有效的優化分析,減少對HBase叢集穩定性的影響;對于靜态表或者全量靜态表的分析推薦使用分析HFILE的方式直讀HDFS,這樣可以完全不影響HBase叢集穩定性;不推薦使用RDD API 的方式,這種方式一方沒有優化性能差,同時在高并發以及表資料量大時,會嚴重影響HBase叢集的穩定性,進而影響線上業務。

依賴項:需要下載下傳雲HBase及雲Phoenix的client包

分析HFILE:

在hbase shell中對表生成snapshot表“snapshot 'sourceTable', ‘snapshotName'”

在項目中配置自己的hdfs-sit.xml檔案,然後通過直讀HDFS的方式分析snapshot表

具體的example

RDD API對應:org.apache.spark.hbase.NativeRDDAnalyze

SQL API對應:org.apache.spark.sql.execution.datasources.hbase.SqlAnalyze

分析HFILE對應:org.apache.spark.hfile.SparkAnalyzeHFILE