咱們知道,HBase是一個基於列的NoSQL數據庫,它能夠實現的數據的靈活存儲。它自己是一個大表,在一些應用中,經過設計RowKey,能夠 實現對海量數據的快速存儲和訪問。可是,對於複雜的查詢統計類需求,若是直接基於HBase API來實現,性能很是差,或者,能夠經過實現MapReduce程序來進行查詢分析,這也繼承了MapReduce所具有的延遲性。
實現Impala與HBase整合,咱們可以得到的好處有以下幾個:html
可使用咱們熟悉的SQL,像操做傳統關係型數據庫同樣,很容易給出複雜查詢、統計分析的SQL設計node
Impala查詢統計分析,比原生的MapReduce以及Hive的執行速度快不少數據庫
Impala與HBase整合,須要將HBase的RowKey和列映射到Impala的Table字段中。Impala使用Hive的Metastore來存儲元數據信息,與Hive相似,在於HBase進行整合時,也是經過外部表(EXTERNAL)的方式來實現。apache
準備工做服務器
首先,咱們須要作以下準備工做:app
安裝配置Hadoop集羣(http://www.cloudera.com/content/cloudera-content/cloudera-docs/CDH4/latest/CDH4-Installation-Guide/cdh4ig_topic_4_4.html)ide
安裝配置HBase集羣(http://www.cloudera.com/content/cloudera-content/cloudera-docs/CDH4/latest/CDH4-Installation-Guide/cdh4ig_topic_20.html)oop
涉及到相關係統的安裝配置,能夠參考相關文檔和資料。
下面,咱們經過一個示例表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,通過統計分組後,數據分佈還算均勻。
參考連接