25Hbase理論基礎——好程序

爲什麼要hbase
隨着數據量越來越大,傳統的關係型數據庫不能滿足需求,hive雖然能夠滿足存儲,但是不滿足非結構化的存儲和高效的查詢

hbase是什麼
hbase是一個開源的、分佈式的、可擴展的、多版本的非關係型數據庫。not-only

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

阿帕奇HBase伊什是Hadoop數據庫,一個分佈式、可伸縮的大數據存儲。

使用Apache HBase是在當您需要對大數據進行隨機、實時讀/寫訪問時。這個項目的目標是在商品硬件集羣上託管非常大的表——數十億行×數百萬列。Apache HBase是一個開源的、分佈式的、版本化的、非關係型數據庫,它的模型是Google的Bigtable:Chang等人的結構化數據分佈式存儲系統。正如Bigtable利用Google文件系統提供的分佈式數據存儲一樣,Apache HBase在Hadoop和HDFS之上提供了類似Bigtable的功能。

hbase的適用場景
需要處理海量非結構化的數據的場景,進行存儲,隨機近實時的讀寫管理數據

hbase和hadoop的關係
hbase基於hadoop,hbase的存儲依賴於hdfs。

hbase的架構
client、zookeeper、hmaster、hregionserver、hlog、hregion、store、memstore、storefile、hfile

client:
hbase的客戶端,包含訪問hbase的接口(shell、java api)
client維護一些cache來加速對hbase的訪問,比如region的位置信息

zookeeper:
監控master的狀態,保證有且僅有一個active的master,達到高可用
存儲所有的hregion的尋址入口 -- root表所在的位置(服務器)
實時監控hregionserver的狀態,將hregionserver的上下線信息實時通知hmaster
存儲hbase的所有表的信息(hbase的schema數據),包含有哪些表,每個表有哪些列簇

hmaster(hbase的老大)
爲regionserver分配region(新建表的時候)
負責hregion的重新分配(regionserver異常、hregion變大一分爲二)
負責regionserver的負載均衡
hdfs上的垃圾文件回收
處理schema的更新請求

hregionserver(hbase的小弟)
regionserver負責維護master分給給他的region(管理region)
處理client對這些region的io請求,並和hdfs進行交互
regionserver負責切分運行過程中變大的region

hlog:
對hbase的操作進行記錄,使用WAL寫數據優先寫到hLog裏,然後再寫到memstore(內存),以防數據丟失時可以進行回滾。hlogs屬於hregionserver的進程,一個regionserver可以管理多個region,操作日記會寫到一個log裏,log在region外面

hregion:
hbase中分佈式存儲和負載均衡的最小單元。表或者表的一部分。()

store:相當於一個列簇。(列是存儲的,每一個列簇存到一個文件裏面)

memstore:內存緩衝區,用戶進行批量刷新數據到hdfs上。(閥值達到128M,則落地到磁盤,上傳到hdfs上)

hstorefile:
hbase中的數據以hfile的形式存儲到hdfs上(邏輯上的概念,只是在hfile上封裝而已)

hfile:

各組件的數量關係
master:regionserver = 1:n
regionserver:log = 1:1
regionserver:region = 1:n
region:store = 1:n
store:memstore = 1:1
store:storefile = 1:n
storefile:hfile = 1:1

hbase的關鍵字
rowkey:行健(跟mysql的主鍵一樣),不允許重複,有順序
columnfamily:列簇(列的集合)
column:列
timestamp:時間戳(默認顯示最新的時間戳)
version:版本號
cell:單元格(一個單元格表示一個列的key-value值)

hbase的特點
線性和模塊化的可擴展性。
嚴格一致的讀寫。
表的自動可配置分片
區域服務器之間的自動故障轉移支持。
使用Apache HBase表支持Hadoop MapReduce作業的方便基類。
易於使用Java API進行客戶端訪問。
用於實時查詢的塊緩存和Bloom篩選器。

模式:無模式
數據類型:單一 byte[](hbase唯一支持的數據類型,所有的數據都會轉化爲byte)
多版本:每一個值都可以有多個版本
存儲:稀疏存儲。當key-value的值爲null時,整個都不會佔用存儲空間

hbase的安裝步驟
1、Standalone HBase
2、Pseudo-Distributed Local Install
3、Advanced - Fully Distributed(全分佈)
    1、上傳安裝包,解壓並配置環境變量  然後source一下
    2、配置hive的環境
           vi hbase-env.sh   (jdk的路徑,要全路徑,因爲ssh登錄的時候不會加載環境變量)   
           export  HBASE_MANGES_ZK=false,  如果是true的話,則會自己去啓動zookeeper,企業中一般爲false
    3、vi conf/regionservers  (配置小弟文件,要告訴小弟在那   也就是所有子節點  hadoop0001hadoop0002hadoop0003)
    4、vi conf/backup-masters(備用master設置,hadoop0001是老大,則hadoop002,hadoop003可以作爲備用的)
    5、配置hbase的主配置文件
    vi hbase-site.xml

<!--是否開啓分佈式模式-->
<property>
  <name>hbase.cluster.distributed</name>
  <value>true</value>
</property>

<!--指定hbase在hdfs的根目錄-->
<property>
  <name>hbase.rootdir</name>
  <value>hdfs://gp1923/hbase</value>
</property>

<!-- 指定zk的地址,多個用“,”分割 -->
<property>
    <name>hbase.zookeeper.quorum</name>
    <value>hadoop0001:2181,hadoop0002:2181,hadoop0003:2181</value>
</property>

<!-- 指定hbase的監控頁面端口 -->
<property>
    <name>hbase.master.info.port</name>
    <value>60010</value>
</property>

    6、如果hdfs是高可用的,需要將hadoop的core-site.xml和hdfs-site.xml拷貝到hbase/conf目錄下(hbase是hdfs的客戶端)

    7、分發安裝包到集羣的其他節點
    local] scp -r hbase-1.2.1 root@hadoop0003:$PWD

    8、啓動(注意時間同步)
    先啓動zk
    再啓動hdfs(依賴於存儲,操作依賴JavaAPI操作)
    然後啓動hbase
    
    監控端口:60010
    hmaster:16010
    hregionserver監控端口:16030
    hregionserver的服務端口:16020

 

hbase的shell操作
啓動客戶端
hbase shell
help "COMMAND"
help "COMMAND_GROUP"

Group name: namespace
  Commands: alter_namespace, create_namespace, describe_namespace, drop_namespace, list_namespace, list_namespace_tables
  
 hbase中沒有庫的概念,但是有名稱空間或者組的概念,namespace相當於庫
 hbase默認有兩個組
 default
 hbase

alter_namespace 'ns1', {METHOD => 'set', 'NAME' => 'NS2'}

alter_namespace 'ns1', {METHOD => 'unset', NAME=>'gp1923'}


DDL:()
Group name: ddl
Commands: alter, alter_async, alter_status, create, describe, disable, disable_all, drop, drop_all, enable, enable_all, exists, get_table, is_disabled, is_enabled, list, locate_region, show_filters

創建表:
create 't2', {NAME => 'info'}, {NAME => 'log'}, {NAME => 'extra'}
create 'ns1:t2',{NAME => 'base_info'},{NAME => 'extra_info',BLOOMFILTER => 'ROWCOL', VERSIONS => '3',IN_MEMORY => 'true'}
 BLOOMFILTER => 'ROW', VERSIONS => '1', IN_MEMORY => 'false', K
EEP_DELETED_CELLS => 'FALSE', DATA_BLOCK_ENCODING => 'NONE', TTL => 'FOREVER', C
OMPRESSION => 'NONE', MIN_VERSIONS => '0', BLOCKCACHE => 'true', BLOCKSIZE => '6
5536', REPLICATION_SCOPE => '0'

修改表:(有則更新,無則新增)
alter 'ns1:t2',{NAME => 'info'},{NAME => 'base_info',BLOOMFILTER => 'ROWCOL', VERSIONS => '3', IN_MEMORY => 'true'}

排序規則:先排rowkey(有序的),然後排列簇,再在列名上排序

刪除列簇:
alter 'ns1:t2',{NAME => 'info',METHOD => 'delete'}

刪除表:
disable 'ns1:t1' (1.2以前的版本)
drop 'ns1:t1'

Group name: dml
Commands: append, count, delete, deleteall, get, get_counter, get_splits, incr, put, scan, truncate, truncate_preserve
  
 修改數據:(有則修改,無則新增)  修改更新都是put命令
put 'ns1:t2','rk000001','base_info:name','gyy'

表掃描:
scan 'ns1:t1'

get查詢數據:(指定行鍵)
get 'ns1:t2','rk000001',{COLUMNS=>['base_info:name','extra_info:addr']}

刪除數據:

delete / deleteall

incr:(自增)
incr 'ns1:t2', 'rk000002', 'base_info:age', 1

清空表:
truncate   (先會disabling table 先刪除表,按照原來的結構再創建表 truncating)

 

複習:
zookeeper上存儲的hbase的信息
shell命令:
ddl
dml
namspace
tools

help 'command'
help 'group'


HBaseConfiguration
ConnectionFactory
Connection
Admin
Table

DDL
namespace
create
listnamespace
listnamespacetables
alterNamespace
deleteNamespace

Table操作
create
modify
describe
deleteTable
tableExists
isTableEnabled
isTableDisabled
EnableTable
DisableTable

DML
Table
put
get
scan
delete

Result[]
ResultScanner

hbase的api
預習:
http://hbase.apache.org/book.html#client.filter

跟mr的結合
跟hive結合
hbase和hive和hdfs的關係
二級索引
hbase的rowkey
phoenix操作hbase(像sql一樣操作)
hbase的優化


rowKey:rk00001    base_info:name:gaoyuanyuan    

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