HBASE與hive對比使用以及HBASE常用shell操作。與sqoop的集成
2.6、與 Hive 的集成
2.6.1、HBase 與 Hive 的對比
1) Hive
(1) 數據倉庫
Hive 的本質其實就相當於將 HDFS 中已經存儲的文件在 Mysql 中做了一個雙射關系,以方 便使用 HQL 去管理查詢。
(2) 用於數據分析、清洗
Hive 適用於離線的數據分析和清洗,延遲較高。
(3) 基於 HDFS、MapReduce
Hive 存儲的數據依舊在 DataNode 上,編寫的 HQL 語句終將是轉換為 MapReduce 代碼執行。
2) HBase
(1) 數據庫
是一種面向列存儲的非關系型數據庫。
(2) 用於存儲結構化和非結構話的數據 適用於單表非關系型數據的存儲,不適合做關聯查
詢,類似JOIN 等操作
(3) 基於 HDFS
數據持久化存儲的體現形式是 Hfile,存放於 DataNode 中,被 ResionServer 以 region 的形式 進行管理。
(4) 延遲較低,接入在線業務使用
面對大量的企業數據,HBase 可以直線單表大量數據的存儲,同時提供了高效的數據訪問速 度。
2.6.2、HBase 與 Hive 集成使用
尖叫提示:HBase 與 Hive 的集成在最新的兩個版本中無法兼容。所以,我們只能含著淚勇 敢的重新編譯:hive-hbase-handler-1.2.2.jar!!好氣!!
環境準備
因為我們後續可能會在操作 Hive 的同時對 HBase 也會產生影響,所以 Hive 需要持有操作
$ export HBASE_HOME= ~/hadoop_home/hbase-1.2.6
$ export HIVE_HOME= ~/hadoop_home/apache-hive-2.3.4-bin
$ ln -s $HBASE_HOME/lib/hbase-common-1.2.6.jar HIVE_HOME/lib/hbase-common-1.2.6.jar
$ ln -s $HBASE_HOME/lib/hbase-server-1.2.6.jar $HIVE_HOME/lib/hbase-server-1.2.6.jar
$ ln -s $HBASE_HOME/lib/hbase-protocol-1.2.6.jar $HIVE_HOME/lib/hbase-protocol-1.2.6.jar
$ ln -s $HBASE_HOME/lib/hbase-it-1.2.6.jar $HIVE_HOME/lib/hbase-it-1.2.6.jar
$ ln -s $HBASE_HOME/lib/htrace-core-3.1.0-incubating.jar HIVE_HOME/lib/htrace-core-3.1.0-incubating.jar
$ ln -s $HBASE_HOME/lib/hbase-hadoop2-compat-1.2.6.jar HIVE_HOME/lib/hbase-hadoop2-compat-1.2.6.jar
$ ln -s $HBASE_HOME/lib/hbase-hadoop-compat-1.2.6.jar HIVE_HOME/lib/hbase-hadoop-compat-1.2.6.jar
同時在 hive-site.xml 中修改 zookeeper 的屬性,如下:
<property>
<name>hive.zookeeper.quorum</name>
<value>master,node1,node2</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>
1) 案例一
目標:建立 Hive 表,關聯 HBase 表,插入數據到 Hive 表的同時能夠影響 HBase 表。
分步實現:
(1) 在 Hive 中創建表同時關聯 HBase
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 查看,都生成了對應的表
(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 數據
hive> load data local inpath ‘/home/hadoop_home/emp.txt‘ into table emp;
(4) 通過 insert 命令將中間表中的數據導入到 Hive 關聯 HBase 的那張表中
hive> insert into table hive_hbase_emp_table select * from emp;
(5) 查看 Hive 以及關聯的 HBase 表中是否已經成功的同步插入了數據
Hive:hive> select * from hive_hbase_emp_table;
HBase:
hbase> scan ‘hbase_emp_table’
2) 案例二
目標:在 HBase 中已經存儲了某一張表 hbase_emp_table,然後在 Hive 中創建一個外部表來
關聯 HBase 中的 hbase_emp_table 這張表,使之可以借助 Hive 來分析 HBase 這張表中的數 據。
註:該案例 2 緊跟案例 1 的腳步,所以完成此案例前,請先完成案例 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");
(2) 關聯後就可以使用 Hive 函數進行一些分析操作了
hive (default)> select * from relevance_hbase_emp;
2.7、與 Sqoop 的集成
Sqoop supports additional import targets beyond HDFS and Hive. Sqoop can also import records into a table in HBase.
之前我們已經學習過如何使用 Sqoop 在 Hadoop 集群和關系型數據庫中進行數據的導入導出
工作,接下來我們學習一下利用 Sqoop 在 HBase 和 RDBMS 中進行數據的轉儲。
1) 案例
目標:將 RDBMS 中的數據抽取到 HBase 中
分步實現:
(1) 配置 sqoop-env.sh,添加如下內容:
export HBASE_HOME=~/hadoop_home/hbase-1.2.6
(2) 在 Mysql 中新建一個數據庫 db_library,一張表 book
CREATE DATABASE db_library; CREATE TABLE db_library.book(
id int(4) PRIMARY KEY NOT NULLAUTO_INCREMENT, name VARCHAR(255) NOT NULL,
price VARCHAR(255) NOT NULL);
(3) 向表中插入一些數據
INSERT INTO db_library.book (name, price) VALUES(‘Lie Sporting‘, ‘30‘);
INSERT INTO db_library.book (name, price) VALUES(‘Pride & Prejudice‘, ‘70‘);
INSERT INTO db_library.book (name, price) VALUES(‘Fall of Giants‘, ‘50‘);
(4) 執行 Sqoop 導入數據的操作
$ bin/sqoop import \
--connect jdbc:mysql://master:3306/db_library \
--username root \
--password 111111 \
--table book \
--columns "id,name,price" \
--column-family "info" \
--hbase-create-table \
--hbase-row-key "id" \
--hbase-table "hbase_book" \
--num-mappers 1 \
--split-by id
尖叫提示:sqoop1.4.6 只支持 HBase1.0.1 之前的版本的自動創建 HBase 表的功能
解決方案:手動創建 HBase 表
hbase> create ‘hbase_book‘,‘info‘
(5) 在 HBase 中 scan 這張表得到如下內容
hbase> scan ‘hbase_book’
思考:嘗試使用復合鍵作為導入數據時的 rowkey。
2.8、常用的 Shell 操作
1) satus
例如:顯示服務器狀態
hbase> status ‘master’
2) whoami
顯示 HBase 當前用戶,例如:
hbase> whoami
3) list
顯示當前所有的表
hbase> list
4) count
統計指定表的記錄數,例如:
hbase> count ‘hbase_book‘
5) describe
展示表結構信息
hbase> describe ‘hbase_book‘
6) exist
檢查表是否存在,適用於表量特別多的情況
hbase> exist ‘hbase_book‘
7) is_enabled/is_disabled
檢查表是否啟用或禁用
hbase> is_enabled ‘hbase_book‘
hbase> is_disabled ‘hbase_book‘
8) alter
該命令可以改變表和列族的模式,例如:
為當前表增加列族:
hbase> alter ‘hbase_book‘, NAME => ‘CF2‘, VERSIONS => 2
為當前表刪除列族:
hbase> alter ‘hbase_book‘, ‘delete‘ => ’CF2’
9) disable
禁用一張表
hbase> disable ‘hbase_book‘
10) drop
刪除一張表,記得在刪除表之前必須先禁用
hbase> drop ‘hbase_book‘
11) delete
刪除一行中一個單元格的值,例如:
hbase> delete ‘hbase_book’, ‘rowKey’, ‘CF:C’
12) truncate
清空表數據,即禁用表-刪除表-創建表
hbase> truncate ‘hbase_book‘
13) create
創建表,例如:
hbase> create ‘table’, ‘cf’
創建多個列族:
hbase> create ‘t1‘, {NAME => ‘f1‘}, {NAME => ‘f2‘}, {NAME => ‘f3‘}
2.9、數據的備份與恢復
2.9.1、備份
停止 HBase 服務後,使用 distcp 命令運行 MapReduce 任務進行備份,將數據備份到另一個 地方,可以是同一個集群,也可以是專用的備份集群。 即,把數據轉移到當前集群的其他目錄下(也可以不在同一個集群中):
hadoop fs -cp 即可
$ bin/hadoop distcp \ hdfs://master:9000/hbase \
hdfs://master:9000/HbaseBackup/backup20190315
尖叫提示:執行該操作,一定要開啟 Yarn 服務
2.9.2、恢復
非常簡單,與備份方法一樣,將數據整個移動回來即可。
$ bin/hadoop distcp \
hdfs://master:9000/HbaseBackup/backup20190315 \ hdfs://master:9000/hbase
2.10、節點的管理
2.10.1、服役(commissioning)
當啟動 regionserver 時,regionserver 會向 HMaster 註冊並開始接收本地數據,開始的時候, 新加入的節點不會有任何數據,平衡器開啟的情況下,將會有新的 region 移動到開啟的 RegionServer 上。如果啟動和停止進程是使用 ssh 和 HBase 腳本,那麽會將新添加的節點的 主機名加入到 conf/regionservers 文件中。
2.10.2、退役(decommissioning)
顧名思義,就是從當前 HBase 集群中刪除某個 RegionServer,這個過程分為如下幾個過程:
1) 停止負載平衡器
hbase> balance_switch false
2) 在退役節點上停止RegionServer
hbase> hbase-daemon.sh stop regionserver
3) RegionServer 一旦停止,會關閉維護的所有region
Zookeeper 上的該RegionServer 節點消失
Master 節點檢測到該RegionServer 下線
RegionServer 的region 服務得到重新分配
該關閉方法比較傳統,需要花費一定的時間,而且會造成部分region 短暫的不可用。
另一種方案:
1) RegionServer 先卸載所管理的region
$ bin/graceful_stop.sh <RegionServer-hostname>
2) 自動平衡數據
3) 和之前的2~6 步是一樣的
2.11、版本的確界
1) 版本的下界
默認的版本下界是 0,即禁用。row 版本使用的最小數目是與生存時間(TTL Time To Live) 相結合的,並且我們根據實際需求可以有 0 或更多的版本,使用 0,即只有 1 個版本的值寫 入 cell。
2) 版本的上界
之前默認的版本上界是 3,也就是一個 row 保留 3 個副本(基於時間戳的插入)。該值不要 設計的過大,一般的業務不會超過 100。如果 cell 中存儲的數據版本號超過了 3 個,再次插 入數據時,最新的值會將最老的值覆蓋。(現版本已默認為 1)
HBASE與hive對比使用以及HBASE常用shell操作。與sqoop的集成