HBase簡介
- Hbase(Hadoop Database),是一個高可靠性、高性能、面向列、可伸縮、實時讀寫的分佈式數據庫;
- 利用Hadoop HDFS作爲其文件存儲系統,利用Hadoop MapReduce來處理HBase中的海量數據,利用Zookeeper作爲其分佈式協同服務;
- 主要用來存儲非結構化和半結構化的鬆散數據(列存 NoSQL 數據庫)。
HBase 數據模型
-
ROW KEY
- 決定一行數據;
- 按照字典順序排序的;
- Row key只能存儲64k的字節數據。
-
Column Family列族 & qualifier列
- HBase表中的每個列都歸屬於某個列族,列族必須作爲表模式(schema)定義的一部分預先給出。如 create ‘test’, ‘course’;
- 列名以列族作爲前綴,每個“列族”都可以有多個列成員(column);如course:math, course:english, 新的列族成員(列)可以隨後按需、動態加入;
- 權限控制、存儲以及調優都是在列族層面進行的;
- HBase把同一列族裏面的數據存儲在同一目錄下,由幾個文件保存。
-
Timestamp時間戳
- 在HBase每個cell存儲單元對同一份數據有多個版本,根據唯一的時間戳來區分每個版本之間的差異,不同版本的數據按照時間倒序排序,最新的數據版本排在最前面。
- 時間戳的類型是64位整型。
- 時間戳可以由HBase(在數據寫入時自動)賦值,此時時間戳是精確到毫秒的當前系統時間。
- 時間戳也可以由客戶顯式賦值,如果應用程序要避免數據版本衝突,就必須自己生成具有唯一性的時間戳。
-
Cell單元格
- 由行和列的座標交叉決定;
- 單元格是有版本的;
- 單元格的內容是未解析的字節數組;
- 由{row key, column( = +), version} 唯一確定的單元。
- cell中的數據是沒有類型的,全部是字節碼形式存貯。
-
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。
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,處理對這些region的IO請求;
- 負責切分在運行過程中變得過大的region。
5.Region
- HBase自動把表水平劃分成多個區域(region),每個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),在合併過程中會進行版本合併和刪除工作(majar),形成更大的storefile;
- 當一個region所有storefile的大小和數量超過一定閾值後,會把當前的region分割爲兩個,並由hmaster分配到相應的regionserver服務器,實現負載均衡;
- 客戶端檢索數據,先在memstore找,找不到再找storefile。
- HRegion是HBase中分佈式存儲和負載均衡的最小單元。最小單元就表示不同的HRegion可以分佈在不同的 HRegion server上。
- HRegion由一個或者多個Store組成,每個store保存一個columns family。
- 每個Strore又由一個memStore和0至多個StoreFile組成。如圖:StoreFile以HFile格式保存在HDFS上。
服務器時間同步(ntp)
- 思路:
- 在一臺Linux服務器上安裝NTP提供時間同步服務;
- 其他Linux應用服務器亦需要安裝NTP作爲客戶機,同步NTP服務器提供的時間。
- 實施步驟:
- 在所有linux服務器上安裝ntp
確認是否已安裝ntp:
rpm –qa | grep ntp
若只有ntpdate而未見ntp,則需刪除原有ntpdate。如:
yum –y remove ntpdate-4.2.6p5-22.el7.x86_64
安裝ntp:
yum –y install ntp
所有節點設置爲中國時區
timedatectl set-timezone Asia/Shanghai
在server節點上設置現在的準確時間
timedatectl set-time HH:MM:SS
- 配置ntp服務(192.168.33.101)
vi /etc/ntp.conf
# 集羣所在網段的網關(Gateway),子網掩碼(Genmask)
restrict 192.168.33.2 mask 255.255.255.0 nomodify notrap
# 在server部分添加一下部分(注意不是127.0.0.1),並註釋掉server 0 ~ n
server 127.127.1.0
Fudge 127.127.1.0 stratum 10
- 配置ntp客戶機
vi /etc/ntp.conf
# 在server部分添加如下語句,將server指向主節點。並註釋掉server 0 ~ n
server 192.168.33.101
Fudge 192.168.33.101 stratum 10
修改/etc/sysconfig/ntpdate,讓ntpdate每次同步時間之後把時間寫入hwclock,相當於命令hwclock -w:
把最後一行SYNC_HWCLOCK=no修改爲:SYNC_HWCLOCK=yes
- 啓動各節點,開機自啓
service ntpd start
或
systemctl start ntpd
chkconfig ntpd on
或
systemctl enable ntpd
所有節點啓動時間同步
timedatectl set-ntp yes
與本地ntpd Server同步一下
ntpdate -u node01
過幾分鐘客戶機就會自動從服務機同步時間了。
HBase部署(完全分佈式)
前提:1、Hadoop集羣正常運行;2、ZooKeeper集羣正常運行。
- 配置regionservers ,主機名
cd /opt/hbase-2.1.2/conf/
vi regionservers
node01
node02
node03
- 配置backup-masters
vi backup-masters
# 添加備用hbase-master
node03
export JAVA_HOME=/opt/jdk1.8
export HBASE_MANAGES_ZK=false
- 配置hbase-site.xml
<!-- 指定hbase在hdfs上存儲的路徑 -->
<property>
<name>hbase.rootdir</name>
<value>hdfs://mycluster/hbase</value>
</property>
<!-- 指定hbase是分佈式的 -->
<property>
<name>hbase.cluster.distributed</name>
<value>true</value>
</property>
<!-- 指定zk的地址,多個用“,”分割 -->
<property>
<name>hbase.zookeeper.quorum</name>
<value>node01:2181,node01:2181,node01:2181</value>
</property>
<!-- ZooKeeper的zoo.conf中的配置(dataDir所設定的位置),快照的存儲位置 -->
<property>
<name>hbase.zookeeper.property.dataDir</name>
<value>/var/zookeeper</value>
</property>
<!-- ZooKeeper 會話超時。Hbase 把這個值傳遞給 zk 集羣,向它推薦一個會話的最大超時時間 -->
<property>
<name>zookeeper.session.timeout</name>
<value>120000</value>
</property>
<!-- 當 regionserver 遇到 ZooKeeper session expired , regionserver 將選擇 restart 而不是 abort -->
<property>
<name>hbase.regionserver.restart.on.zk.expire</name>
<value>true</value>
</property>
-
複製hdfs-site.xml到conf目錄下
-
在全部節點的環境變量配置文件中加入HBASE_HOME
-
啓動Hbase: start-hbase.sh
常見問題
- 啓動時報錯如下錯誤:
ERROR [main] regionserver.HRegionServer: Failed construction RegionServer
java.lang.NoClassDefFoundError: org/apache/htrace/SamplerBuilder
解決方案:cp $HBASE_HOME/lib/client-facing-thirdparty/htrace-core-3.1.0-incubating.jar $HBASE_HOME/lib/
Please check the config value of 'hbase.procedure.store.wal.use.hsync' to set the desired level of robustness and ensure the config value of 'hbase.wal.dir' points to a FileSystem mount that can provide it
解決方案:在hbase-site.xml文件中加入:
<property>
<name>hbase.unsafe.stream.capability.enforce</name>
<value>false</value>
</property>