雲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