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不是一件好事,可能引发长时间的延迟