北京中關(guān)村在線官網(wǎng)站群seo
文章作者郵箱:yugongshiye@sina.cn? ? ? ? ? ? ? 地址:廣東惠州
?▲ 本章節(jié)目的
??了解HIve的概念;
??了解HIve與數(shù)據(jù)庫的區(qū)別;
??了解HIve的特點(diǎn);
一、簡介
1. 概述
1. HBase原本是由Yahoo!公司開發(fā)后來貢獻(xiàn)給了Apache的一套開源的、基于Hadoop的、分布式的、可擴(kuò)展的、非關(guān)系型數(shù)據(jù)庫。
2. 如果需要對(duì)大量數(shù)據(jù)進(jìn)行隨機(jī)且實(shí)時(shí)讀寫,那么可以考慮使用HBase。
3. HBase能夠管理非常大的表:billions of rows * millions of columns。
4. HBase是仿照Google的Big Table來進(jìn)行實(shí)現(xiàn)的,因此,HBase和BigTable的原理幾乎一致,只有實(shí)現(xiàn)語言不同。HBase是使用Java語言實(shí)現(xiàn)的,BigTable使用的是C語言實(shí)現(xiàn)的 - HBase最終將數(shù)據(jù)落地到HDFS上。
5. HBase提供了2個(gè)大版本,并且2個(gè)版本都在同時(shí)更新。其中,Hadoop3.1.3版本支持的是HBase2.2.X及以上版本。
6. HBase作為非關(guān)系型數(shù)據(jù)庫,不支持標(biāo)準(zhǔn)的SQL語法,提供了一套全新的命令。
7. HBase能夠存儲(chǔ)稀疏類型的數(shù)據(jù),也因此HBase能夠存儲(chǔ)結(jié)構(gòu)化(數(shù)據(jù)本身有結(jié)構(gòu),經(jīng)過解析之后,能夠用傳統(tǒng)數(shù)據(jù)庫中的一個(gè)或者幾個(gè)表來存儲(chǔ))和半結(jié)構(gòu)化數(shù)據(jù)(數(shù)據(jù)本身有結(jié)構(gòu),但是解析之后無法用傳統(tǒng)數(shù)據(jù)庫中的表來存儲(chǔ))。
8. HBase本身作為數(shù)據(jù)庫,提供了完整的增刪改查的功能。HBase基于HDFS來進(jìn)行存儲(chǔ),HDFS的特點(diǎn)是允許一次寫入多次讀取,不允許修改而允許追加寫入,但是HBase提供了"改"功能,HBase如何實(shí)現(xiàn)"改"功能的?- HBase實(shí)際上并沒有去修改寫入的數(shù)據(jù),而是在文件末尾去追加數(shù)據(jù)。HBase會(huì)對(duì)寫入的每條數(shù)據(jù)自動(dòng)添加一個(gè)時(shí)間戳,當(dāng)用戶獲取數(shù)據(jù)的時(shí)候,HBase自動(dòng)返回最新的數(shù)據(jù),那么從用戶角度來看,就是發(fā)生了數(shù)據(jù)的修改。
9. 在HBase中,數(shù)據(jù)的每一個(gè)時(shí)間戳稱之為是一個(gè)版本。
10. 如果要鎖定唯一的一條數(shù)據(jù),那么需要通過行鍵+列族+列+時(shí)間戳這四個(gè)維度來鎖定,這種結(jié)構(gòu)稱之為是一個(gè)Cell(單元格)。
11. HBase中的表在創(chuàng)建的時(shí)候,如果不指定,那么只對(duì)外提供一個(gè)版本的數(shù)據(jù)。
12. 如果建好表之后再修改可以獲取的版本,那么已經(jīng)添加的數(shù)據(jù)不起作用。
13. 即使表允許對(duì)外獲取多個(gè)版本的數(shù)據(jù),在獲取的時(shí)候如果不指定,依然只獲取一個(gè)版本的數(shù)據(jù)。
2. 基本概念
1. Rowkey:行鍵
a. 在HBase中沒有主鍵的概念,取而代之的是行鍵。
b. 不同于傳統(tǒng)的關(guān)系型數(shù)據(jù)庫,在HBase中,定義表的時(shí)候不需要指定行鍵列,而是在添加數(shù)據(jù)的時(shí)候來手動(dòng)添加行鍵。
c. HBase默認(rèn)會(huì)對(duì)行鍵來進(jìn)行排序,按照字典序排序。
2.?Column Family:列族/列簇
a. 在HBase中,沒有表關(guān)聯(lián)的概念,取而代之的是用列族來進(jìn)行設(shè)計(jì)。
b. 在HBase中,一個(gè)表中至少要包含1個(gè)列族,可以包含多個(gè)列族,理論上不限制列族的數(shù)量。
c. 在HBase中強(qiáng)調(diào)列族,但是不強(qiáng)調(diào)列 - 在定義表的時(shí)候必須定義列族,但是列可以動(dòng)態(tài)增刪,一個(gè)列族中可以包含0到多個(gè)列。
3.?namespace:名稱空間
a. 在HBase中沒有database的概念,取而代之的是namespace。
b. 在HBase啟動(dòng)的時(shí)候,自帶了兩個(gè)空間:default和hbase。hbase空間下放的是HBase的基本信息;在建表的時(shí)候如果不指定,則表默認(rèn)是放在default空間下。
3. 基本命令
命令 | 解釋 |
processlist | 查看當(dāng)前HBase在執(zhí)行的任務(wù) |
status | 查看HBase的運(yùn)行狀態(tài) |
version | 查看HBase的版本 |
whoami | 查看HBase的當(dāng)前用戶 |
create 'person', {NAME => 'basic'}, {NAME => 'info'}, {NAME => 'other'} 或者 create 'person', 'basic', 'info', 'other' | 建立一個(gè)person表,包含3個(gè)列族:basic,info,other |
append 'person', 'p1', 'basic:name', 'Bob' | 在person表中添加一個(gè)行鍵為p1的數(shù)據(jù),向basic列族的name列中添加數(shù)據(jù) |
get 'person', 'p1' | 獲取指定行鍵的數(shù)據(jù) |
get 'person', 'p1', {COLUMN => 'basic'} 或者 get 'person', 'p1', 'basic' | 獲取指定行鍵指定列族的數(shù)據(jù) |
get 'person', 'p1', {COLUMN => ['basic', 'info']} 或者 get 'person', 'p1', 'basic', 'info' | 獲取指定行鍵多列族的數(shù)據(jù) |
get 'person', 'p1', {COLUMN => 'basic:name'} 或者 get 'person', 'p1', 'basic:name' | 獲取指定行鍵指定列的數(shù)據(jù) |
scan 'person' | 掃描整表 |
scan 'person', {COLUMNS => 'basic'} | 獲取指定列族的數(shù)據(jù) |
scan 'person', {COLUMNS => ['basic', 'info']} | 獲取多列族的數(shù)據(jù) |
scan 'person', {COLUMNS => ['basic:name', 'other:address']} | 獲取多個(gè)列的數(shù)據(jù) |
put 'person', 'p1', 'basic:age', 20 | 修改數(shù)據(jù) |
delete 'person', 'p1', 'other:adderss' 或者 deleteall 'person', 'pb', 'basic:name' | 刪除指定行鍵指定列族的指定列 |
deleteall 'person', 'p1' | 刪除指定行鍵的所有數(shù)據(jù) |
create 'students', {NAME => 'basic', VERSIONS => 3}, {NAME => 'info', VERSIONS => 4} | 指定每一個(gè)列族允許對(duì)外獲取的版本數(shù)量 |
desc 'students' 或者 describe 'students' | 描述表 |
get 'students', 's1', {COLUMN => 'basic:age', VERSIONS => 3} | 獲取指定行鍵指定列的指定數(shù)量版本的數(shù)據(jù) |
scan 'students', {COLUMNS => 'basic:age', VERSIONS => 3} | 獲取指定列的指定數(shù)量版本的數(shù)據(jù) |
count 'person' | 統(tǒng)計(jì)person表中行鍵的個(gè)數(shù) |
get_splits 'person' | 獲取person表對(duì)應(yīng)的HRegion的個(gè)數(shù) |
truncate 'person' | 摧毀重建person表 |
list_namespace | 查看所有的空間 |
create_namespace 'demo' | 創(chuàng)建demo空間 |
create 'demo:users', 'basic' | 在demo空間下創(chuàng)建users表 |
list_namespace_tables 'demo' | 獲取demo空間下的所有表 |
describe_namespace 'demo' | 描述demo空間 |
drop_namespace 'demo' | 刪除demo空間,要求這個(gè)空間為空 |
disable 'demo:users' | 禁用表 |
drop 'demo:users' | 刪除表 |
enable 'person' | 啟用表 |
exists 'users' | 判斷表是否存在 |
is_disabled 'person' | 判斷person表是否被禁用 |
is_enabled 'person' | 判斷person表是否被啟用 |
list | 查看所有空間下的所有的表 |
locate_region 'person', 'p1' | 定位p1行鍵所在的HRegion的位置 |
show_filters | 展現(xiàn)所有的過濾器 |
disable_all 'demo:.*' | 禁用demo空間下的所有的表 |
drop_all 'demo.*' | 刪除demo空間下的所有的表 |
enable_all 'demo:.*' | 啟用demo空間下的所有的表 |
4. Hive和HBase的比較
1. Hive本質(zhì)上是一個(gè)用于進(jìn)行數(shù)據(jù)倉庫管理的工具,在實(shí)際過程中經(jīng)常用于對(duì)數(shù)據(jù)進(jìn)行分析和清洗,提供了相對(duì)標(biāo)準(zhǔn)的SQL結(jié)構(gòu),底層會(huì)將SQL轉(zhuǎn)化為MapReduce來執(zhí)行,因此Hive的效率相對(duì)較低,更適合于離線開發(fā)的場(chǎng)景。Hive一般針對(duì)歷史數(shù)據(jù)進(jìn)行分析,一般只提供增加和查詢的能力,一般不會(huì)提供修改和刪除的功能。
2. HBase本質(zhì)上是一個(gè)非關(guān)系型數(shù)據(jù)庫,在實(shí)際過程中,用于存儲(chǔ)數(shù)據(jù)。因?yàn)镠Base的讀寫效率較高,吞吐量較大,因此一般使用HBase來存儲(chǔ)實(shí)時(shí)的數(shù)據(jù),最終數(shù)據(jù)會(huì)落地到HDFS上。HBase作為數(shù)據(jù)庫,提供了完整的增刪改查的能力,但是相對(duì)而言,HBase的事務(wù)能力較弱。HBase不支持SQL,提供了一套完整的命令。
3. 總結(jié):Hive強(qiáng)調(diào)的是分析能力,但是HBase強(qiáng)調(diào)的是存儲(chǔ)能力,相同的地方在于兩者都是利用HDFS來存儲(chǔ)數(shù)據(jù)。
二、安裝
1. 硬件環(huán)境:至少需要3臺(tái)虛擬機(jī)或者云主機(jī),Centos7.5及以上版本,至少需要雙核,至少4G內(nèi)存+20G磁盤。
2. 軟件環(huán)境:JDK1.8+Zookeeper3.5.7+Hadoop3.1.3。
3. 進(jìn)入/home/software目錄下。
cd /home/software
4. 上傳或者下載HBase的安裝包,云主機(jī)的下載地址。
?wget http://bj-yzjd.ufile.cn-north-02.ucloud.cn/hbase-2.4.2-bin.tar.gz
5.?解壓。
tar -xvf hbase-2.4.2-bin.tar.gz
6.?進(jìn)入HBase的配置目錄
cd hbase-2.4.2/conf
7.?編輯文件。
vim hbase-env.sh
#添加如下屬性
export JAVA_HOME=/home/software/jdk1.8
export HBASE_MANAGES_ZK=false
#保存退出,重新生效
source hbase-env.sh
8.?編輯文件。
vim hbase-site.xml
#添加如下內(nèi)容
<!--指定HBase在HDFS上的數(shù)據(jù)存儲(chǔ)目錄-->
<property>
<name>hbase.rootdir</name>
<value>hdfs://hadoop01:9000/hbase</value>
</property>
<!--開啟HBase的分布式-->
<property>
<name>hbase.cluster.distributed</name>
<value>true</value>
</property>
<!--配置Zookeeper的連接地址-->
<property>
<name>hbase.zookeeper.quorum</name>
<value>hadoop01:2181,hadoop02:2181,hadoop03:2181</value>
</property>
<property>
<name>hbase.unsafe.stream.capability.enforce</name>
<value>false</value>
</property>
<property>
<name>hbase.wal.provider</name>
<value>filesystem</value>
</property>
9. 編輯文件。
vim regionservers
#添加當(dāng)前的三臺(tái)主機(jī)的主機(jī)名
10.?需要將Hadoop的核心配置文件拷貝到當(dāng)前的HBase的配置目錄下。
cp /home/software/hadoop-3.1.3/etc/hadoop/core-site.xml ./
11.?回到software目錄下,遠(yuǎn)程拷貝給另外兩臺(tái)云主機(jī)。
cd /home/software/
scp -r hbase-2.4.2 root@hadoop02:$PWD
scp -r hbase-2.4.2 root@hadoop03:$PWD
12.?配置三臺(tái)主機(jī)的環(huán)境變量。
vim /etc/profile
#在文件末尾添加
export HBASE_HOME=/home/software/hbase-2.4.2
export PATH=$PATH:$HBASE_HOME/bin
#保存退出,重新生效
source /etc/profile
13.?啟動(dòng)Zookeeper。
cd /home/software/apache-zookeeper-3.5.7-bin/bin
sh zkServer.sh start
sh zkServer.sh status
14.?在第一臺(tái)主機(jī)上啟動(dòng)Hadoop的HDFS。
start-dfs.sh
15.?在第一臺(tái)主機(jī)上啟動(dòng)HBase。
start-hbase.sh
16.?可以通過IP:16010來訪問HBase的界面。
?