部署架构---->HMaster负责协调工作,负责建表、删表、移动Region、合并操作等。RegionServer是负责做数据存储的,以及客户端的CRUD等都是通过ZooKeeper来与RegionServer交互的。ZooKeeper管理了HBase所有的RegionServer信息,包括具体的数据段存放在哪个RegionServer上。
存储架构:一个列或者多个列组成一个行。每个行拥有唯一的行键,一个列有多个版本,多个列可以被归为一个列族。行键是根据字典进行排序的。
表的很多属性,比如过期时间、数据块缓存以及是否压缩等都是定义在列族上,而不是定义在表上或者列上。同一个表里的不同列族可以有完全不同的属性配置,但是同一个列族内的所有列都会有相同的属性,因为他们都在一个列族里面,而属性都是定义在列族上的。在HBase中一个列的名称前面总是带着它所属的列族。比如cf:age。
一个Region就是多个行的集合。Region中行是根据行键来排序的。
HBase shell操作:
create–创建表–create 表名称 列族名称
list–查看库中有哪些表
describe–查看表的属性–describe 表名称
put–插入数据/修改某个列的数据–put 表名称,行键,列族:列,列的值
scan–查看表的多条数据–scan 表名称,{STARTROW=>行键,ENDROW=>行键}
get–获取表的一个单元格数据–get 表名称,行键,列族:列/get 表名称,行键,{COLUMN=>列族:列,VERSIONS=>版本数}
delete–删除数据–delete 表名称,行键,列族:列
deleteall–删除整行数据–deleteall 表名称,行键
disable–停用表–disable 表名称
drop–删除表–drop 表名称
客户端API:
使用Table接口。官方建议大家先手动获取Connection,然后再从Connection中获取Table接口(注意:不是HTable类,而是Table接口)。具体的操作是由HTable类来实现的。
在HBase中所有数据都是bytes。在HBase中数据最终都会被序列化为bytes[]保存,所以一切可以被序列化为bytes的对象都可以作为rowkey。
Put对象的构造方法:
Put操作:
Put提供了一个语法糖,每一个addColumn返回的都是Put对象自己,所以可以把所有的列添加方法连接起来。
checkAndPut方法:
checkAndPut(byte[] row, byte[] family, byte[] qualifier,
byte[] value, Put put)
checkAndPut(byte[] row, byte[] family, byte[] qualifier,
CompareFilter.CompareOp compareOp, byte[] value, Put
put)
类似与Java并发中的原子操作,先比较和之前的值是否相同,若相同则修改并返回true,若不相同,则返回false。
Put.has方法:检查数据是否存在。
Append方法:
append方法不会创建或者修改行或列,它只做往列上的字节数组添加字节。
使用append来添加数据有两种方式,一种是提供列族、列和值,比
如我想在mycf:name尾部添加字符串Wang,可以这样写:
Append.add的另一种调用方式是直接提供一个单元格对象,比如:
Increment方法:数据库中某个列的数字加法操作。
Increment(byte[] row)
Increment(byte[] row, int offset, int length)
Increment(Increment i)
Get方法:
Result类:用户调用get之后,HBase会把查询到的结果封装到Result实例中。
Cell接口:在一些早期的教程中经常提到HBase API返回的最小数据单位
KeyValue类,这个类现在 已经被废弃了,转而采用Cell接口。
用getColumnCells方法获取到这个列的多个版本值(早期的
getColumn()方法已经被废弃):
exists方法:Table接口还提供了exists方法来快速查询某个数据是否存在,而
不需要获取该数据的所有值:boolean exists(Get get)
该方法的传参同样也是一个Get对象,但是exists方法不会返回服
务端的数据。不过使用这个方法并不会加快查询的速度,但是可以节省
网络开销。不过在你查询一个比较大的列的时候,可以有效地缩短网络
传输的时间。
Delete方法:删除指定的内容。
除了把整行删除掉,还可以更细粒度地删除数据,只需要在Delete对象上调用相应的方法,比如
addFamily(byte[] family):删除指定的列族。
addFamily(byte[] family, long timestamp):删除指定的列族中所有版本号等于或者小于给定的版本号的列。
addColumns(byte[] family, byte[] qualifier):删除指定列的所有版本。
addColumns(byte[] family, byte[] qualifier, long
timestamp):删除指定列的等于或者小于给定的版本号的所有版本。
addColumn(byte[] family, byte[] qualifier, long
timestamp):删除指定列的特定版本。
addColumn(byte[] family, byte[] qualifier):删除指定列的最新版本。
checkAndDelete方法:检查之前的列的内容是否改变,若没有改变则执行删除操作返回true,否则不执行删除操作返回false。
checkAndDelete(byte[] row, byte[] family, byte[] qualifier, byte[] value, Delete delete)
checkAndDelete(byte[] row, byte[] family, byte[] qualifier, CompareFilter.CompareOp compareOp, byte[]
value, Delete delete)
mutation方法
根据前面提到的方法,如果我们想在一行中添加一列的时候同时删
除另一列(Column),只能构建一个Put来新增列然后新建一个Delete
对象来删除另一列,这两个操作要分两步执行,而且这两步肯定不属于
一个原子操作,这样既麻烦又危险。Table接口提供了一个方法
mutateRow可以把这两个操作放到同一个原子操作内。
实际上这个方法可以放入任意多个操作,这些操作都可以放在一个
原子操作内完成。
checkAndMutate方法:与之前的check方法类似。
批量操作:
批量put操作:
插入失败的重试
对于插入失败的数据,