开发者学堂课程【HBase入门教程:HBase 原理_2】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/397/detail/5062
HBase 原理_2
一、HBase 数据模型
Row Key (唯一确定一行数据) |
Time Stamp (数据版本) |
CF1 (列族) |
CF2 |
CF3 |
“com.cnn.www” |
t6 |
|
CF2:q1=val3 (单元格) |
CF3:q4=val4 |
t5 |
|
|
|
|
t3 |
CF1:q2=val2 |
|
|
注意,Row Key 在 HBase 中不可重复,它唯一标识着一行数据。
Time Stamp 是时间戳,也是版本,对应的每一个 cell 的数据的版本。
CF1、CF2、CF3叫做列族,多个列的一个组合,这里面有些空格。列式和行式的区别:如果对应的没有数据是应该不画出来的,为了好看画出来了。在 HBase 里对应的三个单元格,每一个单元格,这个单元格里是 CF2列族里 q1这一列对应的值是 val3,CF1、CF3同理。
一个单元格需要有几个元素才能确定?
Row key、在 HBase 里每一个列都属于一个列族的,在描述列时,前面一定要带它是属于哪一个列族,对应的这边列和列族都需要,前面 Time Stamp 是版本,对于这一个单元格可能有多个版本。这才能唯一确定一个单元格的数据。在一行数据里有三个版本,分别是 t5、t3、t6
版本写的是 Time Stamp,一般默认来描述这个版本是根据时间戳来描述的。
1.Row Key:
Row key 唯一决定一行数据,类似于组件。
Row Key 会按照字典型顺序来进行排序。HBase当中存储的数据一定是有序的,它在存储时,只要插入一条数据它就会按照字典顺序找到该插入到哪一条就插入到哪,所以说 HBase 里数据一定是有序的。
Row Key 的长度,Row Key 最多能存储64节,它是一个字节数据,Row Key 的存储有一个上限,只有64k,在做HBase 设计时,Row Key 尽量是短一些,简单一些。到 Row Key 如果设计特别长,这个存储上限有限制,最大只能存储64k。Row Key 是字节数据,HBase 可以存储哪一部分数据?理论上 HBase 任何数据都能存储,只要按照它的规则来。规则:一定要把它转换成字节数组,在 java 里任何数组都可以转化成字节数组来处理,假如往 HBase 里存一张图片,应该先把图片读出来才可以转换成字节数组,往单元格里存电影也可以存把它转换成字节数组。
2.列族:
是列的家族,列的集合,定义某一个列,必须以列族作为前缀,假如现在有个表,有一个 math 列一个 engish 列,但是注意光写列是没有意义的,要加一个列族:,这样来说明;在定义表的时候一定要把这个列族给指定好,后面根据要求,列族可以进行添加,但是在定义表时必须指定一个,创建表的语句:create‘test’,‘course’,test 是表名,course 是列族。
权限控制、存储、调优都是在列族层面进行的;
同一个列族的数据都是存储在同一个列族下,具体有几个文件就看存储的数据量了,数据越多,文件就越多,小文件不利于存储操作,所以小文件也会进行合并。
3.时间戳:
之前 HDFS 时,不建议使用修改这个操作。HBase 怎么处理的?在 HDFS 实现修改这个功能可以先上传一份,再重新修改完本地上传实现修改的功能,在 HBase 里它不像关系型数据库,通过 Timestamp 或者版本,在 HBase 里每一个单元格对应的都有一个版本,假如 CF1列族1下面有一个 name 列,第一次插入 zhangsan,同一行往 name 里插入zhangsan,插入时对应有个时间戳来描述版本,假如在插入一个 lisi,这时会把数据覆盖掉吗?不会,它会在上边插入一个 lisi 然后再记录一个版本。这样的操作达到了修改的功能。每次都插入一个最新的版本就是一个修改的功能。
每一份数据都有多个版本,按照时间倒序来排序,最新的版本一定在最前面
4.Cell 单元格
由行和列的坐标交叉决定;
单元格是有版本的,默认版本是时间戳;
单元格的内容是未解析的字节数组;
单元格的描述:由 frow kev,columm(=+),version)唯一确定的单元。cell 中的数据是没有类型的,全部是字节码形式存贮。