一、壓縮
三種階段
1.在數據進入HDFS之前進行壓縮
2.在MapRecduce的shuffle過程中:Map完成 Reduce開始階段 數據在節點之間傳輸的時候進行壓縮
3.數據處理完成存到HDFS之上的時候進行壓縮
總的來說壓縮的目的:
1.節省HDFS的存儲空間,緩解存儲壓力
2.減少網絡傳輸的數據,減輕網絡傳輸負載
hadoop需要支持壓縮
/opt/bigdata/hadoop-2.7.3/bin/hadoop checknative
![hbase壓縮以及hive集成映射](http://p2.ttnews.xyz/loading.gif)
hadoop不支持解決辦法:
解壓native-2.7.3-snappy.tar.gz ,替換lib目錄下的native
![hbase壓縮以及hive集成映射](http://p2.ttnews.xyz/loading.gif)
Hadoop目錄下
刪除native
解壓拷貝native-2.7.3-snappy.tar.gz
tar -zxvf /data/tools/native-2.7.3-snappy.tar.gz -C ./
再檢查是否支持
HBase是否支持支持壓縮
/opt/bigdata/hbase-1.2.1/bin/hbase org.apache.hadoop.util.NativeLibraryChecker
步驟
軟件名稱:hadoop-snappy-0.0.1-SNAPSHOT.tar.gz
1.解壓
tar -zxvf hadoop-snappy-0.0.1-SNAPSHOT.tar.gz -C /opt/bigdata/hadoop-2.7.3/
解壓目錄
目錄結構
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
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
查看包是否拷貝
4.創建native目錄
mkdir $HBASE_HOME/lib/native
mkdir -p /opt/bigdata/hbase-1.2.1/lib/native
5.設置軟鏈接
ln -s $HADOOP_HOME/lib/native $HBASE_HOME/lib/native/Linux-amd64-64
再次在${HBASE_HOME}驗證是否支持壓縮
重啟habse的進程,以使配置生效
/opt/bigdata/hbase-1.2.1/bin/stop-hbase.sh
/opt/bigdata/hbase-1.2.1/bin/start-hbase.sh
進入hbase創建支持snappy壓縮的表
bin/hbase shell
描述表信息
desc 't1'
更改表的信息 ,t1表是已經有數據的disable 't1'
alter 't1', NAME => 'f', COMPRESSION => 'snappy'
(也可以直接更改
alter 't1', NAME => 'f1, COMPRESSION => 'snappy'
)
enable 't1'
查看信息
做一個練習
創建表 通過{}設置變量值
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
如果版本不兼容,考慮編譯hive的版本
apache-hive-1.2.1-src.tar.gz
我這裡有一個編譯好的
apache-hive-1.2.1-hbase.tar.gz
解壓縮
進入目錄
hive和hbase表之間進行關聯,依賴hive-hbase-handler-1.2.1.jar
替換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 ./
(1)基本瞭解:
hbase表數據映射到hive表中,數據存在hbase
hive表類型:管理表和外部表
管理表:在hive建表,同時hbase是不存在該表,hbase建相同的表,數據不是在hive,而是在hbase
外部表:在hive建表,同時hbase是存在該表,數據不是在hive,而是在hbase。
(2)框架之間的集成首先考慮的是:jar包和配置。
拷貝jar包到hive/lib下
上傳
修改hive-site.xml文件
指定ZK的實例化地址,用於連接hbase集群,因為ZK是訪問入口
hbase.zookeeper.quorum
masterhbase,masterslave1,masterslave2
啟動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:這個可選,直接可以不要
如果報錯及解決辦法
(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的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中的表stu_info映射到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");
查詢下
select * from stu_info;
在hive中去加載映射表數據:load是不行的,必須使用要跑mr的。比如:inser into 子查詢的方式
比如建一張表:
create table dept(
deptno int comment '部門編號',
dname string comment '部門名稱',
loc string comment '地址'
)ROW FORMAT DELIMITED FIELDS TERMINATED BY '\\t'
載入數據
load data local inpath '/data/dept.txt' into table dept;
插入數據
INSERT OVERWRITE TABLE hbase_table_1 SELECT deptno,dname from dept;
select * from hbase_table_1;
scan "wzy"
在hbase中添加數據
put 'wzy','6','info:name','flume'
Scan下
Hive查看下
所以
在hive表添加數據,hbase可直接更新數據
在hive表添加數據,hbase可直接更新數據
可以看下50070的hive頁面,然後在看50070的hbase
在hive中沒有數據
在hbase中也沒有
hbase需要flush下,手動刷新
flush 'wzy'
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數據沒有做更新
在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");
內部表和外部表的區別:
內部表:刪除表,對應的源數據文件就會被刪除
外部表:刪除表,對應的源數據文件不會被刪除
drop刪除hbase_table_3時,數據還在hbase
drop刪除hbase_table_1時,數據就會被刪除,wzy就沒有了。
在hbase和hive進行集成的時候要注意
如果hbase正在實時的往裡面灌數據,這時候使用hive去分析的話,準確性會下降。
閱讀更多 分享電腦學習 的文章