1. 認識 Hadoop 和 Hbasehtml
1.1 Hadoop 簡單介紹node
Hadoop 是一個使用 Java 編寫的 Apache 開放源代碼框架,它容許使用簡單的編程模型跨大型計算機的大型數據集進行分佈式處理。Hadoop 框架工做的應用程序能夠在跨計算機羣集提供分佈式存儲和計算的環境中工做。Hadoop 旨在從單一服務器擴展到數千臺機器,每臺機器都提供本地計算和存儲。web
1.2 Hadoop 架構shell
Hadoop 框架包括如下四個模塊:數據庫
Hadoop Common:這些是其餘 Hadoop 模塊所需的 Java 庫和實用程序。這些庫提供文件系統和操做系統級抽象,幷包含啓動 Hadoop 所需的必要 Java 文件和腳本。apache
Hadoop YARN:這是做業調度和集羣資源管理的框架。編程
Hadoop 分佈式文件系統(HDFS):提供對應用程序數據的高吞吐量訪問的分佈式文件系統。vim
Hadoop MapReduce:這是基於 YARN 的大型數據集並行處理系統。服務器
咱們可使用下圖來描述 Hadoop 框架中可用的這四個組件。架構
自 2012 年以來,術語「Hadoop」一般不只指向上述基本模塊,並且還指向能夠安裝在 Hadoop 之上或以外的其餘軟件包,例如 Apache Pig、Apache Hive、Apache HBase、Apache 火花等。
1.3 Hadoop 如何工做?
(1)階段1
用戶/應用程序能夠經過指定如下項目向 Hadoop(Hadoop 做業客戶端)提交所需的進程:
分佈式文件系統中輸入和輸出文件的位置。
Java類以 JAR 文件的形式包含了 Map 和 Reduce 功能的實現。
經過設置做業特定的不一樣參數來進行做業配置。
(2)階段2
而後,Hadoop 做業客戶端將做業(JAR/可執行文件等)和配置提交給 JobTracker,JobTracker 負責將軟件/配置分發到從站,調度任務和監視它們,向做業客戶端提供狀態和診斷信息。
(3)階段3
不一樣節點上的 TaskTrackers 根據 MapReduce 實現執行任務,並將 reduce 函數的輸出存儲到文件系統的輸出文件中。
1.4 Hadoop 的優勢
Hadoop 框架容許用戶快速編寫和測試分佈式系統。它是高效的,它自動分配數據並在機器上工做,反過來利用 CPU 核心的底層並行性。
Hadoop 不依賴硬件提供容錯和高可用性(FTHA),而是 Hadoop 庫自己被設計爲檢測和處理應用層的故障。
服務器能夠動態添加或從集羣中刪除,Hadoop 繼續運行而不會中斷。
Hadoop 的另外一大優勢是,除了是開放源碼,它是全部平臺兼容的,由於它是基於 Java 的。
1.5 HBase 介紹
Hbase 全稱爲 Hadoop Database,即 Hbase 是 Hadoop 的數據庫,是一個分佈式的存儲系統。Hbase 利用 Hadoop 的 HDFS 做爲其文件存儲系統,利用 Hadoop 的 MapReduce 來處理 Hbase 中的海量數據。利用 ZooKeeper 做爲其協調工具。
1.6 HBase 體系架構
Client
包含訪問 HBase 的接口並維護 Cache 來加快對 HBase 的訪問
ZooKeeper
保證任什麼時候候,集羣中只有一個 Master
存貯全部 Region 的尋址入口。
實時監控 Region Server 的上線和下線信息。並實時通知 Master
存儲 HBase 的 Schema 和 table 元數據
Master
爲 Region Server 分配 region
負責 Region Server 的負載均衡
發現失效的 Region Server 並從新分配其上的 region
管理用戶對 table 的增刪改操做
RegionServer
Region Server 維護 region,處理對這些 region 的 IO 請求
Region Server 負責切分在運行過程當中變得過大的 region
HLog(WAL log)
HLog 文件就是一個普通的 Hadoop Sequence File,Sequence File 的 Key 是 HLogKey 對象,HLogKey 中記錄了寫入數據的歸屬信息,除了 table 和 region 名字外,同時還包括 Sequence Number 和 Timestamp,Timestamp 是」 寫入時間」,Sequence Number 的起始值爲 0,或者是最近一次存入文件系統中 Sequence Number。
HLog SequeceFile 的 Value 是 HBase 的 KeyValue 對象,即對應 HFile 中的 KeyValue
Region
HBase 自動把表水平劃分紅多個區域(Rregion),每一個 Region 會保存一個表裏面某段連續的數據;每一個表一開始只有一個 Region,隨着數據不斷插 入表,region 不斷增大,當增大到一個閥值的時候,Region 就會等分會 兩個新的 Region(裂變);
當 table 中的行不斷增多,就會有愈來愈多的 Region。這樣一張完整的表被保存在多個 Regionserver 上。
Memstore 與 StoreFile
一個 Region 由多個 Store 組成,一個 Store 對應一個 CF(列族)
store 包括位於內存中的 Memstore 和位於磁盤的 StoreFile 寫操做先寫入 Memstore,當 MemStore 中的數據達到某個閾值,HRegionServer 會啓動 FlashCache 進程寫入 StoreFile,每次寫入造成單獨的一個 StoreFile
當 StoreFile 文件的數量增加到必定閾值後,系統會進行合併(minor、 major compaction),在合併過程當中會進行版本合併和刪除工做 ,造成更大的 StoreFile。
當一個 Region 全部 StoreFile 的大小和超過必定閾值後,會把當前的 region 分割爲兩個,並由 HMaster 分配到相應的 RegionServer 服務器,實現負載均衡。
客戶端檢索數據,先在 MemStore 找,找不到再找 StoreFile。
HRegion 是 HBase 中分佈式存儲和負載均衡的最小單元。最小單元就表示不一樣的 HRegion 能夠分佈在不一樣的 HRegion Server上。
HRegion 由一個或者多個 Store 組成,每一個 Store 保存一個 Columns Family。
每一個 Strore 又由一個 MemStore 和 0 至多個 StoreFile 組成。
2. 安裝搭建 Hadoop
2.1 配置說明
本次集羣搭建共三臺機器,具體說明下:
主機名IP說明
hadoop01192.168.10.101DataNode、NodeManager、ResourceManager、NameNode
hadoop02192.168.10.102DataNode、NodeManager、SecondaryNameNode
hadoop03192.168.10.106DataNode、NodeManager
2.2 安裝前準備
2.2.1 機器配置說明
注:本集羣內全部進程均由 CLSN 用戶啓動;要在集羣全部服務器都進行操做。
2.2.2 關閉 SELinux、防火牆
2.2.3 準備用戶
2.2.4 修改 Hosts 文件,域名解析
2.2.5 同步時間
2.2.6 SSH 互信配置
(1)生成密鑰對,一直回車便可
(2)保證每臺服務器各自都有對方的公鑰
注:要在集羣全部服務器都進行操做
(3)驗證無祕鑰認證登陸
2.3 配置 JDK
在三臺機器上都須要操做
2.4 安裝 Hadoop
[root@hadoop01 ~]# wget https://mirrors.tuna.tsinghua.edu.cn/apache/hadoop/common/hadoop-3.2.0/hadoop-3.2.0.tar.gz[root@hadoop01 ~]# tar -xvf hadoop-3.2.0.tar.gz -C /usr/local/[root@hadoop01 ~]# chown along.along -R /usr/local/hadoop-3.2.0/[root@hadoop01 ~]# ln -s /usr/local/hadoop-3.2.0/ /usr/local/hadoop
3. 配置啓動 Hadoop
3.1 hadoop-env.sh 配置 Hadoop 環境變量
3.2 core-site.xml 配置 HDFS
3.3 hdfs-site.xml 配置 NameNode
[along@hadoop01 hadoop]$ vim hdfs-site.xml<!-- 設置namenode的http通信地址 -->dfs.namenode.http-addresshadoop01:50070 <!-- 設置secondarynamenode的http通信地址 -->dfs.namenode.secondary.http-addresshadoop02:50090 <!-- 設置namenode存放的路徑 -->dfs.namenode.name.dir/data/hadoop/name <!-- 設置hdfs副本數量 -->dfs.replication2<!-- 設置datanode存放的路徑 -->dfs.datanode.data.dir/data/hadoop/datanode dfs.permissionsfalse[root@hadoop01 ~]# mkdir /data/hadoop/name -p[root@hadoop01 ~]# mkdir /data/hadoop/datanode -p
3.4 mapred-site.xml 配置框架
3.5 yarn-site.xml 配置 ResourceManager
[along@hadoop01 hadoop]$ vim yarn-site.xmlyarn.resourcemanager.hostnamehadoop01 The http address of the RM web application.yarn.resourcemanager.webapp.address${yarn.resourcemanager.hostname}:8088 The address of the applications manager interface in the RM.yarn.resourcemanager.address${yarn.resourcemanager.hostname}:8032 The address of the scheduler interface.yarn.resourcemanager.scheduler.address${yarn.resourcemanager.hostname}:8030 yarn.resourcemanager.resource-tracker.address${yarn.resourcemanager.hostname}:8031 The address of the RM admin interface.yarn.resourcemanager.admin.address${yarn.resourcemanager.hostname}:8033
3.6 配置 Masters & Slaves
3.7 啓動前準備
3.7.1 準備啓動腳本
啓動腳本文件所有位於 /usr/local/hadoop/sbin 文件夾下:
(1)修改 start-dfs.sh stop-dfs.sh 文件添加:
(2)修改 start-yarn.sh 和 stop-yarn.sh 文件添加:
3.7.2 受權
3.7.3 配置 Hadoop 命令環境變量
3.7.4 集羣初始化
3.8 啓動 Hadoop 集羣
3.8.1 第一次啓動前須要格式化,集羣全部服務器都須要
3.8.2 啓動並驗證集羣
(1)啓動 NameNode、DataNode
(2)啓動 YARN
3.9 集羣啓動成功
(1)網頁訪問:http://hadoop01:8088
該頁面爲 ResourceManager 管理界面,在上面能夠看到集羣中的三臺 Active Nodes。
(2)網頁訪問:http://hadoop01:50070/dfshealth.html#tab-datanode
該頁面爲 NameNode 管理頁面
到此 Hadoop 集羣已經搭建完畢!!!
4. 安裝配置 Hbase
4.1 安裝 Hbase
[root@hadoop01 ~]# wget https://mirrors.tuna.tsinghua.edu.cn/apache/hbase/1.4.9/hbase-1.4.9-bin.tar.gz[root@hadoop01 ~]# tar -xvf hbase-1.4.9-bin.tar.gz -C /usr/local/[root@hadoop01 ~]# chown -R along.along /usr/local/hbase-1.4.9/[root@hadoop01 ~]# ln -s /usr/local/hbase-1.4.9/ /usr/local/hbase
注:當前時間 2018.03.08,Hbase-2.1 版本有問題;也多是我配置的問題,Hbase 會啓動失敗;因此,我降級到了 Hbase-1.4.9 版本。
4.2 配置 Hbase
4.2.1 hbase-env.sh 配置 Hbase 環境變量
4.2.2 hbase-site.xml 配置 Hbase
[root@hadoop01 conf]# vim hbase-site.xmlhbase.rootdir<!-- hbase存放數據目錄 -->hdfs://hadoop01:9000/hbase/hbase_db<!-- 端口要和Hadoop的fs.defaultFS端口一致-->hbase.cluster.distributed<!-- 是否分佈式部署 -->truehbase.zookeeper.quorum<!-- zookooper 服務啓動的節點,只能爲奇數個 -->hadoop01,hadoop02,hadoop03<!--zookooper配置、日誌等的存儲位置,必須爲以存在 -->hbase.zookeeper.property.dataDir/data/hbase/zookeeper<!--hbase master -->hbase.masterhadoop01<!--hbase web 端口 -->hbase.master.info.port16666
注:ZooKeeper 有這樣一個特性:
集羣中只要有過半的機器是正常工做的,那麼整個集羣對外就是可用的。
也就是說若是有 2 個 ZooKeeper,那麼只要有 1 個死了 ZooKeeper 就不能用了,由於 1 沒有過半,因此 2 個ZooKeeper 的死亡容忍度爲 0;
同理,要是有 3 個 ZooKeeper,一個死了,還剩下 2 個正常的,過半了,因此 3 個ZooKeeper 的容忍度爲 1;
再多列舉幾個:2->0 ; 3->1 ; 4->1 ; 5->2 ; 6->2 會發現一個規律,2n 和 2n-1 的容忍度是同樣的,都是 n-1,因此爲了更加高效,何須增長那一個沒必要要的ZooKeeper。
4.2.3 指定集羣節點
5. 啓動 Hbase 集羣
5.1 配置 Hbase 命令環境變量
5.2 啓動前準備
5.3 啓動 Hbase
注:只需在 Hadoop01 服務器上操做便可。
(1)啓動
(2)驗證
5.4 頁面查看 Hbase 狀態
網頁訪問 http://hadoop01:16666
6. 簡單操做 Hbase
6.1 Hbase Shell 基本操做命令
名稱命令表達式
建立表create '表名稱','列簇名稱1','列簇名稱2'.......
添加記錄put '表名稱', '行名稱','列簇名稱:','值'
查看記錄get '表名稱','行名稱'
查看錶中的記錄總數count '表名稱'
刪除記錄delete '表名',行名稱','列簇名稱'
刪除表①disable '表名稱' ②drop '表名稱'
查看全部記錄scan '表名稱'
查看某個表某個列中全部數據scan '表名稱',['列簇名稱:']
更新記錄即重寫一遍進行覆蓋
6.2 通常操做
(1)啓動 Hbase 客戶端
[along@hadoop01 ~]$ hbase shell#須要等待一些時間SLF4J:Class path contains multiple SLF4J bindings.SLF4J:Found bindingin[jar:file:/usr/local/hbase-1.4.9/lib/slf4j-log4j12-1.7.10.jar!/org/slf4j/impl/StaticLoggerBinder.class]SLF4J:Found bindingin[jar:file:/usr/local/hadoop-3.2.0/share/hadoop/common/lib/slf4j-log4j12-1.7.25.jar!/org/slf4j/impl/StaticLoggerBinder.class]SLF4J:Seehttp://www.slf4j.org/codes.html#multiple_bindings for an explanation.SLF4J:Actual binding is of type [org.slf4j.impl.Log4jLoggerFactory]HBase ShellUse"help"to get list of supported commands.Use"exit"to quit this interactive shell.Version1.4.9, rd625b212e46d01cb17db9ac2e9e927fdb201afa1, Wed Dec511:54:10PST2018 hbase(main):001:0>
(2)查詢集羣狀態
(3)查詢 Hive 版本
6.3 DDL 操做
(1)建立一個 demo 表,包含 ID 和 info 兩個列簇
(2)得到表的描述
hbase(main):002:0>listTABLE demo 1row(s) in0.6380seconds => ["demo"]---獲取詳細描述hbase(main):003:0> describe'demo'Table demo is ENABLED demo COLUMN FAMILIES DESCRIPTION {NAME =>'id', BLOOMFILTER =>'ROW', VERSIONS =>'1', IN_MEMORY =>'false', KEEP_DELETED_CELLS =>'FALSE', DATA_BLOCK_ENCODING =>'NONE', TTL =>'FOREVER', COMPRESSION =>'NONE', MIN_VERSIONS =>'0', BLOCKCACHE =>'true', BLOCKSIZE =>'65536', REPLICATION_SCOPE =>'0'}{NAME =>'info', BLOOMFILTER =>'ROW', VERSIONS =>'1', IN_MEMORY =>'false', KEEP_DELETED_CELLS =>'FALSE', DATA_BLOCK_ENCODING =>'NONE', TTL =>'FOREVER', COMPRESSION =>'NONE', MIN_VERSIONS =>'0', BLOCKCACHE =>'true', BLOCKSIZE =>'65536', REPLICATION_SCOPE =>'0'}2row(s) in0.3500seconds
(3)刪除一個列簇
注:任何刪除操做,都須要先 disable 表
hbase(main):004:0> disable'demo'0row(s) in2.5930seconds hbase(main):006:0> alter'demo',{NAME=>'info',METHOD=>'delete'}Updating all regions with thenewschema...1/1regions updated.Done.0row(s) in4.3410seconds hbase(main):007:0> describe'demo'Table demo is DISABLED demo COLUMN FAMILIES DESCRIPTION {NAME =>'id', BLOOMFILTER =>'ROW', VERSIONS =>'1', IN_MEMORY =>'false', KEEP_DELETED_CELLS =>'FALSE', DATA_BLOCK_ENCODING =>'NONE', TTL =>'FOREVER', COMPRESSION =>'NONE', MIN_VERSIONS =>'0',BLOCKCACHE =>'true', BLOCKSIZE =>'65536', REPLICATION_SCOPE =>'0'}1row(s) in0.1510seconds
(4)刪除一個表
要先 disable 表,再 drop
6.4 DML 操做
(1)插入數據
hbase(main):024:0>create'demo','id','info'0row(s)in10.0720seconds => Hbase::Table - demohbase(main):025:0>is_enabled'demo'true0row(s)in0.1930seconds hbase(main):030:0>put'demo','example','id:name','along'0row(s)in0.0180seconds hbase(main):039:0>put'demo','example','id:sex','male'0row(s)in0.0860seconds hbase(main):040:0>put'demo','example','id:age','24'0row(s)in0.0120seconds hbase(main):041:0>put'demo','example','id:company','taobao'0row(s)in0.3840seconds hbase(main):042:0>put'demo','taobao','info:addres','china'0row(s)in0.1910seconds hbase(main):043:0>put'demo','taobao','info:company','alibaba'0row(s)in0.0300seconds hbase(main):044:0>put'demo','taobao','info:boss','mayun'0row(s)in0.1260seconds
(2)獲取 demo 表的數據
hbase(main):045:0>get'demo','example'COLUMN CELL id:age timestamp=1552030411620, value=24id:company timestamp=1552030467196, value=taobaoid:name timestamp=1552030380723, value=alongid:sex timestamp=1552030392249, value=male1row(s)in0.8850seconds hbase(main):046:0>get'demo','taobao'COLUMN CELL info:addres timestamp=1552030496973, value=chinainfo:boss timestamp=1552030532254, value=mayuninfo:company timestamp=1552030520028, value=alibaba1row(s)in0.2500seconds hbase(main):047:0>get'demo','example','id'COLUMN CELL id:age timestamp=1552030411620, value=24id:company timestamp=1552030467196, value=taobaoid:name timestamp=1552030380723, value=alongid:sex timestamp=1552030392249, value=male1row(s)in0.3150seconds hbase(main):048:0>get'demo','example','info'COLUMN CELL 0row(s)in0.0200seconds hbase(main):049:0>get'demo','taobao','id'COLUMN CELL 0row(s)in0.0410seconds hbase(main):053:0>get'demo','taobao','info'COLUMN CELL info:addres timestamp=1552030496973, value=chinainfo:boss timestamp=1552030532254, value=mayuninfo:company timestamp=1552030520028, value=alibaba1row(s)in0.0240seconds hbase(main):055:0>get'demo','taobao','info:boss'COLUMN CELL info:boss timestamp=1552030532254, value=mayun1row(s)in0.1810seconds
(3)更新一條記錄
(4)獲取時間戳數據
你們應該看到 Timestamp 這個標記
(5)全表顯示
(6)刪除 ID 爲 example 的 'id:age' 字段
(7)刪除整行
(8)給 example 這個 id 增長 'id:age' 字段,並使用 counter 實現遞增
(9)清空整個表
能夠看出 Hbase 是先 disable 掉該表,而後 drop,最後從新 create 該表來實現清空該表。