01.07 hbase壓縮以及hive集成映射

一、壓縮

三種階段

1.在數據進入HDFS之前進行壓縮

2.在MapRecduce的shuffle過程中:Map完成 Reduce開始階段 數據在節點之間傳輸的時候進行壓縮

3.數據處理完成存到HDFS之上的時候進行壓縮

總的來說壓縮的目的:

1.節省HDFS的存儲空間,緩解存儲壓力

2.減少網絡傳輸的數據,減輕網絡傳輸負載

hadoop需要支持壓縮

/opt/bigdata/hadoop-2.7.3/bin/hadoop checknative

hbase壓縮以及hive集成映射

hadoop不支持解決辦法:

解壓native-2.7.3-snappy.tar.gz ,替換lib目錄下的native

hbase壓縮以及hive集成映射

Hadoop目錄下

hbase壓縮以及hive集成映射

刪除native

hbase壓縮以及hive集成映射

解壓拷貝native-2.7.3-snappy.tar.gz

tar -zxvf /data/tools/native-2.7.3-snappy.tar.gz -C ./

hbase壓縮以及hive集成映射

再檢查是否支持

hbase壓縮以及hive集成映射

HBase是否支持支持壓縮

/opt/bigdata/hbase-1.2.1/bin/hbase org.apache.hadoop.util.NativeLibraryChecker

hbase壓縮以及hive集成映射

步驟

軟件名稱:hadoop-snappy-0.0.1-SNAPSHOT.tar.gz

hbase壓縮以及hive集成映射

1.解壓

tar -zxvf hadoop-snappy-0.0.1-SNAPSHOT.tar.gz -C /opt/bigdata/hadoop-2.7.3/

hbase壓縮以及hive集成映射

解壓目錄

hbase壓縮以及hive集成映射

目錄結構

hbase壓縮以及hive集成映射

2.配置窗口環境變量

export HBASE_HOME=/opt/bigdata/hbase-1.2.1/

export HADOOP_SNAPPY_HOME=/opt/bigdata/hadoop-2.7.3/hadoop-snappy-0.0.1-SNAPSHOT

export HADOOP_HOME=/opt/bigdata/hadoop-2.7.3

hbase壓縮以及hive集成映射

3.拷貝hadoop-snappy-0.0.1-SNAPSHOT.jar到$HBASE_HOME/lib

cp -r /opt/bigdata/hadoop-2.7.3/hadoop-snappy-0.0.1-SNAPSHOT/lib/hadoop-snappy-0.0.1-SNAPSHOT.jar /opt/bigdata/hbase-1.2.1/lib

hbase壓縮以及hive集成映射

查看包是否拷貝

hbase壓縮以及hive集成映射

4.創建native目錄

mkdir $HBASE_HOME/lib/native

mkdir -p /opt/bigdata/hbase-1.2.1/lib/native

hbase壓縮以及hive集成映射

5.設置軟鏈接

ln -s $HADOOP_HOME/lib/native $HBASE_HOME/lib/native/Linux-amd64-64

hbase壓縮以及hive集成映射

再次在${HBASE_HOME}驗證是否支持壓縮

hbase壓縮以及hive集成映射

重啟habse的進程,以使配置生效

/opt/bigdata/hbase-1.2.1/bin/stop-hbase.sh

/opt/bigdata/hbase-1.2.1/bin/start-hbase.sh

hbase壓縮以及hive集成映射

進入hbase創建支持snappy壓縮的表

bin/hbase shell

hbase壓縮以及hive集成映射

描述表信息

desc 't1'

hbase壓縮以及hive集成映射

更改表的信息 ,t1表是已經有數據的disable 't1'

alter 't1', NAME => 'f', COMPRESSION => 'snappy'

(也可以直接更改

alter 't1', NAME => 'f1, COMPRESSION => 'snappy'

enable 't1'

hbase壓縮以及hive集成映射

查看信息

hbase壓縮以及hive集成映射

做一個練習

創建表 通過{}設置變量值

create 'tsnappy1', { NAME => 'f'}

create 'tsnappy2', { NAME => 'f', COMPRESSION => 'snappy'}

插入相同的數據到兩張表中:看下文件大小,文件小效果不是很明顯,大數據效果會更明顯

二、hive和hbase的集成

注意版本:Hive 1.x will remain compatible with HBase 0.98.x and lower versions. Hive 2.x will be compatible with HBase 1.x and higher

hbase壓縮以及hive集成映射

如果版本不兼容,考慮編譯hive的版本

apache-hive-1.2.1-src.tar.gz

我這裡有一個編譯好的

apache-hive-1.2.1-hbase.tar.gz

hbase壓縮以及hive集成映射

解壓縮

hbase壓縮以及hive集成映射

進入目錄

hive和hbase表之間進行關聯,依賴hive-hbase-handler-1.2.1.jar

hbase壓縮以及hive集成映射

替換hive_home 下lib裡面的jar

rm -f hive-hbase-handler-1.2.1.jar

cp /data/tools/apache-hive-1.2.1-bin/lib/hive-hbase-handler-1.2.1.jar ./

hbase壓縮以及hive集成映射

(1)基本瞭解:

hbase表數據映射到hive表中,數據存在hbase

hive表類型:管理表和外部表

管理表:在hive建表,同時hbase是不存在該表,hbase建相同的表,數據不是在hive,而是在hbase

外部表:在hive建表,同時hbase是存在該表,數據不是在hive,而是在hbase。

(2)框架之間的集成首先考慮的是:jar包和配置。

拷貝jar包到hive/lib下

hbase壓縮以及hive集成映射

上傳

hbase壓縮以及hive集成映射

修改hive-site.xml文件

指定ZK的實例化地址,用於連接hbase集群,因為ZK是訪問入口


hbase.zookeeper.quorum

masterhbase,masterslave1,masterslave2


hbase壓縮以及hive集成映射

啟動hive

hbase壓縮以及hive集成映射

將hive的表映射到hbase

建表(內部表)

CREATE TABLE hbase_table_1(

key int,

name string

)

STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'

WITH SERDEPROPERTIES ("hbase.columns.mapping" = ":key,info:name")

TBLPROPERTIES ("hbase.table.name" = "wzy", "hbase.mapred.output.outputtable" = "wzy");

(1)hbase.columns.mapping:這個屬性必須要寫的

(2)hbase.table.name:這個是映射到hbase表的名稱,這個屬性可選,如果不要,那麼對應的hbase表名稱就是hive

建表的名稱hbase_table_1

(3)hbase.mapred.output.outputtable:這個可選,直接可以不要

hbase壓縮以及hive集成映射

如果報錯及解決辦法

(1)報錯:

FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask. org.apache.hadoop.hbase.HTableDescrip

tor.addFamily(Lorg/apache/hadoop/hbase/HColumnDescriptor;)V

hive和hbase版本之間不兼容

編譯hive的版本支持hbase1.x

解壓hive的tar包

修改倉庫的路徑

hbase壓縮以及hive集成映射

添加hbase的jar

(2)報錯:

FAILED: Execution Error, return code 1 from org.apache.hadoop.hive.ql.exec.DDLTask. MetaException(message:For direct Meta

Store DB connections, we don't support retries at the client level.)

修改mysql元數據的編碼字符集:alter database metastore2 character set latin1;

mysql驅動jar導入hive的lib目錄。

在hbase查看下,表存在了

hbase壓縮以及hive集成映射

可以查看錶信息

hbase壓縮以及hive集成映射

將hbase中的表stu_info映射到hive

再查看一張表

hbase壓縮以及hive集成映射

CREATE EXTERNAL TABLE stu_info(

uuid int,

name string,

age string,

sex string,

job string,

xueli string

)

STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'

WITH SERDEPROPERTIES ("hbase.columns.mapping" = ":key,info:name,info:age,info:sex,work:job,degree:xueli")

TBLPROPERTIES("hbase.table.name" = "stu_info");

hbase壓縮以及hive集成映射

查詢下

select * from stu_info;

hbase壓縮以及hive集成映射

在hive中去加載映射表數據:load是不行的,必須使用要跑mr的。比如:inser into 子查詢的方式

比如建一張表:

create table dept(

deptno int comment '部門編號',

dname string comment '部門名稱',

loc string comment '地址'

)ROW FORMAT DELIMITED FIELDS TERMINATED BY '\\t'

hbase壓縮以及hive集成映射

載入數據

load data local inpath '/data/dept.txt' into table dept;

hbase壓縮以及hive集成映射

插入數據

INSERT OVERWRITE TABLE hbase_table_1 SELECT deptno,dname from dept;

hbase壓縮以及hive集成映射

select * from hbase_table_1;

hbase壓縮以及hive集成映射

scan "wzy"

hbase壓縮以及hive集成映射

在hbase中添加數據

put 'wzy','6','info:name','flume'

hbase壓縮以及hive集成映射

Scan下

hbase壓縮以及hive集成映射

Hive查看下

hbase壓縮以及hive集成映射

所以

在hive表添加數據,hbase可直接更新數據

在hive表添加數據,hbase可直接更新數據

可以看下50070的hive頁面,然後在看50070的hbase

在hive中沒有數據

hbase壓縮以及hive集成映射

在hbase中也沒有

hbase壓縮以及hive集成映射

hbase需要flush下,手動刷新

flush 'wzy'

hbase壓縮以及hive集成映射

Hbase上有了

hbase壓縮以及hive集成映射

但hive上也沒有

hbase壓縮以及hive集成映射

將hbase已經存在的表映射到hive:

想要映射hbase中已經存在的表:那麼在hive中必須要是使用外部表屬性EXTERNAL

CREATE EXTERNAL TABLE hbase_table_2(

uuid int,

username string

)

STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'

WITH SERDEPROPERTIES ("hbase.columns.mapping" = "info:name")

TBLPROPERTIES("hbase.table.name" = "wzy");

hbase壓縮以及hive集成映射

查看下

hbase壓縮以及hive集成映射

針對於映射hbase外部表(可以練習下):

在hive重新修改數據到外部表,hbase數據沒有做更新

在hbase重新修改數據,hive是有變化的

補充一點:key可加可不加

CREATE EXTERNAL TABLE hbase_table_3(

uuid int,

username string

)

STORED BY 'org.apache.hadoop.hive.hbase.HBaseStorageHandler'

WITH SERDEPROPERTIES ("hbase.columns.mapping" = ":key,info:name")

TBLPROPERTIES("hbase.table.name" = "wzy");

hbase壓縮以及hive集成映射

內部表和外部表的區別:

內部表:刪除表,對應的源數據文件就會被刪除

外部表:刪除表,對應的源數據文件不會被刪除

drop刪除hbase_table_3時,數據還在hbase

drop刪除hbase_table_1時,數據就會被刪除,wzy就沒有了。

在hbase和hive進行集成的時候要注意

如果hbase正在實時的往裡面灌數據,這時候使用hive去分析的話,準確性會下降。


分享到:


相關文章: