HBase學習提綱:助你一臂之力

HBase

簡介HBase是一個高可靠性、高性能、面向列、可伸縮的分佈式存儲系統。可在廉價PC Server上搭建起大規模結構化存儲集羣。

HBase利用Hadoop HDFS作爲其文件存儲系統,利用Hadoop MapReduce來處理HBase中的海量數據,利用Zookeeper作爲協調工具。 HBase與傳統數據庫(RDBMS)的最大區別面向列操作數據庫,如果是索引訪問用HBase+Hadoop

當前市場上有很多類似的序列化系統,如Avro、Google 的 Protocol Buffers、Facebook 的 Thrift。

Apache Thrift 是 Facebook 實現的一種高效的、支持多種編程語言的遠程服務調用的框架。

HBase是Hadoop生態系統的一個組成部分。如圖:

在這裏插入圖片描述

HBase與HDFS對比

兩者都具有良好的容錯性和擴展性,都可以擴展到成百上千個節點; HDFS適合批處理場景但不支持數據隨機查找,不適合增量數據處理,不支持數據更新。

HBase表的特點

  1. :一個表可以有數十億行,上百萬列;
  2. 無模式:每行都有一個可排序的主鍵和任意多的列,列可以根據需要動態的增加,同一張表中不同的行可以有截然不同的列;
  3. 面向列:面向列(族)的存儲和權限控制,列(族)獨立檢索;
  4. 稀疏:對於空(null)的列,並不佔用存儲空間,表可以設計的非常稀疏;
  5. 數據多版本:每個單元中的數據可以有多個版本,默認情況下版本號自動分配,是單元格插入時的時間戳;
  6. 數據類型單一:HBase中的數據都是字符串,沒有類型

爲什麼要使用hbase?

  1. 傳統關係型數據庫系統已無法適應大型分佈式數據存儲的需要
  2. 改良的關係數據庫(副本、分區等)難於安裝與維護
  3. 關係模型對數據的操作使數據的存貯變得複雜
  4. HBase從設計理念上就爲可擴展做好了充分準備。
  5. 空間的擴展只需要加入存儲結點,使用表的概念,但不同於關係數據庫,實質上是一張極大的、非常稀疏的,存儲在分佈式文件系統上的表

HBase數據模型

表:Tables 由 rows 和 columns 組成。數據存放在帶標籤的表中。HBase中的每一張表,就是所謂的BigTable。稀疏表。

單元格:Table cells單元格有版本(Timestamp是HBase插入單元格時候的時間戳)。

時間戳( Timestamp ):時間戳,每次數據操作對應的時間戳,可以看作是數據的version number。是一個 64 位整數

列:列組成“列族”

列族:所有的列族成員有相同的前綴。物理上,所有的列族成員都一起存放在文件系統中。HBase實際上就是一個面向列族的存儲器。Table在水平方向有一個或者多個列簇組成,一個列簇中可以有任意多個列組成

RowKey:二進制值byte[],按字典順序排序。行鍵,Table的主鍵,Table中的記錄按照Row Key排序

ColumnKey:二進制值byte[],按字典順序排序。是表中每條記錄的“主鍵”,方便快速查找

value:一個未解釋的字節數組byte[]。

注意:表中的不同行可以擁有不同數量的成員。即支持“動態模式”模型

HBase數據模型中 行 的特點:

  1. 字符串、整數、二進制串甚至串行化的結構都可以作爲行鍵
  2. 表按照行鍵的“逐字節排序”順序對行進行有序化處理
  3. 表內數據非常‘稀疏’,不同的行的列的數完全目可以大不相同
  4. 可以只對一行上“鎖”
  5. 對行的寫操作是始終是“原子”的

HBase數據模型中 列 的特點

  1. 列必須用‘族’(family)來定義
  2. 任意一列有如下形式:“族:標籤”。其中,族和標籤都可爲任意形式的串
  3. 物理上將同“族”數據存儲在一起
  4. 數據可通過時間戳區分版本

HBase架構體系

  • Client:包含訪問HBase的接口,client維護着一些cache 來加快對HBase的訪問,比如region的位置信息

  • Zookeeper:

    1. 保證任何時候,集羣中只有一個running master
    2. 存貯所有Region的尋址入口
    3. 實時監控Region Server 的狀態,將Region server 的上線和下線信息,實時通知給Master
    4. 存儲HBase的schema,包括有哪些table,每個table有哪些column family
  • Master:可以啓動多個HMaster,通過Zookeeper的Master Election機制保證總有一個Master運行

    1. 爲Region server 分配region
    2. 負責region server 的負載均衡
    3. 發現失效的region server 並重新分配其上的region
  • Region Server:

    1. 維護Master 分配給它的region,處理對這些 region 的 IO 請求
    2. 負責切分在運行過程中變得過大的region

注意:

HBase中有兩張特殊的Table:-ROOT-.META.

  • .META.:記錄了用戶表的Region信息,.META.可以有多個regoin

  • -ROOT-:記錄了.META.表的Region信息,-ROOT-只有一個region

Zookeeper中記錄了-ROOT-表的location

Client訪問用戶數據之前需要首先訪問zookeeper,然後訪問-ROOT-表,接着訪問.META.表,最後才能找到用戶數

據的位置去訪問

HBase的shell操作

啓動HBase:

start-hbase.sh

啓動HBase shell:

hbase shell

退出HBase shell:

quit

幫助命令:

help

查看集羣狀態

status

創建表:create '表名稱', '列族名稱1','列族名稱2','列族名 稱N'

create 'users','user_id','address','info'

添加記錄:put '表名稱', '行名稱', '列名稱:', '值'

put 'users','xiaoming','info:age','24';

查看記錄:get '表名稱', '行名稱'

get 'users','xiaoming'			   #取得一個id的所有數據 
get 'users','xiaoming','info'	   #獲取一個id,一個列族的所有數據 
get 'users','xiaoming','info:age'  #獲取一個id,一個列族中一個列的所有數據

查看錶中的記錄總數:count '表名稱'

count 'users'

刪除記錄:delete '表名' ,'行名稱' , '列名稱'

delete 'users','xiaoming','info:age' 

刪除整行:deleteall '表名' , '行名稱'

deleteall 'users','xiaoming' 

刪除一張表:先要屏蔽該表,才能對該表進行刪除。1、disable '表名稱' 。2、drop '表名稱'

disable 'users'
drop 'users' 

注意:修改表結構或者刪除表,需要先disable

查看所有記錄:scan "表名稱"

scan 'test' #查看test表中的所有數據

查看某個表某個列中所有數據:scan "表名稱" ,'列族名稱:列名稱'

scan 'test','info:age'

清空表:truncate '表名'

truncate 'users'

獲取單元格數據的版本數據:

get 'users','xiaoming',{COLUMN=>'info:age',VERSIONS=>1} 

列出全部表:

list

得到表的描述:describe '表名'

describe 'users'

查看錶的狀態 :exists '表名'

exists 'users' 
is_enabled 'users' 
is_disabled 'users

使表有效或無:enable/disable '表名'

enable 'users'
disable 'users'

HBase的組件:

  • HMaster
    1. 管理用戶對Table的增、刪、改、查操作

    2. 管理RegionServer的負載均衡、調整Region的分佈

    3. 在Region Split後,將新Region分佈到不同的RegionServer。

    4. 在RegionServer宕機後,該RegionServer上所管理的Region 由HMaster進行重新分配。

  • HRegionServer
    1. RegionServer是HBase集羣運行在每個工作節點上的服務組件
    2. RegionServer維護Master分配給它的region,處理對這些region的IO請求
    3. Region server負責切分在運行過程中變得過大的region
  • Region
    1. Region可理解爲關係型數據庫中的“分區”
    2. 處理RegionServer分配給它的任務

HBase的組件單元:

  • 表空間:在關係數據庫系統中,命名空間 namespace 指的是一個表的邏輯分組,同一組中的表有類似的用途。有兩個默認表空間:

    • hbase:系統命名空間,用於包含hbase的內部表
    • default:所有未指定命名空間的表都自動進入該命名空間
  • 表:HBase以表的形式存儲數據,表在 hdfs 上以文件夾形式存(HBase表組成模型在上面)

在這裏插入圖片描述

HBase vs Oracle

  1. 索引不同造成行爲的差異
  2. HBase適合大量插入同時又有讀的情況
  3. HBase的瓶頸是硬盤傳輸速度,Oracle的瓶頸是硬盤尋道時間
  4. HBase很適合尋找按照時間排序top n的場景

HBase寫入數據流程

  1. Client通過Zookeeper調度獲取表的元數據信息;

  2. Cilent通過rpc協議與RegionServer交互,通過-ROOT-表與.META.表找到對應的對應的Region;

  3. 將數據寫入HLog日誌中,如出現意外可以同通過HLog恢復信息;

  4. 將數據寫入Region的MemStore中,當MemStore達到閾值開始溢寫,將其中的數據Flush成一個StoreFile;

  5. MemStore不斷生成新的StoreFile,當StoreFile的數量到達閾值後會出發Compact合併操作,將多個StoreFile合併成一個StoreFile;

  6. StoreFile文件會不斷增大,當達到閾值後會出發Split操作,把當前的Region且分爲兩個新的Region。父Region會下線,兩個子Region會被HMaster分配到相應的RegionServer。

HBase查詢數據流程

  1. Client訪問Zookeeper,從ZK獲取-ROOT-表的位置信息,通過訪問-ROOT-表獲取.META.表的位置,然後確定數據所在的HRegion位置;

  2. Client訪問HRegion所在的HRegionServer,通過HRegionServer獲取需要查找的數據;

  3. Client到HRegion的中去查找數據,首先到MemStore中查找,查到直接返回;查不到就去ClockCache中查找,查到直接返回;再查不到就去StoreFile中讀數據,把讀到的數據存入BlockCache中再返回Client。

表設計和調優

內存優化

HBase 操作過程中需要大量的內存開銷,畢竟 Table 是可以緩存在內存中的,一般會分配整個可用內存的 70%給 HBase 的 Java 堆。但是不建議分配非常大的堆內存,因爲 GC 過 程持續太久會導致 RegionServer 處於長期不可用狀態,一般 16~48G 內存就可以了,如果因 爲框架佔用內存過高導致系統內存不足,框架一樣會被系統服務拖死。

rowkey優化的主要方式

一條數據的唯一標識就是 RowKey,那麼這條數據存儲於哪個分區,取決於 RowKey 處 於哪個一個預分區的區間內,設計 RowKey 的主要目的 ,就是讓數據均勻的分佈於所有的 region 中,在一定程度上防止數據傾斜。

  1. 生成隨機數、hash、散列值
  2. 字符串反轉
  3. 字符串拼接

基礎優化

1、允許在 HDFS 的文件中追加內容

  • 文件:hdfs-site.xml、hbase-site.xml

  • 屬性:dfs.support.append

  • 解釋:開啓 HDFS 追加同步,可以優秀的配合 HBase 的數據同步和持久化。默認值爲 true。

2、優化 DataNode 允許的最大文件打開數

  • 文件:hdfs-site.xml

  • 屬性:dfs.datanode.max.transfer.threads

  • 解釋:HBase 一般都會同一時間操作大量的文件,根據集羣的數量和規模以及數據動作, 設置爲 4096 或者更高。默認值:4096

3、優化延遲高的數據操作的等待時間

  • 文件:hdfs-site.xml

  • 屬性:dfs.image.transfer.timeout

  • 解釋:如果對於某一次數據操作來講,延遲非常高,socket 需要等待更長的時間,建議把 該值設置爲更大的值(默認 60000 毫秒),以確保 socket 不會被 timeout 掉。

4、優化數據的寫入效率

  • 文件:mapred-site.xml

  • 屬性:mapreduce.map.output.compress 、mapreduce.map.output.compress.codec

  • 解釋:開啓這兩個數據可以大大提高文件的寫入效率,減少寫入時間。第一個屬性值修改爲
    true,第二個屬性值修改爲:org.apache.hadoop.io.compress.GzipCodec 或者其 他壓縮方式。

5、設置 RPC 監聽數量

  • 文件:hbase-site.xml

  • 屬性:Hbase.regionserver.handler.count

  • 解釋:默認值爲 30,用於指定 RPC 監聽的數量,可以根據客戶端的請求數進行調整,讀寫 請求較多時,增加此值。

6、優化 HStore 文件大小

  • 文件:hbase-site.xml

  • 屬性:hbase.hregion.max.filesize

  • 解釋:默認值 10737418240(10GB),如果需要運行 HBase 的 MR 任務,可以減小此值, 因爲一個 region 對應一個 map 任務,如果單個 region 過大,會導致 map 任務執行時間 過長。該值的意思就是,如果 HFile 的大小達到這個數值,則這個 region 會被切分爲兩個Hfile。

7、優化 HBase 客戶端緩存

  • 文件:hbase-site.xml

  • 屬性:hbase.client.write.buffer

  • 解釋:用於指定 Hbase 客戶端緩存,增大該值可以減少 RPC 調用次數,但是會消耗更多內 存,反之則反之。一般我們需要設定一定的緩存大小,以達到減少 RPC 次數的目的。

8、指定 scan.next 掃描 HBase 所獲取的行數

  • 文件:hbase-site.xml

  • 屬性:hbase.client.scanner.caching

  • 解釋:用於指定 scan.next 方法獲取的默認行數,值越大,消耗內存越大。

9、flush、compact、split 機制

當 MemStore 達到閾值,將 Memstore 中的數據 Flush 進 Storefile;compact 機制則是把 flush 出來的小文件合併成大的 Storefile 文件。split 則是當 Region 達到閾值,會把過大的 Region 一分爲二。

有關安裝:

安裝HBase:

  1. 添加用戶:
#adduser hadoop  //useradd   #開頭表示root操作
#cat /etc/passwd
#ls /home/
#su hadoop
  1. 修改opt權限:chmod -R 777 /opt
  2. 上傳WinSCP:jdk、hadoop、hbase
  3. 解壓縮:tar zxvf /tmp/jdk-8u241-linux-x64.tar.gz(tar zxvf filename可以解壓縮.tar.gz文件)
  4. 創建env.sh:
#!/bin/bash
export JAVA_HOME=/opt/jdk
export PATH=.:$JAVA_HOME/bin:$PATH
  1. 導入:#root身份,文件末尾,加入 source /opt/env.sh 或者 . /opt/env.sh
  2. 關閉防火牆
    • 查詢防火牆狀態:systemctl status firewalld
    • 臨時關閉:systemctl stop firewalld
    • 永久關閉:systemctl disable firewalld
  3. 關閉SELinux
    • 查詢:sestatus -v 或者 getenforce
    • 臨時關閉:setenforce 0。0設置 SELinux 成爲 permissive 模式,1設置爲 enforcing 模式
    • 永久關閉:vim /etc/selinux/config, 將SELINUX=enforcing改爲SELINUX=disabled
  4. SSH免密碼登錄:
    • 查看狀態:systemctl status sshd
    • 生成密鑰:ssh-keygen -t rsa,生成文件在:~/ .ssh/
    • 將密鑰copy到授權文件:cp id_rsa.pub authorized_keys。授權文件:authorized_ keys
    • 連接測試:ssh localhostssh遠程登錄服務使用的端口號是22
  5. 修改hostname和hosts
  6. 往/opt/env.sh中添加hadoop和HBase的環境變量
  7. 修改hadoop的配置文件
  8. 啓動hadoop:start-dfs.sh start-yarn.sh。登錄網絡界面檢查:http://192.168.100.11:50070
  9. 修改Hbase配置文件:hbase-env.sh、hbase-site.xml、regionservers
  10. 啓動hbase:start-hbase.sh hbase shell。檢查hbase:http://192.168.100.11:16010
  11. 停止HBase:stop-hbase.sh

使用python操作(CentOS7):

  1. 連接外網
  2. 確認Python3安裝:python3 顯示 Python 3.6.8 (default, Aug 7 2019, 17:28:10)
  3. 安裝 Thriftpip3 install thrift
  4. 安裝Python-devel開發包:yum install python3-develCentos 7中安裝軟件包提示"python.h: 沒有那個文件或目錄", 可以安裝python3-devel解決此問題
  5. 安裝Happybasepip3 install happybase
  6. 回到普通用戶:pip3 list
  7. 啓動集羣 hadoop+hbase:
  8. 啓動 thrift: hbase-daemon.sh start thrift
  9. 驗證:ps aux|grep thriftjps
  10. 運行示例,查詢API:https://happybase.readthedocs.io/en/latest/

使用java操作:

  1. 下載安裝Eclipse,Eclipse IDE for Java Developers
    https://www.eclipse.org/downloads/packages/

  2. 下載安裝jdk(Windows)
    https://www.oracle.com/java/technologies/javase-jdk8-downloads.html

  3. 下載安裝Maven
    https://maven.apache.org/download.cgi

  4. 設置jdk、maven環境變量:JAVA_HOME、CLASSPATH、PATH、MAVEN_HOME

  5. 驗證jdk、maven安裝:java -version、javac -version、mvn -version

  6. 修改maven配置:apache-maven-3.6.3\conf\settings.xml

<localRepository>本地路徑</localRepository> <!-- 配置maven路徑 -->
  1. 下載Maven依賴庫:mvn help:system 成功提示:BUILD SUCESS
  2. 修改windows解析:hosts 文件
  3. 查詢修改windows防火牆
  4. 添加HBase jar包
  5. 消除WARN,添加log4j.properties文件
  6. 消除hadoop error,windows環境變量添加HADOOP_HOME,添加winutils.exe文件

補充:

HBase高可用配置,涉及的配置文件名稱backup-masters

H、PATH、MAVEN_HOME5. 驗證jdk、maven安裝:java -version、javac -version、mvn -version 6. **修改maven配置:**apache-maven-3.6.3\conf\settings.xml`

<localRepository>本地路徑</localRepository> <!-- 配置maven路徑 -->
  1. 下載Maven依賴庫:mvn help:system 成功提示:BUILD SUCESS
  2. 修改windows解析:hosts 文件
  3. 查詢修改windows防火牆
  4. 添加HBase jar包
  5. 消除WARN,添加log4j.properties文件
  6. 消除hadoop error,windows環境變量添加HADOOP_HOME,添加winutils.exe文件

補充:

HBase高可用配置,涉及的配置文件名稱backup-masters

HBase分佈式安裝時需要將配置文件中的HBase.cluster.distributed值修改爲true

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章