HBase學習筆記

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 架構

  1. Client
    包含訪問HBase的接口並維護cache來加快對HBase的訪問。

  2. Zookeeper

    • 保證任何時候,集羣中只有一個master;
    • 存貯所有Region的尋址入口;
    • 實時監控Region server的上線和下線信息,並實時通知Master;
    • 存儲HBase的schema和table元數據。
  3. Master

    • 爲Region server分配region;
    • 負責Region server的負載均衡;
    • 發現失效的Region server並重新分配其上的region;
    • 管理用戶對table的增刪改操作。
  4. RegionServer

    • 維護region,處理對這些region的IO請求;
    • 負責切分在運行過程中變得過大的region。

5.Region

  • HBase自動把表水平劃分成多個區域(region),每個region會保存一個表裏面某段連續的數據;
  • 每個表一開始只有一個region,隨着數據不斷插入表,region不斷增大,當增大到一個閥值的時候,region就會等分會兩個新的region(裂變);
  • 當table中的行不斷增多,就會有越來越多的region。這樣一張完整的表被保存在多個Regionserver 上。
  1. 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)

  1. 思路:
  • 在一臺Linux服務器上安裝NTP提供時間同步服務;
  • 其他Linux應用服務器亦需要安裝NTP作爲客戶機,同步NTP服務器提供的時間。
  1. 實施步驟:
  • 在所有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

常見問題

  1. 啓動時報錯如下錯誤:
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>
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章