一、 HBase的
二、基於Hadoop的HBase架構
HBase內置有zookeeper,但一般我們會有其他的Zookeeper集群來監管master和regionserver,Zookeeper通過選舉,保證任何時候,集群中只有一個活躍的HMaster,HMaster與HRegionServer 啟動時會向ZooKeeper注冊,存儲所有HRegion的尋址入口,實時監控HRegionserver的上線和下線信息。並實時通知給HMaster,存儲HBase的schema和table元數據,默認情況下,HBase 管理ZooKeeper 實例,Zookeeper的引入使得HMaster不再是單點故障。一般情況下會啟動兩個HMaster,非Active的HMaster會定期的和Active HMaster通信以獲取其最新狀態,從而保證它是實時更新的,因而如果啟動了多個HMaster反而增加了Active HMaster的負擔。
一個RegionServer可以包含多個HRegion,每個HRegion維護一個HLog,和多個HFiles以及其對應的MemStore。RegionServer運行於DataNode上,數量可以與DatNode數量一致,請參考如下架構圖:
四、HBase特征簡要
4.1、自動故障處理和負載均衡
HBase運行在HDFS上,所以HBase中的數據以多副本形式存放,數據也服從分布式存放,數據的恢復也可以得到保障。另外,HMaster和RegionServer也是多副本的。
4.2、自動分區
HBase表是由分布在多個RegionServer中的region組成的,這些RegionServer又分布在不同的DataNode上,如果一個region增長到了一個閾值,為了負載均衡和減少IO,HBase可以自動或手動干預的將region切分為更小的region,也稱之為subregion。
4.3、集成Hadoop/HDFS
雖然HBase也可以運行在其他的分布式文件系統之上,但是與HDFS結合非常之方便,而且HDFS也非常之流行。
4.4、實時隨機大數據訪問
HBase采用log-structured merge-tree作為內部數據存儲架構,這種架構會周期性地將小文件合並成大文件以減少磁盤訪問同時減少NameNode壓力。
4.5、MapReduce
HBase內建支持MapReduce框架,更加方便快速,並行的處理數據。
4.6、Java API
HBase提供原聲的Java API支持,方便開發。
4.7、橫向擴展
HBase支持橫向擴展,這就意味着如果現有服務器硬件性能出現瓶頸,不需要停掉現有集群提升硬件配置,而只需要在現有的正在運行的集群中添加新的機器節點即可,而且新的RegionServer一旦建立完畢,集群會開始重新調整。
4.8、列存儲
HBase是面向列存儲的,每個列都單獨存儲,所以在HBase中列是連續存儲的,而行不是。
4.9、HBase Shell
HBase提供了交互式命令行工具可以進行創建表、添加數據、掃描數據、刪除數據等操作和其他一些管理命令。
五、HBase在集群中的定位
HBase一種是作為存儲的分布式文件系統,另一種是作為數據處理模型的MR框架。因為日常開發人員比較熟練的是結構化的數據進行處理,但是在HDFS直接存儲的文件往往不具有結構化,所以催生出了HBase在HDFS上的操作。如果需要查詢數據,只需要通過鍵值便可以成功訪問。
六、HBase內部存儲架構
HBase是由row key,column family,column和cell組成,row key確定唯一的一行,column family由若干column組成,column是表的字段,cell存儲了實際的值或數據。
七、HBase與Hadoop
7.1、HDFS
* 為分布式存儲提供文件系統
* 針對存儲大尺寸的文件進行優化,不需要對HDFS上的文件進行隨機讀寫
* 直接使用文件
* 數據模型不靈活
* 使用文件系統和處理框架
* 優化一次寫入,多次讀取的方式
7.2、HBase
* 提供表狀的面向列的數據存儲
* 針對表狀數據的隨機讀寫進行優化
* 使用key-value操作數據
* 提供靈活的數據模型
* 使用表狀存儲,支持MapReduce,依賴HDFS
* 優化了多次讀,以及多次寫
八、HBase的優缺點
8.1、優點
* 方便高效的壓縮數據
* 支持快速數據檢索
* 管理和配置簡單,支持橫向擴展,所以非常容易擴展
* 聚合查詢性能非常高
* 可高效地進行分區,提供自動分區機制把大的region切分成小的subregion
8.2、缺點
* 對JOIN以及多表合並數據的查詢性能不好
* 更新過程中有大量的寫入和刪除操作,需要頻繁合並和分裂,降低存儲效率
* 對關系模型支持不好,分區和索引模式設計比較困難。
九、HBase的環境角色
9.1、HMaster
9.1.1、功能描述
* 監控RegionServer
* 處理RegionServer故障轉移
* 處理元數據的變更
* 處理region的分配或移除
* 在空閑時間進行數據的負載均衡
* 通過Zookeeper發布自己的位置給客戶端
9.2、RegionServer
9.2.1、功能描述
* 負責存儲HBase的實際數據
* 處理分配給它的Region
* 刷新緩存到HDFS
* 維護HLog
* 執行壓縮
* 負責處理Region分片
9.2.2、內含組件
* Write-Ahead logs
HBase的修改記錄,當對HBase讀寫數據的時候,數據不是直接寫進磁盤,它會在內存中保留一段時間(時間以及數據量閾值可以設定)。如果機器突然原地爆炸,把數據保存在內存中會引起數據丟失,為了解決這個問題,數據會先寫在一個叫做Write-Ahead logfile的文件中,然后再寫入內存中。所以在系統出現故障的時候,數據可以通過這個日志文件重建。
* HFile
這是在磁盤上保存原始數據的實際的物理文件,是實際的存儲文件。
* Store
HFile存儲在Store中,一個Store對應HBase表中的一個列族
* MemStore
顧名思義,就是內存存儲,位於內存中,用來保存當前的數據操作,所以當數據保存在WAL中之后,RegsionServer會在內存中存儲鍵值對。
* Region
Hbase表的分片,HBase表會根據RowKey值被切分成不同的region存儲在RegionServer中,在一個RegionServer中可以有多個不同的region
9.3、Zookeeper
HMaster與HRegionServer 啟動時會向ZooKeeper注冊,存儲所有HRegion的尋址入口,實時監控HRegionserver的上線和下線信息。並實時通知給HMaster,存儲HBase的schema和table元數據,默認情況下,HBase 管理ZooKeeper 實例,Zookeeper的引入使得HMaster不再是單點故障。一般情況下會啟動兩個HMaster,非Active的HMaster會定期的和Active HMaster通信以獲取其最新狀態,從而保證它是實時更新的,因而如果啟動了多個HMaster反而增加了Active HMaster的負擔。
十、使用場景的探討
10.1、何時使用
* 如果數據有很多列,且包含很多空字段
* 數據包含了不定數量的列
* 需要維護數據的版本
* 需要很高的橫向擴展性
* 需要大量的壓縮數據
* 需要大量的I/O
一般而言數百萬行的數據和頻率不高的讀寫操作,是不需要HBase的,如果有幾十億列數據,同時在單位時間內有數以千、萬記的讀寫操作,可以考慮HBase。
10.2、何時不使用
* 數據總量不大時(比如就幾個G)
* 當需要JOIN以及關系型數據庫的一些特性時
* 如果關系型數據庫可以滿足需求
十一、HBase的安裝與部署
11.1、Zookeeper集群的正常部署並啟動
$ /opt/modules/cdh/zookeeper-3.4.5-cdh5.3.6/bin/zkServer.sh start
11.2、Hadoop集群的正常部署並啟動(我的為高可用HA)
$ /opt/modules/cdh/hadoop-2.5.0-cdh5.3.6/sbin/start-dfs.sh
$ /opt/modules/cdh/hadoop-2.5.0-cdh5.3.6/sbin/start-yarn.sh
11.3、上傳(hbase-0.98.6-cdh5.3.6.tar.gz)並解壓HBase
tar -zxvf hbase-0.98.6-cdh5.3.6.tar.gz -C /opt/module/
11.4進入配置文件目錄( cd /opt/module/hbase-0.98.6-cdh5.3.6/conf/)
11.5刪除cmd文件 ( rm -rf *.cmd )
11.6修改hbase-env.sh (vim hbase-env.sh )
11.7修改hbase-site.xml ( vim hbase-site.xml ),在<configuration>中添加
<configuration> <!--設置hbase節點位置 如果為高可用,則為高可用的名稱例:hdfs://mycluster/hbase 如果是單節點,應該寫成具體的哪台機器例:hdfs://hadoop201:80e --> <property> <name>hbase.rootdir</name> <value>hdfs://mycluster/hbase</value> </property> <!-- 是否運行在分布式上面 --> <property> <name>hbase.cluster.distributed</name> <value>true</value> </property> <!-- 指定master節點 ,兩種方式 1.只寫端口號,表示可能用於高可用 例:60000 2.配置絕對的路徑例:hadoop201:60000 --> <property> <name>hbase.master</name> <value>60000</value> </property> <!-- --> <property> <name>hbase.zookeeper.quorum</name> <value>hadoop201:2181,hadoop202:2181,hadoop203:2181</value> </property> <!-- 配置zookeeper的dataDir路徑(會自動創建) --> <property> <name>hbase.zookeeper.property.dataDir</name> <value>/opt/module/zookeeper-3.4.5-cdh5.3.6/data/zkData</value> </property> </configuration>
11.8regionservers ( vim regionservers )
hadoop201
hadoop202
hadoop203
11.9替換HBase根目錄下的lib目錄下的與自己使用的版本不同的jar包為自己使用的jar包,以解決兼容問題
cd /opt/module/hbase-0.98.6-cdh5.3.6/lib/
rm -rf hadoop-*
如果zookeeper與使用的不同也需要刪除替換,這里我的一樣就不替換了()
涉及的jar包大約有
hadoop-annotations-2.5.0.jar
hadoop-auth-2.5.0-cdh5.3.6.jar
hadoop-client-2.5.0-cdh5.3.6.jar
hadoop-common-2.5.0-cdh5.3.6.jar
hadoop-hdfs-2.5.0-cdh5.3.6.jar
hadoop-mapreduce-client-app-2.5.0-cdh5.3.6.jar
hadoop-mapreduce-client-common-2.5.0-cdh5.3.6.jar
hadoop-mapreduce-client-core-2.5.0-cdh5.3.6.jar
hadoop-mapreduce-client-hs-2.5.0-cdh5.3.6.jar
hadoop-mapreduce-client-hs-plugins-2.5.0-cdh5.3.6.jar
hadoop-mapreduce-client-jobclient-2.5.0-cdh5.3.6.jar
hadoop-mapreduce-client-jobclient-2.5.0-cdh5.3.6-tests.jar
hadoop-mapreduce-client-shuffle-2.5.0-cdh5.3.6.jar
hadoop-yarn-api-2.5.0-cdh5.3.6.jar
hadoop-yarn-applications-distributedshell-2.5.0-cdh5.3.6.jar
hadoop-yarn-applications-unmanaged-am-launcher-2.5.0-cdh5.3.6.jar
hadoop-yarn-client-2.5.0-cdh5.3.6.jar
hadoop-yarn-common-2.5.0-cdh5.3.6.jar
hadoop-yarn-server-applicationhistoryservice-2.5.0-cdh5.3.6.jar
hadoop-yarn-server-common-2.5.0-cdh5.3.6.jar
hadoop-yarn-server-nodemanager-2.5.0-cdh5.3.6.jar
hadoop-yarn-server-resourcemanager-2.5.0-cdh5.3.6.jar
hadoop-yarn-server-tests-2.5.0-cdh5.3.6.jar
hadoop-yarn-server-web-proxy-2.5.0-cdh5.3.6.jar
zookeeper-3.4.5-cdh5.3.6.jar
可以通過find命令快速進行定位,例如
cd /opt/module/hadoop-2.5.0-cdh5.3.6/
find -name hadoop-hdfs-2.5.0-cdh5.3.6.jar
然后將找到的jar包復制到hbase的lib目錄下
注:這里有我整理好的此版本的jar包放在(CDH_HadoopJar.tar.gz) (cp -a /opt/software/HadoopJar/* /opt/module/hbase-0.98.6-cdh5.3.6/lib/)
11.10將整理好的HBase安裝目錄scp到其他機器節點
cd /opt/module/
scp -r hbase-0.98.6-cdh5.3.6/ hadoop202:/opt/module/
scp -r hbase-0.98.6-cdh5.3.6/ hadoop203:/opt/module/
11.11將Hadoop配置文件軟連接到HBase的conf目錄下
* core-site.xml
$ ln -s /opt/module/hadoop-2.5.0-cdh5.3.6/etc/hadoop/core-site.xml /opt/module/hbase-0.98.6-cdh5.3.6/conf/core-site.xml
* hdfs-site.xml
$ ln -s /opt/module/hadoop-2.5.0-cdh5.3.6/etc/hadoop/hdfs-site.xml /opt/module/hbase-0.98.6-cdh5.3.6/conf/hdfs-site.xml
(尖叫提示:不要忘記其他幾台機器也要做此操作)
11.12啟動服務
$ bin/hbase-daemon.sh start master
$ bin/hbase-daemon.sh start regionserver
或者:
$ bin/start-hbase.sh
對應的停止命令:
$ bin/stop-hbase.sh
11.13查看頁面
啟動成功后,可以通過主機名:60010地址來訪問HBase的管理頁面
例如,http://hadoop201:60010
十二、HBase常用操作
12.1、進入HBase客戶端命令操作界面
$ bin/hbase shell
12.2、查看幫助命令
hbase(main):001:0> help
12.3、查看當前數據庫中有哪些表
hbase(main):002:0> list
12.4、創建一張表( create '表名','列祖名' )
hbase(main):003:0> create 'student','info'
12.5、向表中存儲一些數據( put '表名','ROWKEY','列族名:列名','值' )
hbase(main):004:0> put 'student','1001','info:name','Thomas'
hbase(main):005:0> put 'student','1001','info:sex','male'
hbase(main):006:0> put 'student','1001','info:age','18'
12.6、掃描查看存儲的數據
hbase(main):007:0> scan 'student'
(表名+RowKey+列族+列+(時間戳)+值)
或:查看某個rowkey范圍內的數據
hbase(main):014:0> scan 'student',{STARTROW => '1001',STOPROW => '1007'}
12.7查看表結構
hbase(main):009:0> describe 'student'
12.8更新指定字段的數據
hbase(main):009:0> put 'student','1001','info:name','Nick'
hbase(main):010:0> put 'student','1001','info:age','100'
12.9查看指定行的數據
hbase(main):012:0> get 'student','1001'
或:查看指定行指定列或列族的數據
hbase(main):013:0> get 'student','1001','info:name'
12.10刪除數據
12.10.1刪除某一個rowKey全部的數據
hbase(main):015:0> deleteall 'student','1001'
12.10.2刪除掉某個rowKey中某一列的數據
hbase(main):016:0> delete 'student','1001','info:sex'
12.11清空表數據
hbase(main):017:0> truncate 'student'
12.12刪除表
首先需要先讓該表為disable狀態,使用命令:
hbase(main):018:0> disable 'student'
然后才能drop這個表,使用命令:
hbase(main):019:0> drop 'student'
(尖叫提示:如果直接drop表,會報錯:Drop the named table. Table must first be disabled)
12.13統計一張表有多少行數據
hbase(main):020:0> count 'student'
十三、HMaster的高可用
13.1、確保HBase集群已正常停止
$ bin/stop-hbase.sh
13.2、在conf目錄下創建backup-masters文件
$ touch conf/backup-masters
13.3、在backup-masters文件中配置高可用HMaster節點
$ echo hadoop202 > conf/backup-masters
13.4、將整個conf目錄scp到其他節點
$ scp -r conf/ hadoop202:/opt/module/hbase-0.98.6-cdh5.3.6/
$ scp -r conf/ hadoop203:/opt/module/hbase-0.98.6-cdh5.3.6/
13.5、打開頁面測試
最后,可以嘗試關閉第一台機器的HMaster:
$ bin/hbase-daemon.sh stop master
然后查看第二台的HMaster是否會直接啟用