zookeeper中對用戶的數據採用kv形式存儲node
只是zk有點特別:mysql
key:是以路徑的形式表示的,那就覺得着,各key之間有父子關係,好比redis
/ 是頂層key算法
用戶建的key只能在/ 下做爲子節點,好比建一個key: /aa 這個key能夠帶value數據sql
也能夠建一個key: /bbmongodb
也能夠建key: /aa/xxshell
zookeeper中,對每個數據key,稱做一個znode數據庫
綜上所述,zk中的數據存儲形式以下:api
zookeeper中的znode有多種類型:緩存
組合類型:
PERSISTENT :持久不帶序號
EPHEMERAL :短暫不帶序號
PERSISTENT 且 SEQUENTIAL :持久且帶序號
EPHEMERAL 且 SEQUENTIAL :短暫且帶序號
進入zookeeper的安裝目錄的conf目錄
cp zoo_sample.cfg zoo.cfg
vi zoo.cfg
# The number of milliseconds of each tick tickTime=2000 initLimit=10 syncLimit=5 dataDir=/root/zkdata clientPort=2181
#autopurge.purgeInterval=1 server.1=hdp20-01:2888:3888 server.2=hdp20-02:2888:3888 server.3=hdp20-03:2888:3888 |
對3臺節點,都建立目錄 mkdir /root/zkdata
對3臺節點,在工做目錄中生成myid文件,但內容要分別爲各自的id: 1,2,3
hdp20-01上: echo 1 > /root/zkdata/myid
hdp20-02上: echo 2 > /root/zkdata/myid
hdp20-03上: echo 3 > /root/zkdata/myid
scp -r zookeeper-3.4.6/ hdp20-02$PWD
scp -r zookeeper-3.4.6/ hdp20-03:$PWD
zookeeper沒有提供自動批量啓動腳本,須要手動一臺一臺地起zookeeper進程
在每一臺節點上,運行命令:
bin/zkServer.sh start
啓動後,用jps應該能看到一個進程:QuorumPeerMain
可是,光有進程不表明zk已經正常服務,須要用命令檢查狀態:
bin/zkServer.sh status
能看到角色模式:爲leader或follower,即正常了。
/aa : 88888
/aa/bb : "xxoo"
/aa/cc : "edu360"
/tt: 9898
每個key-value稱爲一個znode(zookeeper數據節點)
上述4中類型,能夠有如下組合類型:
持久-帶序號
持久-不帶序號
短暫-帶序號
短暫-不帶序號
建立節點: create /aaa 'ppppp'
查看節點下的子節點: ls /aaa
獲取節點的value: get /aaa
修改節點的value: set /aaa 'mmmmm'
刪除節點:rmr /aaa
ls /aaa watch
## 查看/aaa的子節點的同時,註冊了一個監聽「節點的子節點變化事件」的監聽器
get /aaa watch
## 獲取/aaa的value的同時,註冊了一個監聽「節點value變化事件」的監聽器
注意:註冊的監聽器在正常收到一次所監聽的事件後,就失效
在Eclipse環境下安裝ZooKeeper狀態查看相關的插件步驟以下:
Step 1. 在 Eclipse 菜單打開Help -> Install New Software…
Step 2. 添加 url http://www.massedynamic.org/eclipse/updates/
Step 3. 選擇插件並安裝運行
Step 4. 在 Eclipse 菜單打開Window->Show View->Other…->ZooKeeper 3.2.2。
Step 5. 鏈接ZK 輸入正在運行的ZK server 地址和端口
鏈接成功後就就能夠在Eclipse裏查看ZK Server裏的節點信息。以下所示:
HBASE是一個數據庫----能夠提供數據的實時隨機讀寫
HBASE與mysql、oralce、db二、sqlserver等關係型數據庫不一樣,它是一個NoSQL數據庫(非關係型數據庫)
HBASE相比於其餘nosql數據庫(mongodb、redis、cassendra、hazelcast)的特色:
Hbase的表數據存儲在HDFS文件系統中
從而,hbase具有以下特性:存儲容量能夠線性擴展; 數據存儲的安全性可靠性極高!
HBASE是一個分佈式系統
其中有一個管理角色: HMaster(通常2臺,一臺active,一臺backup)
其餘的數據節點角色: HRegionServer(不少臺,看數據容量)
首先,要有一個HDFS集羣,並正常運行; regionserver應該跟hdfs中的datanode在一塊兒
其次,還須要一個zookeeper集羣,並正常運行
而後,安裝HBASE
角色分配以下:
Hdp01: namenode datanode regionserver hmaster zookeeper
Hdp02: datanode regionserver zookeeper
Hdp03: datanode regionserver zookeeper
解壓hbase安裝包
修改hbase-env.sh
export JAVA_HOME=/root/apps/jdk1.7.0_67 export HBASE_MANAGES_ZK=false |
修改hbase-site.xml
<configuration> <!-- 指定hbase在HDFS上存儲的路徑 --> <property> <name>hbase.rootdir</name> <value>hdfs://hdp01:9000/hbase</value> </property> <!-- 指定hbase是分佈式的 --> <property> <name>hbase.cluster.distributed</name> <value>true</value> </property> <!-- 指定zk的地址,多個用「,」分割 --> <property> <name>hbase.zookeeper.quorum</name> <value>hdp01:2181,hdp02:2181,hdp03:2181</value> </property> </configuration> |
修改 regionservers
hdp01 hdp02 hdp03 |
bin/start-hbase.sh
啓動完後,還能夠在集羣中找任意一臺機器啓動一個備用的master
bin/hbase-daemon.sh start master
新啓的這個master會處於backup狀態
bin/hbase shell
Hbase> list // 查看錶
Hbase> status // 查看集羣狀態
Hbase> version // 查看集羣版本
hbase的表模型跟mysql之類的關係型數據庫的表模型差異巨大
hbase的表模型中有:行的概念;但沒有字段的概念
行中存的都是key-value對,每行中的key-value對中的key能夠是各類各樣,每行中的key-value對的數量也能夠是各類各樣
要點一:首先會按行鍵排序
要點二:同一行裏面的kv會按列族排序,再按k排序
hbase中只支持byte[]
此處的byte[] 包括了: rowkey,key,value,列族名,表名
create 't_user_info','base_info','extra_info'
表名 列族名 列族名
hbase(main):011:0> put 't_user_info','001','base_info:username','zhangsan' 0 row(s) in 0.2420 seconds
hbase(main):012:0> put 't_user_info','001','base_info:age','18' 0 row(s) in 0.0140 seconds
hbase(main):013:0> put 't_user_info','001','base_info:sex','female' 0 row(s) in 0.0070 seconds
hbase(main):014:0> put 't_user_info','001','extra_info:career','it' 0 row(s) in 0.0090 seconds
hbase(main):015:0> put 't_user_info','002','extra_info:career','actoress' 0 row(s) in 0.0090 seconds
hbase(main):016:0> put 't_user_info','002','base_info:username','liuyifei' 0 row(s) in 0.0060 seconds |
hbase(main):017:0> scan 't_user_info' ROW COLUMN+CELL 001 column=base_info:age, timestamp=1496567924507, value=18 001 column=base_info:sex, timestamp=1496567934669, value=female 001 column=base_info:username, timestamp=1496567889554, value=zhangsan 001 column=extra_info:career, timestamp=1496567963992, value=it 002 column=base_info:username, timestamp=1496568034187, value=liuyifei 002 column=extra_info:career, timestamp=1496568008631, value=actoress 2 row(s) in 0.0420 seconds |
hbase(main):020:0> get 't_user_info','001' COLUMN CELL base_info:age timestamp=1496568160192, value=19 base_info:sex timestamp=1496567934669, value=female base_info:username timestamp=1496567889554, value=zhangsan extra_info:career timestamp=1496567963992, value=it 4 row(s) in 0.0770 seconds |
hbase(main):021:0> delete 't_user_info','001','base_info:sex' 0 row(s) in 0.0390 seconds |
刪除整行數據:
hbase(main):024:0> deleteall 't_user_info','001' 0 row(s) in 0.0090 seconds
hbase(main):025:0> get 't_user_info','001' COLUMN CELL 0 row(s) in 0.0110 seconds |
hbase(main):028:0> disable 't_user_info' 0 row(s) in 2.3640 seconds
hbase(main):029:0> drop 't_user_info' 0 row(s) in 1.2950 seconds
hbase(main):030:0> list TABLE 0 row(s) in 0.0130 seconds
=> [] |
插入到hbase中去的數據,hbase會自動排序存儲:
排序規則: 首先看行鍵,而後看列族名,而後看列(key)名; 按字典順序
Hbase的這個特性跟查詢效率有極大的關係
好比:一張用來存儲用戶信息的表,有名字,戶籍,年齡,職業....等信息
而後,在業務系統中常常須要:
查詢某個省的全部用戶
常常須要查詢某個省的指定姓的全部用戶
思路:若是能將相同省的用戶在hbase的存儲文件中連續存儲,而且能將相同省中相同姓的用戶連續存儲,那麼,上述兩個查詢需求的效率就會提升!!!作法:將查詢條件拼到rowkey內
Connection conn = ConnectionFactory.createConnection(conf);
二、拿到一個DDL操做器:表管理器admin
Admin admin = conn.getAdmin();
三、用表管理器的api去建表、刪表、修改表定義
admin.createTable(HTableDescriptor descriptor);
建立、刪除、修改Table的定義。實現DDL操做(namespace和table的增刪改,column familiy的增刪改等)。
注: HMaster經過監聽ZooKeeper中的Ephemeral節點(默認:/hbase/rs/*)來監控HRegionServer的加入和宕機。
在第一個HMaster鏈接到ZooKeeper時會建立Ephemeral節點(默認:/hbasae/master)來表示Active的HMaster,其後加進來的HMaster則監聽該Ephemeral節點
若是當前Active的HMaster宕機,則該節點消失,於是其餘HMaster獲得通知,而將自身轉換成Active的HMaster,在變爲Active的HMaster以前,它會在/hbase/masters/下建立本身的Ephemeral節點。
1、在HBase 0.96之前,HBase有兩個特殊的Table:-ROOT-和.META. 用來記錄用戶表的rowkey範圍所在的的regionserver服務器;
於是客戶端讀寫數據時須要經過3次尋址請求來對數據所在的regionserver進行定位,效率低下;
二、而在HBase 0.96之後去掉了-ROOT- Table,只剩下這個特殊的目錄表叫作Meta Table(hbase:meta),它存儲了集羣中全部用戶HRegion的位置信息,而ZooKeeper的節點中(/hbase/meta-region-server)存儲的則直接是這個Meta Table的位置,而且這個Meta Table如之前的-ROOT- Table同樣是不可split的。這樣,客戶端在第一次訪問用戶Table的流程就變成了:
注:客戶會緩存這些位置信息,然而第二步它只是緩存當前RowKey對應的HRegion的位置,於是若是下一個要查的RowKey不在同一個HRegion中,則須要繼續查詢hbase:meta所在的HRegion,然而隨着時間的推移,客戶端緩存的位置信息愈來愈多,以致於不須要再次查找hbase:meta Table的信息,除非某個HRegion由於宕機或Split被移動,此時須要從新查詢而且更新緩存。
hbase:meta表存儲了全部用戶HRegion的位置信息:
Rowkey:tableName,regionStartKey,regionId,replicaId等;
info列族:這個列族包含三個列,他們分別是:
info:regioninfo列:
regionId,tableName,startKey,endKey,offline,split,replicaId;
info:server列:HRegionServer對應的server:port;
info:serverstartcode列:HRegionServer的啓動時間戳。
hbase.regionserver.hlog.blocksize * hbase.regionserver.max.logs
的數量,當前HRegionServer中全部HRegion中的MemStore都會Flush到HDFS中,
Flush使用時間順序,最先的MemStore先Flush直到WAL的數量少於
hbase.regionserver.hlog.blocksize * hbase.regionserver.max.logs
這裏說這兩個相乘的默認大小是2GB,查代碼,hbase.regionserver.max.logs默認值是32,而hbase.regionserver.hlog.blocksize默認是32MB。但無論怎麼樣,由於這個大小超過限制引發的Flush不是一件好事,可能引發長時間的延遲