一
1.行和列的交叉点叫做单元格,单元格是版本化的(能有多个版本的数据).
2.单元格的内容也就是列的值是一个不可用分割的字节数组(Byte[]),并且以二进制存储
3.Hbase是没用数据类型的,任何列值都被转换成字节数组来存储
4.Hbase的表的一行数据是通过rowkey来区分的
5.Hbase的行是通过rowkey排序的,排序是按照字典排序,从小到大
6.(逻辑)Hbase的存储格式 列族:列:属性 ,这样存储的,可以当成一个无限嵌套的MAP数据结构
7.(物理)Hbase的物理存储,Hbase的表是按列来分开存储的,Hbase的列是按列族来分组的
HFile是面向列来存储的,一个列族里面的多个列分别存放在不同的HFile里面,重要的是一个列族的数据会被同一个Region管理
8.Hbase的空白Cell(单元格)是不存储的.
9.查询Hbase的值得时候,返回的都是最新数据
二
10.Hbase的表名是作为HDFS的存储路径的一部分来使用的,所有必须符合文件名规范
11.Hbase的表在HDFS上面都是单独的目录结构
12.Hbase的表有可能是存放在不同的分区,也就是不同的Region
13.每一个Region只在一个RegionServer上提供服务,而Region直接向客户端提供存储和读取服务
14.访问Hbase并不需要账号密码,只需要拷贝一个hbase-site.xml 配置文件到自己的项目里面,Hbase的API就会自动读取Hbase的连接
15.Hbase的创建链接是一个非常消耗时间的事情,但是Hbase已经提供好链接池的API给我们了.
16.rowkey的排序还按照 二进制字节从左到右来逐一对比,形成次序
17.同一个列族的列都是存放在一起的,所有存放的优化策略都是正对列族的
18.需要添加列族的时候,可以动态添加,但是需要修改列族的时候必须先使用命令停用表.
19.Hbase列族尽量少,并且把常用的列字段放到用一个列族里面,跨列族访问数据是非常低效的
20.Hbase的时间戳是64位整数,可以通过客户端写入数据的时候赋值,也可用痛过RegionServer自动赋值
三 数据库的操作
21.Hbase对数据模型只要有4个操作,Get,Scan,Put,Delete
22.创建HTable类实例是有代价的,每个实例都需要扫描.META.表,以检查该表是否存在,是否可用
23.如果用户需要使用多个HTable实例,应该考虑用到HTablePool,它可以复用多个Htable实例
24.Get类,Get类的操作默认可以返回全部列的数据,也可以指定返回某些列的数据,使用HTbale.get(new Get()) 获取数据的时候
会返回一个Result实例给用户,用户可以解析Result获取里面的值
Get内部也是使用Scan进行查询数据的,Get查询数据的时候会返回最新的版本
25.Put类,Put类可以进行新增一行数据的操作,也可以进行更新一行数据的操作,而且Put类的方法支持一次性把一个集合的数据入库
如果要频繁修改某些行的数据的时候,需要用到RowLock 锁,防止其他用户进行修改这个数据
Put类既做Insert 也做 Update操作
Put类操作每次都会发一起一次RPC操作到服务器,如果大量数据写入表的话,就有数千次RPC操作,这样效率就很低,所以不适合大量 数据的入库
Put类有一个缓冲区,负责把大量的数据批量仅通过一次RPC发送到服务器.
Put集合到服务端的时候,可能会出现一部分数据失败,失败数据存放在缓冲区进行重试
26.Hbase提供了compare-and-set的操作,这个操作先检查条件满足再执行,这个操作对于行来说就是原子性的
27.Scan类,Scan类就是扫描数据,可以用过startRow和stopRow来指定扫描的范围,通常配合过滤器来使用,可以很灵活的控制获取那些数据
Scan类获取数据后把数据集封装在ResultScanner实例里面
28.Delete类,Delete类用于删除数据,和Htable的delete方法类似,不过能通过更多条件和方式去删除列
例如:删除某个列族,某个列,某个时间戳,删除某个比这个时间更早的数据
当然,Hbase的Delete类删除数据,并不是真正地从磁盘把数据删除掉,而且通过墓碑(tombstones)进行标记处理
这些被标志了墓碑的值会和小于该数据版本的单元格在合并(major compact)时被删除.
四 Hbase的特有性
29.版本的意义 rowkey + Column + Version 组合起来就是一个Hbase的单元格,version就是一行的版本号
Version使用一个长整形来表示的,这个是用java.util.Date.getDate() 或者 System.currentTimeMillis() 产生的,而且版本号是倒序排序的,所以读某一个单元的数据,是最新的原因就是这样了
30. 含版本的操作,Get类的setMaxVersions()可以返回2个版本以上,也可以通过setTimeRange(),它可以指定返回指定时间范围内的columns数据
Get.setMaxVersion() ,默认是最新的
Get.setMaxVersion(3) ,返回最后3个版本
31.Delete删除分3种类型,1.Delete:删除列的指定版本 2.Delete Column 删除列的所有版本 3.Delete Family 删除特定列族所有列
32.Hbase 实有 ACID的,能确保数据的原子性
33.行锁,RegionServer提供了行锁特性,这个特性保证了只有一个客户端能获取一行数据锁,同时可以对改行进行修改
34.自动分区,Hbase一个表的数据会被划分成多个Region,Region可以动态扩展并且保证Hbase的负载均衡
多个Region汇合成一个大的Region,以减少HDFS上存储的文件数量
35.创建表的时候,被会一个Region管理者,随着数据的扩大,达到了Region上限的配置值时,Region会按照中间键拆分出 2个
大致相等的Region.
36.每一个Region都会被一个RegionServer管理,一个RegionServer管理着多个Region.
37.一个RegionServer一台机器,里面有多个Region,Region分配的规则是按照字典顺序分割rowkey进行排序后,存储在不同的RegionServer上
38.每一个RegionServer大概可以管理者100~1000个Region,每一个大小大概是1~20G
39.Region的拆分和转移都是Hbase自动完成的,当一个RegionServer出现问题的时候,Region会快速转移到其他服务器上面
当Region进行拆分的时候,首选Region下线(offline), 拆分后新的Region再上线(online),这一系列的东西速度很快,不会对数据的读写有影响的