如何整合hive和hbase

      網(wǎng)友投稿 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

      hdfs://test1:9000/hbase

      The directory shared byregion servers.

      hbase.zookeeper.property.clientPort

      2181

      Property from ZooKeeper'sconfig zoo.cfg. The port at which the clients will connect. ?

      zookeeper.session.timeout

      120000

      hbase.zookeeper.quorum

      test1

      hbase.tmp.dir

      /root/hbase/tmp

      hbase.cluster.distributed

      false

      說明: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和hbase

      然后在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)容。

      上一篇:EXCEL對數(shù)據(jù)進行美化處理讓差距看起來不是那么的大(excel如何美化數(shù)據(jù))
      下一篇:excel 連接字符串(excel連接字符串的運算符)
      相關文章
      亚洲精品无码你懂的网站| 亚洲精品无码成人| 亚洲A∨午夜成人片精品网站| 亚洲首页国产精品丝袜| 亚洲熟妇av一区| 91亚洲va在线天线va天堂va国产 | 亚洲无人区码一二三码区别图片 | 亚洲精品国产精品国自产观看| 日韩国产精品亚洲а∨天堂免| 亚洲自偷自偷在线成人网站传媒| 亚洲www在线观看| 色老板亚洲视频免在线观| 亚洲天堂男人影院| 亚洲午夜无码久久| 亚洲a∨国产av综合av下载| 在线视频亚洲一区| 亚洲男女内射在线播放| 亚洲视频一区二区| 亚洲精品无码久久一线| 亚洲精品成人无码中文毛片不卡| 国产成A人亚洲精V品无码| 亚洲AV无码国产精品色午友在线| 久久精品国产99精品国产亚洲性色| 久久精品亚洲综合一品| 91亚洲自偷手机在线观看| 18gay台湾男同亚洲男同| 亚洲特级aaaaaa毛片| 国产成人亚洲精品| 亚洲色成人四虎在线观看| 亚洲av乱码一区二区三区按摩| 国产亚洲精品美女| 久久精品国产亚洲一区二区三区| 亚洲色欲色欲www在线丝| 亚洲AV人无码激艳猛片| 亚洲欧洲精品久久| 亚洲中文字幕乱码AV波多JI| 亚洲av午夜国产精品无码中文字| 亚洲国产婷婷综合在线精品 | 亚洲午夜国产精品无码| 亚洲精品免费视频| 亚洲导航深夜福利|