作者 | 廣???責編 | 張文
頭圖 | CSDN 下載自視覺中國
HBase 雖然可以存儲數億或數十億行數據,但是對于數據分析來說不太友好,它只提供了簡單的基于 Key 值的快速查詢能力,沒法進行大量的條件查詢。
現有 HBase 的查詢工具有很多如:Hive、Tez、Impala、Shark/Spark、Phoenix 等。今天主要說 Hive。
Hive 方便地提供了 Hive QL 的接口來簡化 MapReduce 的使用, 而 HBase 提供了低延遲的數據庫訪問。如果兩者結合,可以利用 MapReduce 的優勢針對 HBase 存儲的大量內容進行離線的計算和分析。
Hive 與 HBase 整合的實現是利用兩者本身對外的 API 接口互相通信來完成的。這種相互通信是通過 $HIVE_HOME/lib/hive-hbase-handler-{hive.version}.jar 工具類實現的。
通過 HBaseStorageHandler,Hive 可以獲取到 Hive 表所對應的 HBase 表名、列簇和列、InputFormat、OutputFormat 類、創建和刪除 HBase 表等。
hbase replication?Hive 訪問 HBase 中表數據,實質上是通過 MapReduce 讀取 HBase 表數據,其實現是在 MR 中,使用 HiveHBaseTableInputFormat 完成對 HBase 表的切分,獲取 RecordReader 對象來讀取數據。
對 HBase 表的切分原則是一個 Region 切分成一個 Split,即表中有多少個 Regions,MR 中就有多少個 Map;讀取 HBase 表數據都是通過構建 Scanner,對表進行全表掃描,如果有過濾條件,則轉化為 Filter。當過濾條件為 rowkey 時,則轉化為對 rowkey 的過濾;Scanner 通過 RPC 調用 RegionServer 的 next()來獲取數據;
基本通信原理如下:
Hive-HBase
新建 HBase 表:
create 'test', 'f1'
插入數據:
put 'test','1','f1:c1','name1'put 'test','1','f1:c2','name2'put 'test','2','f1:c1','name1'put 'test','2','f1:c2','name2'put 'test','3','f1:c1','name1'put 'test','3','f1:c2','name2'
這里 HBase 有個列簇 f1,有兩個列 c1 和 c2,新建 Hive 表關聯 HBase 的這兩列:
SET hbase.zookeeper.quorum=zkNode1,zkNode2,zkNode3;SET zookeeper.znode.parent=/hbase;ADD jar hive-hbase-handler-{hive.version}.jar;CREATE EXTERNAL TABLE test.test (rowkey string,c1 string,c2 string) STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'WITH SERDEPROPERTIES ("hbase.columns.mapping" = ":key,f1:c1,f1:c2")TBLPROPERTIES ("hbase.table.name" = "test");
hadoop hbase?這里使用外部表映射到 HBase 中的表,Hive 對應的 hdfs 目錄是空的,數據仍然在 HBase 中,這樣在 Hive 中刪除表,并不會刪除 HBase 中的表,否則,就會刪除。
另外,除了 rowkey,其他三個字段使用 Map 結構來保存 HBase 中的每一個列族。
其中,參數解釋如下:
hbase.zookeeper.quorum:
指定 HBase 使用的 zookeeper 集群,默認端口是 2181,可以不指定;如果指定,格式為 zkNode1:2222,zkNode2:2222,zkNode3:2222
zookeeper.znode.parent
hadoop和hbase對應版本。指定 HBase 在 zookeeper 中使用的根目錄
hbase.columns.mapping
Hive 表和 HBase 表的字段一一映射,分別為:Hive 表中第一個字段映射:key(rowkey),第二個字段映射列族 f1:c1,第三個字段映射列族 f1:c2。
hbase.table.name
HBase 中表的名字
也可以直接在 Hive 中創建表的同時,完成在 HBase 中創建表。
在 Hive 中查詢 HBase 表:
hive> select * from test.test;OK1 name1 name22 name1 name23 name1 name2
hbase集群搭建,也可以插入數據:
insert into test.test select '4', 'name4', 'name4';
查看 HBase 的數據:
hive> select * from test.test;OK1 name1 name22 name1 name23 name1 name24 name4 name4
Hive 關聯 HBase 實際是底層是 MR,速度較慢,此時可以使用 spark sql 讀取 Hive 表,進行查詢操作,從而訪問 HBase 數據。
程序員如何避免陷入“內卷”、選擇什么技術最有前景,中國開發者現狀與技術趨勢究竟是什么樣?快來參與「2020?中國開發者大調查」,更有豐富獎品送不停!
?我們差點就用不上 Java 了!?印度永久封禁了微信、百度、TikTok 等 59 款中國 App……
?RISC-V 正在成為芯片世界中的 Linux
版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。
工作时间:8:00-18:00
客服电话
电子邮件
admin@qq.com
扫码二维码
获取最新动态