1) HBase是什么?
HBase是建立在Hadoop文件系統之上的分布式面向列的數據庫。它是一個開源項目,是橫向擴展的。
HBase是一個數據模型,類似於谷歌的大表設計,可以提供快速隨機訪問海量結構化數據。它利用了Hadoop的文件系統(HDFS)提供的容錯能力。
它是Hadoop的生態系統,提供對數據的隨機實時讀/寫訪問,是Hadoop文件系統的一部分。
人們可以直接或通過HBase的存儲HDFS數據。使用HBase在HDFS讀取消費/隨機訪問數據。 HBase在Hadoop的文件系統之上,並提供了讀寫訪問。
2) HBase的存儲機制
HBase是一個面向列的數據庫,在表中它由行排序。表模式定義只能列族,也就是鍵值對。一個表有多個列族以及每一個列族可以有任意數量的列。后續列的值連續地存儲在磁盤上。表中的每個單元格值都具有時間戳。
總之,在一個HBase:表是行的集合à行是列族的集合à列族是列的集合à列是鍵值對的集合,如圖:

3) Hbase的特點
- 建立在HDFS之上,面向列的針對結構化數據的可伸縮、高可靠、高性能、分布式列存儲的動態模式數據庫,列式數據庫(nosql)專門解決hadoop不擅長的工作。
- 采用BigTable的數據模型。增強的稀疏排序映射表(Key/Value),其中“鍵”是由行關鍵字、列關鍵字、時間截構成。
- 提供對大規模數據的隨機、實時讀寫訪問功能,其保存的數據可通過MapReduce處理。
4) 行數據庫與列數據庫的區別



5) hbase表特點:
- 表比較大,一個表有數十億行,上百萬列;
- 無模式:每行都有一個可排序的主鍵和任意多的列,列可以根據需要冬天的增加,同一張表中的行也已有截然不同的列;
- 稀疏:空值列並不占用存儲空間,列獨立檢索;
- 數據多版本:每個單元中的數據可以有多個版本,默認情況下版本號自動分配,是單元格插入時間戳;
- 數據類型單一:數據都是字符串,沒有類型
6) 存儲核心—Hstore
Hstore分為menstore和storefiles兩部分。
用戶寫入的數據首先會放入MemStore,當MemStore滿了以后會Flush成一個StoreFile(底層實現是HFile),當StoreFile文件數量增長到一定閾值,會觸發Compact合並操作,將多個StoreFiles合並成一個StoreFile,合並過程中會進行版本合並和數據刪除
HBase其實只有增加數據,所有的更新和刪除操作都是在后續的compact過程中進行的,這使得用戶的寫操作只要進入內存中就可以立即返回,保證了HBase I/O的高性能架構。
7) Hbase架構

一個HMaster(管理服務器)控制多個Region Server(數據服務器);
- HMater負責表的創建、刪除、維護以及Region的分配和負載均衡;
- Region Server負責管理維護Region以及響應讀寫請求;
- 客戶端與HMaster進行有關表的元數據操作,之后直接讀寫Region servers。

Master職責:
1. 為regionserver分配region;
2. 負責regionserver的負載均衡;
3. 垃圾文件回收;
4. 處理schema請求
Zookeeper職責:
- 保證集群只有一個Master;
- 監控Region Server狀態,實時通知Master;
- Hbase目錄入口地址;
- Hbase的Schema信息
Region職責:
- 對數據的讀寫支持;
- 對region管理的支持;
- Hbase目錄入口地址;
- Hbase的Schema信息
8) HBase 和 HDFS關系

9) hive與hbase區別
相同點:都是架構在hadoop之上,都是用hadoop作為底層存儲
不同點:
Hive:
- 是批處理系統,目的是檢索MapReduce jobs的編寫工作;
- 是純邏輯表並且是全表掃描,本身不存儲和計算數據,完全依賴HDFS和MapReduce;
- 時效性低
Hbase:
- 是實時操作系統,目的是彌補hadoop的缺陷項目;
- 是物理表,采用列存儲索引數據或實時數據,提供超大的內存hash表;
- 高時效性。
在安裝hadoop分布式文件系統的集群中選擇任意幾台機器安裝hbase
安裝jdk,hadoop,tar,設置環境變量(同hadoop/hive類似操作)
驗證安裝是否成功:hbase version
完全分布式配置:
[hbase/conf/hbase-env.sh]
export JAVA_HOME=/soft/jdk
export HBASE_MANAGES_ZK=false
<!-- 使用完全分布式 -->
<property>
<name>hbase.cluster.distributed</name>
<value>true</value>
</property>
<!-- 指定hbase數據在hdfs上的存放路徑 -->
<property>
<name>hbase.rootdir</name>
<value>hdfs://ip:8020/hbase</value>
</property>
<!-- 配置zk地址 -->
<property>
<name>hbase.zookeeper.quorum</name>
<value>ip1:2181,ip2:2181,ip3:2181</value>
</property>
<!-- zk的本地目錄 -->
<property>
<name>hbase.zookeeper.property.dataDir</name>
<value>/home/centos/zookeeper</value>
</property>
配置regionservers
[hbase/conf/regionservers]
節點名稱1
節點名稱2
…
啟動集群:進入hbase的bin目錄
./start-hbase.sh
