參考鏈接
Impala與HBase整合實踐
我們知道,HBase是一個基於列的NoSQL數據庫,它可以實現的數據的靈活存儲。它本身是一個大表,在一些應用中,通過設計RowKey,可以實現對海量數據的快速存儲和訪問。但是,對於複雜的查詢統計類需求,如果直接基於HBase API來實現,性能非常差,或者,可以通過實現MapReduce程序來進行查詢分析,這也繼承了MapReduce所具備的延遲性。
實現Impala與HBase整合,我們能夠獲得的好處有如下幾個:
- 可以使用我們熟悉的SQL,像操作傳統關係型數據庫一樣,很容易給出複雜查詢、統計分析的SQL設計
- Impala查詢統計分析,比原生的MapReduce以及Hive的執行速度快很多
Impala與HBase整合,需要將HBase的RowKey和列映射到Impala的Table字段中。Impala使用Hive的Metastore來存儲元數據信息,與Hive類似,在於HBase進行整合時,也是通過外部表(EXTERNAL)的方式來實現。
準備工作
首先,我們需要做如下準備工作:
- 安裝配置Hadoop集羣(http://www.cloudera.com/content/cloudera-content/cloudera-docs/CDH4/latest/CDH4-Installation-Guide/cdh4ig_topic_4_4.html)
- 安裝配置HBase集羣(http://www.cloudera.com/content/cloudera-content/cloudera-docs/CDH4/latest/CDH4-Installation-Guide/cdh4ig_topic_20.html)
- 安裝配置Hive(http://www.cloudera.com/content/cloudera-content/cloudera-docs/CDH4/latest/CDH4-Installation-Guide/cdh4ig_topic_18.html)
- 安裝配置Impala(http://www.cloudera.com/content/cloudera-content/cloudera-docs/Impala/latest/Installing-and-Using-Impala/ciiu_noncm_installation.html?scroll=noncm_installation)
涉及到相關係統的安裝配置,可以參考相關文檔和資料。
下面,我們通過一個示例表test_info來說明,Impala與HBase整合的步驟:
整合過程
- 在HBase中創建表
首先,我們使用HBase Shell創建一個表,如下所示:
1 |
create 'test_info' , 'info' |
表名爲test_info,只有一個名稱爲info的列簇(Column Family),我們計劃該列簇中存在4個列,分別爲info:user_id、info:user_type、info:gender、info:birthday。
- 在Hive中創建外部表
創建外部表,對應的DDL如下所示:
1 |
CREATE EXTERNAL TABLE sho.test_info( |
2 |
user_id
string, |
3 |
user_type
tinyint, |
4 |
gender
string, |
5 |
birthday
string) |
6 |
ROW
FORMAT SERDE 'org.apache.hadoop.hive.hbase.HBaseSerDe' |
7 |
STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler' |
8 |
WITH SERDEPROPERTIES
( "hbase.columns.mapping" = ":key,
info:user_type, info:gender, info:birthday" ) |
9 |
TBLPROPERTIES( "hbase.table.name" = "test_info" ); |
上面DDL語句中,在WITH SERDEPROPERTIES選項中指定Hive外部表字段到HBase列的映射,其中“:key”對應於HBase中的RowKey,名稱爲“user_id”,其餘的就是列簇info中的列名。最後在TBLPROPERTIES中指定了HBase中要進行映射的表名。
- 在Impala中同步元數據
Impala共享Hive的Metastore,這時需要同步元數據,可以通過在Impala Shell中執行同步命令:
1 |
INVALIDATE
METADATA; |
然後,就可以查看到映射HBase中表的結構:
1 |
DESC test_info; |
表結構如圖所示:
通過上面三步,我們就完成了Impala和HBase的整合配置。
驗證整合
下面,我們通過實踐來驗證上述的配置是否生效。
我們模擬客戶端插入數據到HBase表中,可以使用HBase API或者HBase Thrift來實現,這裏我們使用了HBase Thrift接口來進行操作,詳見文章 HBase Thrift客戶端Java API實踐。
然後,我們就可以通過Impala Shell進行查詢分析。基於上面創建整合的示例表,插入20000000(2000萬)記錄,我們做一個統計分析的示例,SQL語句如下所示:
1 |
SELECT user_type, COUNT (user_id) AS cnt FROM test_info WHERE gender= 'M' GROUP BY user_type ORDER BY cnt DESC LIMIT
10; |
運行結果信息,如下圖所示:
上述程序運行所在Hadoop集羣共有3個Datanode,執行上述統計SQL共用時88.13s。我的Hadoop集羣配置比較低,2個節點是雙核CPU,另一個是4核,內存足夠,大概10G左右,而且還有好多程序在共享這些節點,如數據庫服務器、SOLR集羣等。如果提高配置,做一些優化,針對20000000(2000萬)條記錄做統計分析,應該可以在5s以內出來結果。
由於測試數據是我們隨機生成的,gender取值爲’M’和’F’,user_type的值爲1到10,經過統計分組後,數據分佈還算均勻。
參考鏈接
- http://www.cloudera.com/content/cloudera-content/cloudera-docs/Impala/latest/Installing-and-Using-Impala/ciiu_impala_hbase.html
- http://shiyanjun.cn/archives/111.html