1. 程式人生 > >大資料儲存---HBase介紹(上)

大資料儲存---HBase介紹(上)

本次主要介紹三部分:

  • HBase簡介
  • HBase整體架構
  • HBase安裝和啟動
  • Hbase基本操作

HBase簡介

hbase是bigtable的開源java版本,是建立在hdfs之上。 提供高可靠性、高效能、列儲存、可伸縮、實時讀寫nosql的資料庫系統。

它介於nosql和關係型資料庫之間,僅能通過主鍵(row key)和主鍵的range來檢索資料,僅支援單行事務(可通過hive支援來實現多表join等複雜操作)。 主要用來儲存結構化和半結構化的鬆散資料。

  • Hbase查詢資料功能很簡單,不支援join等複雜操作,不支援複雜的事務(行級的事務)
  • Bigtable 是一個稀疏的、分散式的、持久化儲存的多維度排序Map。 Map 的索引是行關鍵字、列關鍵字以及時間戳; Map 中的每個 value 都是一個未經解析的 byte 陣列。
  • 與hadoop一樣,Hbase目標主要依靠橫向擴充套件,通過不斷增加廉價的商用伺服器,來增加計算和儲存能力。

便儲存資料的特點

  • 大:一個表可以有上十億行,上百萬列
  • 面向列:面向列(族)的儲存和許可權控制,列(族)獨立檢索。
  • 稀疏:對於為空(null)的列,並不佔用儲存空間,因此,表可以設計的非常稀疏。

與關係型資料庫的區別

  • 1、行式資料庫在分析的時候,將id,name,age,sex,score;完整的資訊讀入記憶體,造成大量的記憶體和IO浪費。
  • 2、列式資料庫的思維是把行式資料庫全部拆開,按照列的方式重新組合儲存,一列所有的行的資料存放在一起。帶來的好處就是,要分析男女就直接訪問所有的男女資訊,要分析銷售額,就直接訪問消費額相關的資料。
  • 在這裡插入圖片描述

HBase的表資料結構

在這裡插入圖片描述

  • 表(table):用於儲存管理資料,具有稀疏的、面向列的特點。HBase中的每一張表,就是所謂的大表(Bigtable),可以有上億行,上百萬列。對於為值為空的列,並不佔用儲存空間,因此表可以設計的非常稀疏。
  • 行鍵(RowKey):類似於MySQL中的主鍵,HBase根據行鍵來快速檢索資料,一個行鍵對應一條記錄。與MySQL主鍵不同的是,HBase的行鍵是天然固有的,每一行資料都存在行鍵。
  • 列族(ColumnFamily):是列的集合。列族在表定義時需要指定,而列在插入資料時動態指定。列中的資料都是以二進位制形式存在,沒有資料型別。在物理儲存結構上,每個表中的每個列族單獨以一個檔案儲存。一個表可以有多個列簇。
  • 時間戳(TimeStamp):是列的一個屬性,是一個64位整數。由行鍵和列確定的單元格,可以儲存多個數據,每個資料含有時間戳屬性,資料具有版本特性。可根據版本(VERSIONS)或時間戳來指定查詢歷史版本資料,如果都不指定,則預設返回最新版本的資料。
  • 區域(Region):HBase自動把表水平劃分成的多個區域,劃分的區域隨著資料的增大而增多。

HBase整體架構

在這裡插入圖片描述

  • Client

    • ①使用HBase RPC機制與HMaster和HRegionServer進行通訊;
    • ②Client與HMaster進行通訊進行管理類操作;
    • ③Client與HRegionServer進行資料讀寫類操作。
  • Zookeeper

    • ①保證任何時候,叢集中只有一個running master,避免單點問題;
    • ②存貯所有Region的定址入口,包括-ROOT-表地址、HMaster地址;
    • ③實時監控Region Server的狀態,將Region server的上線和下線資訊,實時通知給Master;
    • ④儲存Hbase的schema,包括有哪些table,每個table有哪些column family。
  • HMaster 可以啟動多個HMaster,通過Zookeeper的Master Election機制保證總有一個Master執行。 角色功能:

    • ①為Region server分配region;
    • ②負責region server的負載均衡;
    • ③發現失效的region serve並重新分配其上的region;
    • ④GFS上的垃圾檔案回收;
    • ⑤處理使用者對標的增刪改查操作。
  • HRegionServer HBase中最核心的模組,主要負責響應使用者I/O請求,向HDFS檔案系統中讀寫資料。作用:

    • ①維護Master分配給它的region,處理對這些region的IO請求;
    • ②負責切分在執行過程中變得過大的region。
    • 此外,HRegionServer管理一些列HRegion物件,每個HRegion對應Table中一個Region,HRegion由多個HStore組成,每個HStore對應Table中一個Column Family的儲存,Column Family就是一個集中的儲存單元,故將具有相同IO特性的Column放在一個Column Family會更高效。
  • HStore HBase儲存的核心,由MemStore和StoreFile組成。 使用者寫入資料的流程為:client寫入 -> 存入MemStore,一直到MemStore滿 -> Flush成一個StoreFile,直至增長到一定閾值 -> 觸發Compact合併操作 -> 多個StoreFile合併成一個StoreFile,同時進行版本合併和資料刪除 -> 當StoreFiles Compact後,逐步形成越來越大的StoreFile -> 單個StoreFile大小超過一定閾值後,觸發Split操作,把當前Region Split成2個Region,Region會下線,新Split出的2個孩子Region會被HMaster分配到相應的HRegionServer上,使得原先1個Region的壓力得以分流到2個Region上,如圖所示。 在這裡插入圖片描述 HRegion 一個表最開始儲存的時候,是一個region。 一個Region中會有個多個store,每個store用來儲存一個列簇。如果只有一個column family,就只有一個store。 region會隨著插入的資料越來越多,會進行拆分。預設大小是10G一個。

  • HLog

    • 在分散式系統環境中,無法避免系統出錯或者宕機,一旦HRegionServer意外退出,MemStore中的記憶體資料就會丟失,引入HLog就是防止這種情況。
    • 工作機制: 每個HRegionServer中都會有一個HLog物件,HLog是一個實現Write Ahead Log的類,每次使用者操作寫入Memstore的同時,也會寫一份資料到HLog檔案,HLog檔案定期會滾動出新,並刪除舊的檔案(已持久化到StoreFile中的資料)。當HRegionServer意外終止後,HMaster會通過Zookeeper感知,HMaster首先處理遺留的HLog檔案,將不同region的log資料拆分,分別放到相應region目錄下,然後再將失效的region重新分配,領取到這些region的HRegionServer在Load Region的過程中,會發現有歷史HLog需要處理,因此會Replay HLog中的資料到MemStore中,然後flush到StoreFiles,完成資料恢復。

查詢路由

HBase中存有兩張特殊的表,-ROOT-和.META.。

  • .META.:記錄了使用者表的Region資訊,.META.可以有多個regoin。
  • -ROOT-:記錄了.META.表的Region資訊,-ROOT-只有一個region。Zookeeper中記錄了-ROOT-表的location。

Client訪問使用者資料之前需要首先訪問zookeeper,然後訪問-ROOT-表,接著訪問.META.表,最後才能找到使用者資料的位置去訪問。 在這裡插入圖片描述

HBase的安裝和基本操作

HBase的安裝

  • 下載安裝
wget http://mirrors.hust.edu.cn/apache/hbase/1.3.1/hbase-1.3.1-bin.tar.gz
tar -zxvf hbase-1.3.1-bin.tar.gz -C /export/servers/
cd ../servers/
mv hbase-1.3.1 hbase
vi /etc/profile
-
export HBASE_HOME=/export/servers/hbase
export PATH=${HBASE_HOME}/bin:$PATH
-
source /etc/profile
  • 修改配置檔案
  1. 進入配置檔案所在的目錄 cd /export/servers/hbase/conf/
  2. 修改第一個配置檔案 regionservers
vi regionservers 
-
node02
node03
  1. 修改第二個配置檔案 hbase-site.xml
注意:以下配置整合的是hadoop ha叢集。
如果您的叢集沒有配置ha,hbase.rootdir 配置專案需要修改:hdfs://master:9000/hbase
vi hbase-site.xml 
-
<configuration>
  <property>
    <name>hbase.rootdir</name>
    <value>hdfs://ns1/hbase</value>
  </property>
  <property>
     <name>hbase.cluster.distributed</name>
     <value>true</value>
  </property>
  <property>
     <name>hbase.master.port</name>
     <value>16000</value>
  </property>
   <property>
    <name>hbase.zookeeper.property.dataDir</name>
    <value>/export/data/zk/</value>
  </property>
  <property>
    <name>hbase.zookeeper.quorum</name>
    <value>node01,node02,node03</value>
  </property>
  <property>
    <name>hbase.zookeeper.property.clientPort</name>
    <value>2181</value>
  </property>
</configuration>
HBASE_MANAGES_ZK=false 表示,hbase和大傢伙公用一個zookeeper叢集,而不是自己管理叢集。

vi hbase-env.sh
-
export JAVA_HOME=/export/servers/jdk
export HBASE_MANAGES_ZK=false

分發其他節點並啟動

分發配置檔案
scp -r /export/servers/hbase/ node02:/export/servers/
scp -r /export/servers/hbase/ node03:/export/servers/

啟動叢集
startzk.sh
start-dfs.sh
start-hbase.sh

HBase的基本操作

命令檔案如下 在這裡插入圖片描述 可以通過HbaseUi介面查看錶的資訊

埠60010打不開的情況,是因為hbase 1.0 以後的版本,需要自己手動配置,在檔案 hbase-site

<property>  
	<name>hbase.master.info.port</name>  
	<value>60010</value>  
</property> 

連線叢集

hbase shell

建立表

create 'user','base_info'

插入資料

put 'user','rowkey_10','base_info:username','張三'
put 'user','rowkey_10','base_info:birthday','2014-07-10'
put 'user','rowkey_10','base_info:sex','1'
put 'user','rowkey_10','base_info:address','北京市'

put 'user','rowkey_16','base_info:username','張小明'
put 'user','rowkey_16','base_info:birthday','2014-07-10'
put 'user','rowkey_16','base_info:sex','1'
put 'user','rowkey_16','base_info:address','北京'

put 'user','rowkey_22','base_info:username','陳小明'
put 'user','rowkey_22','base_info:birthday','2014-07-10'
put 'user','rowkey_22','base_info:sex','1'
put 'user','rowkey_22','base_info:address','上海'

put 'user','rowkey_24','base_info:username','張三丰'
put 'user','rowkey_24','base_info:birthday','2014-07-10'
put 'user','rowkey_24','base_info:sex','1'
put 'user','rowkey_24','base_info:address','河南'

put 'user','rowkey_25','base_info:username','陳大明'
put 'user','rowkey_25','base_info:birthday','2014-07-10'
put 'user','rowkey_25','base_info:sex','1'
put 'user','rowkey_25','base_info:address','西安'

查詢資料

//查詢所有資料
scan 'user'
//查詢某個列簇的資料
get 'user','rowkey_16','base_info'
get 'user','rowkey_16','base_info:username'
get 'user', 'rowkey_16', {COLUMN => ['base_info:username','base_info:sex']}

刪除表中的資料

delete 'user', 'rowkey_16', 'base_info:username'

清空資料

truncate 'user'

操作列簇

alter 'user', NAME => 'f2'
alter 'user', 'delete' => 'f2'

刪除表

disable 'user'
drop 'user'