[TOC]
# hbase數據庫介紹
## 簡介
hbase是bigtable的開源java版本。是**建立在hdfs之上**,提供高可靠性、高性能、列存儲、可伸縮、實時讀寫nosql的**數據庫系統**。
它介于nosql和RDBMS之間,**僅能通過主鍵(row key)和主鍵的range來檢索數據**,僅支持單行事務(可通過hive支持來實現多表join等復雜操作)。
主要用來存儲結構化和半結構化的松散數據。
Hbase查詢數據功能很簡單,不支持join等復雜操作,不支持復雜的事務(行級的事務)
Hbase中支持的數據類型:`byte[]`
與hadoop一樣,Hbase目標主要依靠**橫向擴展**,通過不斷增加廉價的商用服務器,來增加計算和存儲能力。
HBase中的表一般有這樣的特點:
* 大:一個表可以有上十億行,上百萬列
* 無模式: 每行都有一個可排序的主鍵和任意多的列,列可以根據需要動態的增加,同一張表中**不同的行可以有截然不同的列**
* 面向列:面向列(族)的存儲和權限控制,**列(族)獨立檢索**
* 稀疏:**對于為空(null)的列,并不占用存儲空間**,因此,表可以設計的非常稀疏
* 數據多版本:每個單元的數據可以有多個版本,默認情況下版本號自動分配,是單元插入時的時間戳
* 數據類型單一:Hbase中的數據都是字節數組`byte[]`
## 表結構邏輯視圖
HBase以表的形式存儲數據。表有行和列組成。列劃分為若干個列族(column family)

## Row Key
與nosql數據庫們一樣,row key是用來檢索記錄的主鍵。訪問hbase table中的行,只有三種方式:
1. 通過單個row key訪問
2. 通過row key的range
3. 全表掃描
Row key行鍵 (Row key)可以是任意字符串(最大長度是 64KB,實際應用中長度一般為 10-100bytes),在hbase內部,row key保存為字節數組。
**Hbase會對表中的數據按照rowkey排序(字典順序)**
存儲時,數據按照Row key的字典序(byte order)排序存儲。設計key時,要充分排序存儲這個特性,將經常一起讀取的行存儲放到一起。(位置相關性)
注意:
字典序對int排序的結果是
1,10,100,11,12,13,14,15,16,17,18,19,2,20,21,…,9,91,92,93,94,95,96,97,98,99。要保持整形的自然序,**行鍵必須用0作左填充**。
行的一次讀寫是原子操作 (不論一次讀寫多少列)。這個設計決策能夠使用戶很容易的理解程序在對同一個行進行并發更新操作時的行為。
## 列族
hbase表中的每個列,都歸屬與某個列族。列族是表的schema的一部分(而列不是),必須在使用表之前定義。
列名都以列族作為前綴。例如courses:history , courses:math 都屬于 courses 這個列族。
訪問控制、磁盤和內存的使用統計都是在列族層面進行的。
列族越多,在取一行數據時所要參與IO、搜尋的文件就越多,所以,如果沒有必要,不要設置太多的列族
## 時間戳
HBase中通過row和columns確定的為一個存貯單元稱為cell。每個 cell都保存著同一份數據的多個版本。版本通過時間戳來索引。時間戳的類型是 64位整型。時間戳可以由hbase(在數據寫入時自動 )賦值,此時時間戳是精確到毫秒的當前系統時間。時間戳也可以由客戶顯式賦值。如果應用程序要避免數據版本沖突,就必須自己生成具有唯一性的時間戳。每個 cell中,不同版本的數據按照時間倒序排序,即最新的數據排在最前面。
為了避免數據存在過多版本造成的的管理 (包括存貯和索引)負擔,hbase提供了兩種數據版本回收方式:
* 保存數據的最后n個版本
* 保存最近一段時間內的版本(設置數據的生命周期TTL)。
用戶可以針對每個列族進行設置。
## Cell
由`{row key, column( =<family> + <label>), version} `唯一確定的單元。
cell中的數據是沒有類型的,全部是字節碼形式存貯。
# 集群結構

client:
包含訪問hbase的接口,并維護cache來加快對hbase的訪問,比如region的位置信息
region:
是hbase中對表進行切割的單元
hmaster:
hbase的主節點,負責整個集群的狀態感知,負載分配、負責用戶表的元數據管理
可以配置多個用來實現HA
為RegionServer分配region
負責RegionServer的負載均衡
發現失效的RegionServer并重新分配其上的region
RegionServer:
hbase中真正負責管理region的服務器,也就是負責為客戶端進行表數據讀寫的服務器
維護region,處理對這些region的IO請求
RegionServer負責切分在運行過程中變得過大的region
zookeeper
整個hbase中的主從節點協調,
主節點之間的選舉,集群節點之間的上下線感知……都是通過zookeeper來實現
通過選舉,保證任何時候,集群中只有一個hmaster
hmaster與RegionServer啟動時會向zookeeper注冊
存儲所有region的尋址入口
實時監控RegionServer的上線和下線信息.并實時通知給hmaster
存儲hbase的schema和table元數據
zookeeper引入使得hmaster不再是單點故障
- linux
- 常用命令
- 高級文本命令
- 面試題
- redis
- String
- list
- hash
- set
- sortedSet
- 案例-推薦
- java高級特性
- 多線程
- 實現線程的三種方式
- 同步關鍵詞
- 讀寫鎖
- 鎖的相關概念
- 多線程的join
- 有三個線程T1 T2 T3,保證順序執行
- java五種線程池
- 守護線程與普通線程
- ThreadLocal
- BlockingQueue消息隊列
- JMS
- 反射
- volatile
- jvm
- IO
- nio
- netty
- netty簡介
- 案例一發送字符串
- 案例二發送對象
- 輕量級RPC開發
- 簡介
- spring(IOC/AOP)
- spring初始化順序
- 通過ApplicationContextAware加載Spring上下文
- InitializingBean的作用
- 結論
- 自定義注解
- zk在框架中的應用
- hadoop
- 簡介
- hadoop集群搭建
- hadoop單機安裝
- HDFS簡介
- hdfs基本操作
- hdfs環境搭建
- 常見問題匯總
- hdfs客戶端操作
- mapreduce工作機制
- 案列-單詞統計
- 局部聚合Combiner
- 案列-流量統計(分區,排序,比較)
- 案列-倒排索引
- 案例-共同好友
- 案列-join算法實現
- 案例-求topN(分組)
- 自定義inputFormat
- 自定義outputFormat
- 框架運算全流程
- mapreduce的優化方案
- HA機制
- Hive
- 安裝
- DDL操作
- 創建表
- 修改表
- DML操作
- Load
- insert
- select
- join操作
- 嚴格模式
- 數據類型
- shell參數
- 函數
- 內置運算符
- 內置函數
- 自定義函數
- Transform實現
- 特殊分割符處理
- 案例
- 級聯求和accumulate
- flume
- 簡介
- 安裝
- 常用的組件
- 攔截器
- 案例
- 采集目錄到HDFS
- 采集文件到HDFS
- 多個agent串聯
- 日志采集和匯總
- 自定義攔截器
- 高可用配置
- 使用注意
- sqoop
- 安裝
- 數據導入
- 導入數據到HDFS
- 導入關系表到HIVE
- 導入表數據子集
- 增量導入
- 數據導出
- 作業
- 原理
- azkaban
- 簡介
- 安裝
- 案例
- 簡介
- command類型單一job
- command類型多job工作流flow
- HDFS操作任務
- mapreduce任務
- hive腳本任務
- hbase
- 簡介
- 安裝
- 命令行
- 基本CURD
- 過濾器查詢
- 系統架構
- 物理存儲
- 尋址機制
- 讀寫過程
- Region管理
- master工作機制
- 建表高級屬性
- 與mapreduce結合
- 協處理器
- 點擊流平臺開發
- 簡介
- storm
- 簡介
- 安裝
- 集群啟動及任務過程分析
- 單詞統計
- 并行度
- ACK容錯機制
- ACK簡介