impala同步hive數據

參考鏈接

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)的方式來實現。

準備工作

首先,我們需要做如下準備工作:

涉及到相關係統的安裝配置,可以參考相關文檔和資料。
下面,我們通過一個示例表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;

表結構如圖所示:
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 BYcnt DESC LIMIT 10;

運行結果信息,如下圖所示:
impala-sql-stats
上述程序運行所在Hadoop集羣共有3個Datanode,執行上述統計SQL共用時88.13s。我的Hadoop集羣配置比較低,2個節點是雙核CPU,另一個是4核,內存足夠,大概10G左右,而且還有好多程序在共享這些節點,如數據庫服務器、SOLR集羣等。如果提高配置,做一些優化,針對20000000(2000萬)條記錄做統計分析,應該可以在5s以內出來結果。
由於測試數據是我們隨機生成的,gender取值爲’M’和’F’,user_type的值爲1到10,經過統計分組後,數據分佈還算均勻。

參考鏈接


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