天天看點

HBase快速入門系列(8) | 一文教你HBase與Hive如何內建

  大家好,我是不溫蔔火,是一名計算機學院大資料專業大二的學生,昵稱來源于成語—

不溫不火

,本意是

希望自己性情溫和

。作為一名網際網路行業的小白,部落客寫部落格一方面是為了記錄自己的學習過程,另一方面是總結自己所犯的錯誤希望能夠幫助到很多和自己一樣處于起步階段的萌新。但由于水準有限,部落格中難免會有一些錯誤出現,有纰漏之處懇請各位大佬不吝賜教!暫時隻有csdn這一個平台,

  此篇為大家帶來的是HBase與Hive的內建。

目錄

  • 一. 兩者對比
    • 1. Hive
    • 2. HBase
  • 二. HBase與Hive內建使用
    • 1. 編譯jar包
    • 2. 環境準備
    • 3. 測試案例1
    • 4. 測試案例2
标注:
此處為反爬蟲标記:讀者可自行忽略
           
HBase快速入門系列(8) | 一文教你HBase與Hive如何內建

原文位址:javascript:void(0)

  • (1) 資料倉庫

  Hive的本質其實就相當于将HDFS中已經存儲的檔案在Mysql中做了一個雙射關系,以友善使用HQL去管理查詢。

  • (2) 用于資料分析、清洗

  Hive适用于離線的資料分析和清洗,延遲較高。

  • (3) 基于HDFS、MapReduce

  Hive存儲的資料依舊在DataNode上,編寫的HQL語句終将是轉換為MapReduce代碼執行。

  • (1) 資料庫

  是一種面向列存儲的非關系型資料庫。

  • (2) 用于存儲結構化和非結構化的資料

  适用于單表非關系型資料的存儲,不适合做關聯查詢,類似JOIN等操作。

  • (3) 基于HDFS

  資料持久化存儲的展現形式是Hfile,存放于DataNode中,被ResionServer以region的形式進行管理。

  • (4) 延遲較低,接入線上業務使用

  面對大量的企業資料,HBase可以直線單表大量資料的存儲,同時提供了高效的資料通路速度。

由于HBase與Hive的內建的這兩個版本中無法相容。是以,我們重新編譯:

hive-hbase-handler-1.2.2.jar!!好氣

!!

步驟:

  • 1. 建立一個Java項目名稱為

    hive-hbase-handler

    HBase快速入門系列(8) | 一文教你HBase與Hive如何內建
  • 2. 找到源碼包所需要編譯的部分,copy到項目内
    HBase快速入門系列(8) | 一文教你HBase與Hive如何內建
  • 3. 添加依賴(此包為hbase和hive的lib包裡的所有文檔的整合,如有需要可私聊部落客)
    HBase快速入門系列(8) | 一文教你HBase與Hive如何內建
  • 4. 打包jar包
    HBase快速入門系列(8) | 一文教你HBase與Hive如何內建
    HBase快速入門系列(8) | 一文教你HBase與Hive如何內建
    HBase快速入門系列(8) | 一文教你HBase與Hive如何內建
    HBase快速入門系列(8) | 一文教你HBase與Hive如何內建
  • 5.替換原Jar包
HBase快速入門系列(8) | 一文教你HBase與Hive如何內建

  • 1.因為我們後續可能會在操作Hive的同時對HBase也會産生影響,是以Hive需要持有操作HBase的Jar,那麼接下來拷貝Hive所依賴的Jar包(或者使用軟連接配接的形式)。
[bigdata@hadoop002 module]$ sudo vim /etc/profile

export HBASE_HOME=/opt/module/hbase
export HIVE_HOME=/opt/module/hive

// 立即生效
[bigdata@hadoop002 module]$ source /etc/profile
           
  • 軟連接配接
[bigdata@hadoop002 lib]$ ln -s $HBASE_HOME/lib/hbase-common-1.3.1.jar  $HIVE_HOME/lib/hbase-common-1.3.1.jar
[bigdata@hadoop002 lib]$ ln -s $HBASE_HOME/lib/hbase-server-1.3.1.jar $HIVE_HOME/lib/hbase-server-1.3.1.jar
[bigdata@hadoop002 lib]$ ln -s $HBASE_HOME/lib/hbase-client-1.3.1.jar $HIVE_HOME/lib/hbase-client-1.3.1.jar
[bigdata@hadoop002 lib]$ ln -s $HBASE_HOME/lib/hbase-protocol-1.3.1.jar $HIVE_HOME/lib/hbase-protocol-1.3.1.jar
[bigdata@hadoop002 lib]$ ln -s $HBASE_HOME/lib/hbase-it-1.3.1.jar $HIVE_HOME/lib/hbase-it-1.3.1.jar
[bigdata@hadoop002 lib]$ ln -s $HBASE_HOME/lib/htrace-core-3.1.0-incubating.jar $HIVE_HOME/lib/htrace-core-3.1.0-incubating.jar
[bigdata@hadoop002 lib]$ ln -s $HBASE_HOME/lib/hbase-hadoop2-compat-1.3.1.jar $HIVE_HOME/lib/hbase-hadoop2-compat-1.3.1.jar
[bigdata@hadoop002 lib]$ ln -s $HBASE_HOME/lib/hbase-hadoop-compat-1.3.1.jar $HIVE_HOME/lib/hbase-hadoop-compat-1.3.1.jar

           
HBase快速入門系列(8) | 一文教你HBase與Hive如何內建
  • 2. 在hive-site.xml中修改zookeeper的屬性
[bigdata@hadoop002 conf]$ sudo vim hive-site.xml 

// 添加如下内容
<property>
  <name>hive.zookeeper.quorum</name>
  <value>hadoop002,hadoop003,hadoop004</value>
  <description>The list of ZooKeeper servers to talk to. This is only needed for read/write locks.</description>
</property>
<property>
  <name>hive.zookeeper.client.port</name>
  <value>2181</value>
  <description>The port of ZooKeeper servers to talk to. This is only needed for read/write locks.</description>
</property>

           

目标:建立Hive表,關聯HBase表,插入資料到Hive表的同時能夠影響HBase表。

  • 前提準備
// 啟動所需要的服務
[bigdata@hadoop002 module]$ start-dfs.sh 
[bigdata@hadoop003 module]$ start-yarn.sh 
[bigdata@hadoop002 zookeeper-3.4.10]$ bin/start-allzk.sh 
[bigdata@hadoop002 hbase]$ bin/start-hbase.sh 


           
  • 1. 在Hive中建立表同時關聯HBase
// 需要另開視窗
[bigdata@hadoop002 hive]$ bin/hive

CREATE TABLE hive_hbase_emp_table(
empno int,
ename string,
job string,
mgr int,
hiredate string,
sal double,
comm double,
deptno int)
STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
WITH SERDEPROPERTIES ("hbase.columns.mapping" = ":key,info:ename,info:job,info:mgr,info:hiredate,info:sal,info:comm,info:deptno")
TBLPROPERTIES ("hbase.table.name" = "hbase_emp_table");

           

提示:完成之後,可以分别進入Hive和HBase檢視,都生成了對應的表

HBase快速入門系列(8) | 一文教你HBase與Hive如何內建

  這是需要檢視下Hbase裡是否有表建立

[bigdata@hadoop002 hbase]$ bin/hbase shell

// 檢視表格
hbase(main):001:0> list
           
HBase快速入門系列(8) | 一文教你HBase與Hive如何內建
  • 2. 在Hive中建立臨時中間表,用于load檔案中的資料

    提示:不能将資料直接load進Hive所關聯HBase的那張表中

CREATE TABLE emp(
empno int,
ename string,
job string,
mgr int,
hiredate string,
sal double,
comm double,
deptno int)
row format delimited fields terminated by '\t';

           
  • 3. 向Hive中間表中load資料

    上傳資料

    HBase快速入門系列(8) | 一文教你HBase與Hive如何內建
hive> hive> load data local inpath '/opt/module/datas/emp.txt' into table emp;
           
HBase快速入門系列(8) | 一文教你HBase與Hive如何內建
  • 4. 通過insert指令将中間表中的資料導入到Hive關聯HBase的那張表中
hive> insert into table hive_hbase_emp_table select * from emp;
           
HBase快速入門系列(8) | 一文教你HBase與Hive如何內建
  • 5. 檢視Hive以及關聯的HBase表中是否已經成功的同步插入了資料

Hive:

hive> select * from hive_hbase_emp_table;
           
HBase快速入門系列(8) | 一文教你HBase與Hive如何內建

HBase:

hbase> scan ‘hbase_emp_table’
           
HBase快速入門系列(8) | 一文教你HBase與Hive如何內建

  目标:在HBase中已經存儲了某一張表hbase_emp_table,然後在Hive中建立一個外部表來關聯HBase中的hbase_emp_table這張表,使之可以借助Hive來分析HBase這張表中的資料。(前提要先完成案例1)

  • 1. 在Hive中建立外部表
CREATE EXTERNAL TABLE relevance_hbase_emp(
empno int,
ename string,
job string,
mgr int,
hiredate string,
sal double,
comm double,
deptno int)
STORED BY 
'org.apache.hadoop.hive.hbase.HBaseStorageHandler'
WITH SERDEPROPERTIES ("hbase.columns.mapping" = 
":key,info:ename,info:job,info:mgr,info:hiredate,info:sal,info:comm,info:deptno") 
TBLPROPERTIES ("hbase.table.name" = "hbase_emp_table");

           
HBase快速入門系列(8) | 一文教你HBase與Hive如何內建
  • 2. 關聯後就可以使用Hive函數進行一些分析操作了
// 可快速檢視内容,第一次比較慢
hive (default)> select * from relevance_hbase_emp;
           
HBase快速入門系列(8) | 一文教你HBase與Hive如何內建

  本次的分享就到這裡了,

繼續閱讀