Hadoop學習(10)——Hbase介紹

一、Hbase介紹

1.1、Hbase簡介

Hadoop Database(Hbase): 是一個高可靠性、高性能、面向列、可伸縮、實時讀寫的分佈式數據庫;

利用Hadoop HDFS作爲其文件存儲系統,利用Hadoop MapReduce來處理HBase中的海量數據,利用Zookeeper作爲其分佈式協同服務;

主要用來存儲非結構化和半結構化的鬆散數據(列存 NoSQL 數據庫)

1.2、HBase 數據模型

HBase是由row key,column family,column和cell(單元格)組成,row key確定唯一的一行,column family由若干column組成,column是表的字段,cell存儲了實際的值或數據,如何訪問單元格呢?必須通過列族和列。 

(1)ROW  KEY

  • 決定一行數據
  • 按照字典順序排序的。
  • Row key只能存儲64k的字節數據

(2)Column Family列族 & qualifier列

HBase表中的每個列都歸屬於某個列族,列族必須作爲表模式(schema)定義的一部分預先給出。如 create ‘test’, ‘course’;

列名以列族作爲前綴,每個“列族”都可以有多個列成員(column);如course:math, course:english, 新的列族成員(列)可以隨後按需、動態加入;

權限控制、存儲以及調優都是在列族層面進行的;

HBase把同一列族裏面的數據存儲在同一目錄下,由幾個文件保存

(3)Timestamp時間戳

在HBase每個cell存儲單元對同一份數據有多個版本,根據唯一的時間戳來區分每個版本之間的差異,不同版本的數據按照時間倒序排序,最新的數據版本排在最前面。

時間戳的類型是 64位整型。

時間戳可以由HBase(在數據寫入時自動)賦值,此時時間戳是精確到毫秒的當前系統時間。

時間戳也可以由客戶顯式賦值,如果應用程序要避免數據版本衝突,就必須自己生成具有唯一性的時間戳。

(4)Cell單元格

由行和列的座標交叉決定;

單元格是有版本的;

單元格的內容是未解析的字節數組;
由{row key, column( =<family> +<qualifier>), version} 唯一確定的單元。
cell中的數據是沒有類型的,全部是字節數組形式存貯。

(5)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

 

1.3、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 server維護region,處理對這些region的IO請求
Region server負責切分在運行過程中變得過大的region

(5)Region

HBase自動把表水平劃分成多個區域(region),每個region會保存一個表裏面某段連續的數據

每個表一開始只有一個region,隨着數據不斷插入表,region不斷增大,當增大到一個閥值的時候,region就會等分會兩個新的region(裂變)

當table中的行不斷增多,就會有越來越多的region。這樣一張完整的表被保存在多個Regionserver 上。

HRegion是HBase中分佈式存儲和負載均衡的最小單元。最小單元就表示不同的HRegion可以分佈在不同的 HRegion server上

HRegion由一個或者多個Store組成,每個store保存一個columns family

每個Strore又由一個memStore和0至多個StoreFile組成。如圖:StoreFile以HFile格式保存在HDFS上:

 

(6)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

1.4、Hbase原理

HBase是依賴hadoop的,依賴hdfs的,HBase存儲的所有數據其實是在DataNOde上面,數據是存在RegoinServer上面的,RegionServer裏面的數據具體是存在DataNode上面的,HBase視覺上能看到的是RegoinServer和Hmaster兩個節點,類似於NameNode和DataNode節點。HBase在操作表的時候有原數據,原數據存到zookeeper上

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,每個RegionServer維護一個HLog,和多個HFiles以及其對應的MemStore。RegionServer運行於DataNode上,數量可以與DatNode數量一致

1.5、Hbase使用場景

不支持事物的回滾和撤銷;HBase直接在線上使用的話也是比較少的,一般還是關係型數據庫處理實時的在線數據,處理完之後,定期再把數據弄到HBase上面,這個定期的頻率很低,所以一般稱之爲,HBase接入的就是在線的業務

  • 如果數據有很多列,且包含很多空字段:如果數據有很多null字段,HBase壓縮的時候,直接就不佔空間了,而且整個列的存儲方式,是可以面向不對稱的、非結構化的數據的;
  • 數據包含了不定數量的列
  • 需要維護數據的版本
  • 需要很高的橫向擴展性
  • 需要大量的壓縮數據
  • 需要大量的I/O

何時不使用:

  • 數據總量不大時(比如就幾個G)
  • 當需要JOIN以及關係型數據庫的一些特性時
  • 如果關係型數據庫可以滿足需求

1.6Hbase特點

(1)結構:

  • 數據庫以region的形式存在
  • 支持HDFS文件系統,當然也支持其他的上面關係型數據庫的文件系統,包括其他的分佈式系統(比如亞馬遜的s3)
  • 使用WAL(Write-Ahead Logs)存儲日誌
  • 參考系統是Zookeeper
  • 使用行鍵(row key)
  • 支持分片
  • 使用行、列、列族和單元格

(2)功能

  • 支持向外擴展(即橫向擴展,不需要升級原來集羣裏面的配置,只需要不停的往上加就可以了,這樣的好處就是,如果不停的向外擴展的話,總有一個極限,硬件總會達到一個瓶頸,這個時候可以選擇數量變多,這樣的擴展就很好,這也是hbase火的一個原因)
  • 使用API和MapReduce來訪問HBase表數據(上面看到put xxxx這樣的語句,其實底層還是api,可以通過java代碼去操作裏面的數據,底層集成了MapReduce,比如HBase中間過程會產生一些小文件,這些小文件會嚴重影響集羣性能,它會定期的在閒時的時候自動的通過MapReduce把小文件合併成大文件。)
  • 面向列,即每一列都是在某一頁上的一個連續的單元。
  • rowkey是唯一的,但是不是單純的數字遞增的,比如還可以是abc helloworld,rowkey包含了若干個列族,若干個列,在訪問某個列的時候,就會把整個rowkey存儲單元全部讀下來,暴扣裏面的列族,這就是hbase的存儲單元
  • 數據總量不依賴具體某臺機器,而取決於機器數量(依賴於集羣的數量)

  • HBase不支持ACID(Atomicity、Consistency、Isolation、Durability)

  • 適合結構化數據和非結構化數據:比如hive中的數據都是tab鍵隔開的就是結構化數據,rowkey中第一個列族裏面有六列,第二個裏面只有兩列,有點類似java中的map Map<String,Map<String,String>> ,是無規律可循的,就像map裏面還可以繼續嵌套map,沒有任何規律,對於數據的存儲就是給一個key,給一個value,但是總不能確定value一定是string

  • 一般都是分佈式的

  • HBase不支持事務

  • 不支持Join

  • 如果需要查詢數據,只需要通過鍵值便可以成功訪問

1.7、爲什麼HBase訪問很快?

客戶端去訪問某一條數據的時候,先去內存裏面找, MemStore是內存裏面的結構化分區,MemStore和內存數據緩衝池,都是內存,只不過這兩個東西在內存中的結構區分開了,客戶端在訪問數據的時候,會先去MemStore裏面查看是否有數據,如果有的話直接就返回了,這種情況非常快,不會涉及到磁盤io,第二種情況是客戶端去MemStore裏面找數據沒找到,會去內存緩衝池裏面找,這個數據是怎麼來的呢?是通過LRU算法,維護的都是最近操作的數據,因爲他也是在內存中所以很快,如果沒有的話,去region裏面讀,先讀到內存緩衝池中,讀完之後直接返回給客戶端。如果新讀進來內存緩衝池裏面沒有內存的話,就刪除掉之前權重比較小的數據。
 

1.8、爲什麼hive和HBase很多時候要結合起來訪問?

HBase可以和hive進行對接,hive和HBase之間可以通過sqoop進行數據的導入導出。HBase適合結構化和非結構化存儲,而hive適合分析,HBase是不適合分析的,所以同HBase進行大量數據的存儲,用hive進行大量數據的分析,小公司HBase用的不多,關係型數據庫就能搞定

1.9、HBase的優缺點

優點:

  • 方便高效的壓縮數據;
  • 支持快速數據檢索:LRU算法、自動分區、LSM算法;
  • 管理和配置簡單,支持橫向擴展,所以非常容易擴展;
  • 聚合查詢性能非常高:因爲每個列都是一個單獨的存儲單元,對同一個列進行聚合的時候非常容易,比如說count就是一個聚合操作,如果把count應用在HBase的某一列上面,就特別的容易;
  • 可高效地進行分區,提供自動分區機制把大的region切分成小的subregion。

缺點:

  • 對JOIN以及多表合併數據的查詢性能不好:需要通過MapReduce實現,在設計表的時候,把幾十億數據設計到一張表中就挺好;
  • 更新過程中有大量的寫入和刪除操作,需要頻繁合併和分裂,降低存儲效率;
  • 對關係模型支持不好,分區和索引模式設計比較困難。

二、HBase特徵簡要

2.1、自動故障處理和負載均衡

HBase運行在HDFS上,所以HBase中的數據以多副本形式存放,數據也服從分佈式存放,數據的恢復也可以得到保障。另外,HMaster和RegionServer也是多副本的。
通過MapReduce不斷的將小文件合併爲大文件,本身就是負載均衡的機制,HMaster是高可用的,可以依賴zookeeper配置HMaster高可用

2.2、自動分區

HBase表是由分佈在多個RegionServer中的region組成的,這些RegionServer又分佈在不同的DataNode上,如果一個region增長到了一個閾值,爲了負載均衡和減少IO,HBase可以自動或手動干預的將region切分爲更小的region,也稱之爲subregion。

2.3、集成Hadoop/HDFS

雖然HBase也可以運行在其他的分佈式文件系統之上,但是與HDFS結合非常之方便,而且HDFS也非常之流行。支持很多的文件系統,這裏比較流行的hdfs

2.4、實時隨機大數據訪問

HBase採用log-structured merge-tree作爲內部數據存儲架構,這種架構會週期性地將小文件合併成大文件以減少磁盤訪問同時減少NameNode壓力。響應速度應該在毫秒級別的。

log-structured merge-tree log日誌結構化的合併:

第一次內存中是沒有樹的,就可以新建一棵樹,當裏面的樹存儲到一定程度了,就把這個數據結構存到磁盤裏面,存完之後又有新的數據往裏面添加,會再建一棵樹,然後數據又寫滿了,又放到磁盤裏面,如此往復會產生很多這樣的樹,通過ls算法把這些樹合併到一個,LSM算法是通過B tree和 B+ Tree 這兩個算法演化而來的

2.5、MapReduce

HBase內建支持MapReduce框架,更加方便快速,並行的處理數據。
HBase本身是不支持join操作的,可以通過MapReduce實現類似的功能,但是不建議這樣做,因爲效率低。

2.6、Java API

HBase提供原聲的Java API支持,方便開發。

2.7、橫向擴展

HBase支持橫向擴展,這就意味着如果現有服務器硬件性能出現瓶頸,不需要停掉現有集羣提升硬件配置,而只需要在現有的正在運行的集羣中添加新的機器節點即可,而且新的RegionServer一旦建立完畢,集羣會開始重新調整。

2.8、列存儲

HBase是面向列存儲的,每個列都單獨存儲,所以在HBase中列是連續存儲的,而行不是。

2.9、HBase Shell

HBase提供了交互式命令行工具可以進行創建表、添加數據、掃描數據、刪除數據等操作和其他一些管理命令。
 

三、HBase 部署

3.1、僞分佈式

(1)配置

1.hbase-env.sh中配置JAVA_HOME
2.配置hbase-site.xml如下
<property>
<name>hbase.rootdir</name>
<value>file:///home/testuser/hbase</value>
</property>
<property>
<name>hbase.zookeeper.property.dataDir</name>
<value>/home/testuser/zookeeper</value>
</property>

3.2、完全分佈式

(1)前提

1Hadoop集羣正常運行

2ZooKeeper集羣正常運行

(2)配置

配置regionservers ,主機名
配置backup-masters
配置hbase-env.sh
配置JAVA_HOME
配置HBASE_MANAGERS_ZK=false
配置hbase-site.xml
添加hdfs-site.xml到conf目錄下

啓動Hbase: start-hbase.sh 

Hbase-site.xml:

<property>
<name>hbase.rootdir</name>
<value>hdfs://namenode.example.org:8020/hbase</value>
</property>
<property>
<name>hbase.cluster.distributed</name>
<value>true</value>
</property>
<property>
<name>hbase.zookeeper.quorum</name>
<value>node-a.example.com,node-b.example.com,node-c.example.com</value>
</property>

 

四、HBase Shell

通過 hbase shell命令進入HBase 命令行接口(通過help可查看所有命令的支持以及幫助手冊)

 

 

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