大數(shù)據(jù)“復活”記
1300
2025-03-31
引言??為什么要集成Hive和HBase
Hive和Hbase在大數(shù)據(jù)架構中處在不同位置,Hive是一個構建在Hadoop基礎之上的數(shù)據(jù)倉庫,主要解決分布式存儲的大數(shù)據(jù)處理和計算問題,Hive提供了類SQL語句,叫HiveQL,
通過它可以使用SQL查詢存放在HDFS上的數(shù)據(jù),sql語句最終被轉化為Map/Reduce任務運行,但是Hive不能夠進行交互查詢——它只能夠在Haoop上批量的執(zhí)行Map/Reduce任務。
Hive適合用來對一段時間內(nèi)的數(shù)據(jù)進行分析查詢,例如,用來計算趨勢或者網(wǎng)站的日志。Hive不應該用來進行實時的查詢。因為它需要很長時間才可以返回結果。
Hbase是Hadoop database 的簡稱,是一種NoSQL數(shù)據(jù)庫,非常適用于海量明細數(shù)據(jù)(十億、百億)的隨機實時查詢,如交易清單、軌跡行為等。
在大數(shù)據(jù)架構中,Hive和HBase是協(xié)作關系,Hive方便地提供了Hive QL的接口來簡化MapReduce的使用,?而HBase提供了低延遲的數(shù)據(jù)庫訪問。如果兩者結合,可以利用MapReduce的優(yōu)勢針對HBase存儲的大量內(nèi)容進行離線的計算和分析。
Hive和HBase的通信原理
Hive與HBase整合的實現(xiàn)是利用兩者本身對外的API接口互相通信來完成的,
這種相互通信是通過$HIVE_HOME/lib/hive-hbase-handler-*.jar工具類實現(xiàn)的。通過HBaseStorageHandler,Hive可以獲取到Hive表所對應的HBase表名,列簇和列,InputFormat、OutputFormat類,創(chuàng)建和刪除HBase表等。基本通信原理如下:
訪問
Hive訪問HBase中HTable的數(shù)據(jù),實質上是通過MR讀取HBase的數(shù)據(jù),而MR是使用HiveHBaseTableInputFormat完成對表的切分,獲取RecordReader對象來讀取數(shù)據(jù)的。
對HBase表的切分原則是一個Region切分成一個Split,即表中有多少個Regions,MR中就有多少個Map;
讀取HBase表數(shù)據(jù)都是通過構建Scanner,對表進行全表掃描,如果有過濾條件,則轉化為Filter。當過濾條件為rowkey時,則轉化為對rowkey的過濾;Scanner通過RPC調用RegionServer的next()來獲取數(shù)據(jù)。
簡單來說,Hive和Hbase的集成就是,打通了Hive和Hbase,使得Hive中的表創(chuàng)建之后,可以同時是一個Hbase的表,并且在Hive端和Hbase端都可以做任何的操作。
使用場景:
(一)將ETL操作的數(shù)據(jù)通過Hive加載到HBase中,數(shù)據(jù)源可以是文件也可以是Hive中的表。
(二)Hbae作為Hive的數(shù)據(jù)源,通過整合,讓HBase支持JOIN、GROUP等SQL查詢語法。
(三)構建低延時的數(shù)據(jù)倉庫
一、?配置HBase環(huán)境
修改$HBASE_HOME/conf目錄下的hbase-env.sh,添加以下配置
export JAVA_HOME=/opt/java/jdk1.8
export HADOOP_HOME=/opt/hadoop/hadoop2.8
export HBASE_HOME=/opt/hbase/hbase1.2
export HBASE_CLASSPATH=/opt/hadoop/hadoop2.8/etc/hadoop
export HBASE_PID_DIR=/root/hbase/pids
export HBASE_MANAGES_ZK=false
說明:實際配置的路徑以自己的為準。HBASE_MANAGES_ZK=false 是不啟用HBase自帶的Zookeeper集群。
修改 hbase-site.xml
編輯hbase-site.xml 文件,在添加如下配置
說明:hbase.rootdir:這個目錄是region server的共享目錄,用來持久化Hbase 。hbase.cluster.distributed :Hbase的運行模式。false是單機模式,true是分布式模式。若為false,Hbase和Zookeeper會運行在同一個JVM里面。
二、Hive集成HBase的配置以及測試
1,配置通信接口
因為Hive與HBase集成是利用兩者本身對外的API接口互相通信來完成的,其具體工作交由Hive的lib目錄中的hive-hbase-handler-.jar工具類來實現(xiàn)。所以只需要將hive的 hive-hbase-handler-.jar 復制到hbase/lib中就可以了。
切換到hive/lib目錄下
輸入:
cp hive-hbase-handler-*.jar /opt/hbase/hbase1.2/lib
注: 如果在hive整合hbase中,出現(xiàn)版本之類的問題,那么以hbase的版本為主,將hbase中的jar包覆蓋hive的jar包。
2,hive和hbase集成測試
在進行測試的時候,確保hadoop、hbase、hive環(huán)境已經(jīng)成功搭建好,并且都成功啟動了。
打開xshell的兩個命令窗口
一個進入hive,一個進入hbase
2.1在hive中創(chuàng)建映射到hbase的表
通過復制上面的jar包,我們已經(jīng)實現(xiàn)了hive和hbase底層的打通,在上層我們需要做的是使用HQL在hive中創(chuàng)建一個表
與hbase進行映射,為了方便,設置兩邊的表名都為t_employee,存儲的表也是這個表名。
在hive中輸入:
create table t_employee(id int,name string) stored by 'org.apache.hadoop.hive.hbase.HBaseStorageHandler' with serdeproperties("hbase.columns.mapping"=":key,st1:name") tblproperties("hbase.table.name"="t_employee","hbase.mapred.output.outputtable" = "t_employee");
說明:
a、這里面出現(xiàn)了三個t_employee表名,第一個t_employee 是hive表中的名稱,(id int,name string) 是hive表結構。
在tblproperties 語句中還出現(xiàn)了2個t_employee表,
"hbase.table.name"定義的是在hbase中的表名 ,這個屬性是可選的,僅當你想在Hive和Hbase中使用不同名字的表名時才需要填寫,如果使用相同的名字則可以省略;
"hbase.mapred.output.outputtable"定義的第三個t_employee是存儲數(shù)據(jù)表的名稱,指定插入數(shù)據(jù)時寫入的表,如果以后需要往該表插入數(shù)據(jù)就需要指定該值,這個可以不要,表數(shù)據(jù)就存儲在第二個表中了 。
b、stored by 'org.apache.hadoop.hive.hbase.HBaseStorageHandler' :是指定處理的存儲器,就是hive-hbase-handler-*.jar包,要做hive和hbase的集成必須要加上這一句;
c、“hbase.columns.mapping” 是定義在hive表中的字段怎么與hbase的列族進行映射。
例如:st1就是列族,name就是列。它們之間通過“:”連接。
在hive中創(chuàng)建的t_employee表,包括兩個字段(int型的id和string型的name),映射為hbase中的表t_employee,其中:key對應hbase的rowkey,value對應hbase的st1:name列。
表成功創(chuàng)建之后
在hive、hbase分別中查看表和表結構
hive中輸入
show tables;
describe t_employee;
hbase輸入:
list
describe ‘t_employee’
可以看到表t_employee在hbase中已經(jīng)創(chuàng)建成功了
進入hbase之后,在t_employee中添加兩條數(shù)據(jù) 然后查詢該表
put?'t_employee','1001','st1:name','zhaoqian' put?'t_employee','1002','st1:name','sunli' scan?'t_employee'
然后切換到hive中查詢該表
select?*?from?t_employee;
然后在hive中刪除該表
注:這里是要讓大家看到數(shù)據(jù)同步的結果,所以將表刪除了。如果大家要做測試的話,是沒有必要刪除該表的,因為在后面還會使用該表。
在hive中將表t_employee刪除
drop?table?t_employee;
在Hbase中查看:
可以看到在hbase中t_employee表也被刪除了,hive和hbase之間的數(shù)據(jù)同步成功!
2.3 多列和列族的映射
我們來看一個更復雜一些的例子,Hive表中的3個字段與Hbase中的2個列族的映射。
Hive建表sql命令如下:
create table t_employee2(id int,name string,age,int,salary int)
stored by 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
with serdeproperties("hbase.columns.mapping"=":id,a:b,a:c,d:e") ;
hive 表中的key字段默認與hbase中的row key 對應 ,
Hive字段(name和age)對應到1個Hbase列族(列族a的列b和c,即a:b和a:c),
另一個Hive字段(salary)對應到另一個Hbase列族的單個列(d:e),這里我們并沒有指定hbase中的表名。
假設我們在hive 已有一salary表,現(xiàn)將表salary數(shù)據(jù)插入到表t_employee2:
insert overwrite table t_employee2 select * ?from salary;
在Hbase中查看:
從hive映射HBase
外部表測試——創(chuàng)建一個指向已經(jīng)存在的Hbae表的Hive表
先在hbase中建一張t_employee_info表,添加兩個列族 st1,st2
然后查看表結構
輸入:
create?'t_employee_info','st1','st2'
describe?'t_employee_info'
對于在hbase已經(jīng)存在的表,在hive中使用CREATE EXTERNAL TABLE來建立聯(lián)系
注意:創(chuàng)建外部表要使用EXTERNAL 關鍵字
create external table t_employee_info(id int,age int,sex string)
stored by 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
with serdeproperties("hbase.columns.mapping"=":key,st1:age,st2:sex")
tblproperties("hbase.table.name"="t_employee_info");
然后在t_employee_info 中添加數(shù)據(jù)
put?'t_employee_info','1001','st2:sex','man' put?'t_employee_info','1001','st1:age','32' put?'t_employee_info','1002','st1:age','25' put?'t_employee_info','1002','st2:sex','woman'
然后在hive中查詢該表
輸入:
select?*?from?t_employee_info;
查詢到數(shù)據(jù)之后,然后將t_employee 和t_employee_info進行關聯(lián)查詢。
輸入:
select?*?from?t_employee?a?join?t_employee_info?b?where?a.id=b.id?;
說明:通過關聯(lián)查詢,可以得出表之間是可以關聯(lián)查詢的。
使用Hive集成HBase表的需注意
對HBase表進行預分區(qū),增大其MapReduce作業(yè)的并行度
合理的設計rowkey使其盡可能的分布在預先分區(qū)好的Region上
通過set hbase.client.scanner.caching設置合理的掃描緩存
HBase Hive
版權聲明:本文內(nèi)容由網(wǎng)絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實后本網(wǎng)站將在24小時內(nèi)刪除侵權內(nèi)容。
版權聲明:本文內(nèi)容由網(wǎng)絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發(fā)現(xiàn)本站中有涉嫌抄襲或描述失實的內(nèi)容,請聯(lián)系我們jiasou666@gmail.com 處理,核實后本網(wǎng)站將在24小時內(nèi)刪除侵權內(nèi)容。