HMaster regionserver
(1).上传hbase的压缩包

(2).分发压缩包

(3).解压hbase的压缩包

(4).创建软连接

(5).修改所属用户

(6).修改环境变量

(7).备份配置目录

(8).修改配置
regionservers 配置那些机器运行regionserver

hbase-env.sh

hbase-site.xml




(9).启动与关闭
先启动zookeeper

再启动hdfs

start-hbase.sh

stop-hbase.sh
hbase-daemons.sh
(10).查看hbase的web界面
http://nn1.hadoop:60010

(11).hbase shell简单测试



RowKey:是Byte array,是表中每条记录的“主键”,方便快速查找,Rowkey的设计非常重要
Column Family:列族,拥有一个名称(string),包含一个或者多个相关列
Column:属于某一个columnfamily,familyName:columnName,每条记录可动态添加
Version Number:类型为Long,默认值是系统时间戳,可由用户自定义
Value(Cell):Byte array

每个column family存储在HDFS上的一个单独文件中,空值不会被保存
Key 和 Version number在每个 column family中均有一份
HBase 为每个值维护了多级索引,即:<key, column family, column name, timestamp>


在物理层面上,表格的数据是通过StoreFile来存储的,每个StoreFile相当于一个可序列化的Map,Map的key和value都是可解释型字符数组
Column Family
是一组Column的组合,在HBase中,Schema的定义主要为Column Family的定义,同大多数nosql数据库一样,HBase也是支持自由定义Schema,但是前提要先定义出具体的Column Family,而在随后的column定义则没有任何约束
其次,HBase的访问权限控制,磁盘及内存统计等功能都是基于Column Family层面完成的
Timestamp
HBase提供基于Cell的版本管理功能,版本号默认通过timestamp来标识,并且呈倒叙排列

Client:
包含访问HBase的接口,并维护cache来加快对HBase的访问,比如region的位置信息
Master
为Region server分配region
负责Region server的负载均衡
发现失效的Region server并重新分配其上的region
管理用户对table的增删改查操作
Region Server
维护region,处理对这些region的IO请求
Regionserver负责切分在运行过程中变得过大的region
Zookeeper
通过选举保证集群中只有一个Master,Master与RegionServers 启动时会向ZooKeeper注册
存储所有Region的寻址入口
实时监控Region server的上线和下线信息,并实时通知给Master
存储HBase的schema和table元数据
Zookeeper的引入使得Master不再是单点故障
寻找RegionServer
ZooKeeper--> -ROOT-(单Region)--> .META.--> 用户表
根据namespace、表名和rowkey在meta表中找到对应的region信息
找到这个region对应的regionserver
读操作
查找对应的region,先从MemStore找数据,如果没有,再到StoreFile上读
写操作
把数据分别写到HLog和MemStore上一份
MemStore达到一个阈值后则把数据刷成一个StoreFile文件
当多个StoreFile文件达到一定的大小后,会触发Compact合并操作,合并为一个StoreFile,这里同时进行版本的合并和数据删除
当Compact后,逐步形成越来越大的StoreFIle后,会触发Split操作
HRegionServer内部管理了一系列HRegion对象,每个HRegion对应了Table中的一个Region,HRegion中由多个HStore组成
每个HStore对应了Table中的一个Column Family的存储,可以看出每个Column Family其实就是一个集中的存储单元,因此最好将具备共同IO特性的column放在一个Column Family中,这样最高效
HStore存储由两部分组成,一部分是MemStore,一部分是StoreFiles
容错与恢复
每个HRegionServer中都有一个HLog对象,HLog是一个实现Write Ahead Log的类,在每次用户操作写入MemStore的同时,也会写一份数据到HLog文件中,HLog文件定期会滚动出新的,并删除旧的文件(已持久化到StoreFile中的数据)
当HRegionServer意外终止后,HMaster会通过Zookeeper感知到,HMaster首先会处理遗留的HLog文件,将其中不同Region的Log数据进行拆分,分别放到相应region的目录下,然后再将失效的region重新分配,领取到这些region的HRegionServer在LoadRegion的过程中,会发现有历史HLog需要处理,因此会ReplayHLog中的数据到MemStore中,然后flush到StoreFiles,完成数据恢复
每个Region Server维护一个Hlog,而不是每个Region一个。这样做的目的是不断追加单个文件相对于同时写多个文件而言,可以减少磁盘寻址次数,因此可以提高对table的写性能。带来的麻烦是,如果一台Region Server下线,为了恢复其上的Region,需要将Region Server上的log进行拆分,然后分发到其它Region Server上进行恢复
上限配置
hbase.regionserver.regionSplitLimit 单台region数上限,默认值 2147483647
IncreasingToUpperBoundRegionSplitPolicy,默认region split策略。根据公式min(r^2*flushSize,maxFileSize)确定split的maxFileSize,其中r为在线region个数,maxFileSize由hbase.hregion.max.filesize指定
ConstantSizeRegionSplitPolicy,仅仅当region大小超过常量值(hbase.hregion.max.filesize大小)时,才进行拆分
DelimitedKeyPrefixRegionSplitPolicy,保证以分隔符前面的前缀为splitPoint,保证相同RowKey前缀的数据在一个Region中.如果定义rowkey时,采用'_'作为字段分隔符(如:userid_eventid),则采用该策略拆分之后,能够确保具有相同userid的记录隶属于同一Region
KeyPrefixRegionSplitPolicy,保证具有相同前缀的row在一个region中(要求设计中前缀具有同样长度)。指定rowkey前缀位数划分region,通过读取table的prefix_split_key_policy.prefix_length属性,该属性为数字类型,表示前缀长度,在进行split时,按此长度对splitPoint进行截取。此种策略比较适合固定前缀的rowkey。当table中没有设置该属性,或其属性不为Integer类型时,指定此策略效果等同与使用IncreasingToUpperBoundRegionSplitPolicy
hbase配置文件中定义全局的拆分策略,设置hbase.regionserver.region.split.policy,也可以在创建和修改表时候指定
如果想关闭自动拆分改为手动拆分,建议同时修改hbase.hregion.max.filesize和hbase.regionserver.region.split.policy值
传统关系型数据普通索引就是采用B+树的方式
B+树最大的性能问题是会产生大量的随机IO,随着新数据的插入,叶子节点会慢慢分裂,逻辑上连续的叶子节点在物理上往往不连续,甚至分离的很远,但做范围查询时,会产生大量读随机IO
LSM树
为了克服B+树的弱点,HBase引入了LSM树的概念,即Log-Structured Merge-Trees
LSM树本质上就是在读写之间取得平衡,和B+树相比,它牺牲了部分读性能,用来大幅提高写性能
基本过程:把一颗大树拆分成N棵小树, 它首先写入到内存中(内存没有寻道速度的问题,随机写的性能得到大幅提升),在内存中构建一颗有序小树,随着小树越来越大,内存的小树会flush到磁盘上。当读时,由于不知道数据在哪棵小树上,因此必须遍历所有的小树,但在每颗小树内部数据是有序的

为什么要有WAL(Write Ahead Log)
因为数据是先写到内存中,如果断电,内存中的数据会丢失,因此为了保护内存中的数据,需要在磁盘上先记录LogFile,当内存中的数据flush到磁盘上时,就可以抛弃相应的LogFile
什么是MemStore, StoreFile
LSM树就是一堆小树,在内存中的小树即MemStore,每次flush,内存中的MemStore变成磁盘上一个新的StoreFile
为什么会有compact
随着小树越来越多,读的性能会越来越差,因此需要在适当的时候,对磁盘中的小树进行merge,多棵小树变成一颗大树
Row Key特点
Row Key可以是任意字符串,最大长度64KB,实际应用中一般为10~100bytes
RowKey是按照字典序存储,因此,设计row key时,要充分利用这个排序特点,将经常一起读取的数据存储到一块,将最近可能会被访问的数据放在一块
Row Key支持三种检索方式
通过单个row key访问:即按照某个row key键值进行get操作
通过row key的range进行scan:即通过设置startRowKey和endRowKey,在这个范围内进行扫描
全表扫描:即直接扫描整张表中所有行记录
Hbase中没有joins的概念,大表的结构可以使得不需要joins
常用的:
名称
命令表达式
创建表
create '表名称', '列簇名称1','列簇名称2','列簇名称N'
添加记录
put '表名称', '行名称', '列名称:', '值'
查看记录
get '表名称', '行名称'
查看表中的记录总数
count '表名称'
删除记录
delete '表名' ,'行名称' , '列名称'
删除一张表
先要屏蔽该表,才能对该表进行删除,第一步 disable '表名称' 第二步 drop '表名称'
查看所有记录
scan "表名称"
查看某个表某个列中所有数据
scan "表名称" , ['列名称:']
更新记录
就是重写一遍进行覆盖
一般操作
(1).查询服务器状态
status
(2).查询版本
version

DDL操作
(1).创建一个表
create 'hainiu_table','column_famaly','column_famaly1','column_famaly2'



(2).列出所有表
list

(3).获得表的描述
describe 'hainiu_table'

(4).删除一个列族
alter 'hainiu_table',{NAME=>'column_famaly',METHOD=>'delete'}
describe 'hainiu_table'

(5).drop一个表
create 'hainiu_table1','column_famaly'
list

drop 'hainiu_table1'

(6).把表设置为disable
disable 'hainiu_table1'


drop 'hainiu_table1'

list

(7).查询表是否存在
exists 'hainiu_table1'

(8).判断表是否enable
is_enabled 'hainiu_table'

(9).判断表是否disable
is_disabled 'hainiu_table'
disable 'hainiu_table'
is_disabled 'hainiu_table'

DML操作
(1).插入几条记录
put 'hainiu_table','id','column_famaly1:name','hainiu'

enable 'hainiu_table'
put 'hainiu_table','id','column_famaly1:name','hainiu'
put 'hainiu_table','id','column_famaly1:age','20'
put 'hainiu_table','id','column_famaly1:sex','boy'

(2).获取一条数据
get 'hainiu_table','id'

获取一个id,一个列族的所有数据
get 'hainiu_table','id','column_famaly1'

获取一个id,一个列族中一个列的所有数据
get 'hainiu_table','id','column_famaly1:name'

(3).更新一条记录
put 'hainiu_table','id','column_famaly1:age','22'
get 'hainiu_table','id','column_famaly1:age'

(4).通过timestamp来获取两个版本的数据
get 'hainiu_table','id',{COLUMN=>'column_famaly1:age',TIMESTAMP=>1496990409072}
get 'hainiu_table','id',{COLUMN=>'column_famaly1:age',TIMESTAMP=>1496990610025}

(5).全表扫描
scan 'hainiu_table'

(6).删除行健为id的值的‘column_famaly1:age’字段
delete 'hainiu_table','id','column_famaly1:age'
get 'hainiu_table','id'

(7).删除整行
deleteall 'hainiu_table','id'

(8).查询表中有多少行
count 'hainiu_table'

put 'hainiu_table','id','column_famaly1:age','20'
put 'hainiu_table','id','column_famaly1:name','hainiu'
put 'hainiu_table','id','column_famaly2:name','hainiu2'
put 'hainiu_table','id','column_famaly2:age','22'
count 'hainiu_table'

(9).给‘id’这个行健增加'column_famaly1:addr'字段,并使用counter实现递增
incr 'hainiu_table','id','column_famaly1:addr'
incr 'hainiu_table','id','column_famaly1:addr'
get 'hainiu_table','id','column_famaly1:addr'
incr 'hainiu_table','id','column_famaly1:addr'

(10).获取当前count的值
get_counter 'hainiu_table','id','column_famaly1:addr'

(11).将整张表清空
truncate 'hainiu_table'


来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/31537575/viewspace-3118856/ ,如需转载,请注明出处,否则将追究法律责任。