超详细知乎hbase入门
https://zhuanlan.zhihu.com/p/145551967?utm_source=wechat_session
博客文章:https://blog.youkuaiyun.com/lzxlfly/article/details/82229511
读写流程
https://blog.youkuaiyun.com/qq_43193797/article/details/86601182
一、Hbase简介
Hbase是一个高可靠性、高性能、面向列、可伸缩、实时读写的分布式数据库。依托Hadoop-HDFS作为其文件存储系统,利用MapReduce来处理海量数据,用Zookeeper作为其分布式协同服务,主要用来存储非结构化和半结构化的松散数据(列存 NoSQL 数据库)。
HBase在HDFS之上提供了高并发的随机写和支持实时查询,这是HDFS不具备的。
二、 Hbase数据模型
Hbase是面向列簇的数据库
表结构创建的时候不需要先指定列,指定列簇。列在列簇下动态增加,不需要指定。
- 存储模型分布
- 在HBase里边,定位一行数据会有一个唯一的值,这个叫做行键(RowKey)
- Rowkey相之于关系型数据库的话,就相当于一个主键。
- 一行数据由一个行键和一个或多个相关的列以及它的值所组成
单元格(cell)
(1)cell由行和列的坐标交叉决定;
(2)单元格是有版本的;
(3)cell的内容是未解析的字节数组;
(4)cell由{row key, column( =<family> +<qualifier>), version} 唯一确定的单元。
(5)cell中的数据是没有类型的,全部是字节码形式存贮。
Rowkey
(1)决定一行数据,按行检索数据,相当于一级索引
(2) 按照字典顺序排序的,说明数据是有序的
(3)只能存储64k的字节数据,RowKey越短越好
时间戳(Timestamp)
(1)在HBase每个cell存储单元对同一份数据可以有多个版本,根据唯一的时间戳来区分每个版本之间的差异,不同版本的数据按照时间倒序排序,最新的数据版本排在最前面。
(2)时间戳的类型是 64位整型,一般由HBase(在数据写入时自动)赋值,此时时间戳是精确到毫秒的当前系统时间。
时间戳也可以由客户显式赋值,如果应用程序要避免数据版本冲突,就必须自己生成具有唯一性的时间戳。
列族(Column Family)
(1)HBase表中的每个列都归属于某个列族,列族必须作为表模式(schema)定义的一部分预先给出。如 create ‘tb’, ‘f’;
列名以列族作为前缀,每个“列族”都可以有多个列(column);如f:a, f:b, 新的列族成员(列)可以随后按需、动态加入;
(2)权限控制、存储以及调优都是在列族层面进行的;
(3)HBase把同一列族里面的数据存储在同一目录下,由几个文件保存。
2、列簇说明
3、region
4、与关系型数据库对比
三、部署安装
https://segmentfault.com/a/1190000015305292
四、表操作命令
Shell客户端登录
Create直接回车就是查看命令帮助信息
hbase(main):001:0> create 'test','info'
hbase(main):002:0> put 'test','0001','info:username','henry'
hbase(main):003:0> put 'test','0001','info:age','18'
hbase(main):005:0> scan 'test'
hbase(main):006:0> describe 'test'
删除表,先禁用disable
hbase(main):007:0> disable 'test'
hbase(main):008:0> is_enabled 'test'
hbase(main):009:0> drop 'test'
hbase(main):015:0* count 'test'
hbase(main):018:0> get 'test','0001','info:username'
hbase(main):024:0* get 'test','0001'
hbase(main):027:0> delete 'test','0001','info:age'
hbase(main):029:0> truncate 'test'
五、hbase的存储模式
什么是行式存储和列式存储
行式存储:数据以行为单位,每一行包含了很多列,存完一行又跳到第二行继续存
列式存储:数据以列为单位,把每一列聚合在一起去存储。第一列存完之后存第二列,每一列有一个存储的位置,保证所有的列存储在一起
特点
行式存储:维护大量的索引,存储成本比较高。不能做到线性扩展,但是随机读的效率非常高,最大的特点是对事物处理能力非常好。
列式存储:根据同一列数据的相似性原理,利于对数据进行压缩,存储成本比较低。由于每列数据都是分开存储的,所以查找不同列的数据的时候,可以用并行高效查询不同列的数据。
应用环境
列式存储:对于单列或者相对比例少的列获取频率较高。事物使用率不高,读取场景频率不高,数据量非常大,随机更新某些行的频率也不高
行式存储:表与表之间有很强烈的关系型,写数据量不大,利用外键去实现表与表之间的关联。最大的优势是联机事物处理能力,只有千万级数量可以考虑行式存储
列族式存储的概念
列族是多列的组合,每个列都有所属列族,列族是表的scheme的一部分。列不是scheme的一部分,访问控制,磁盘和内存使用统计都是列族层面上进行的。
访问单元是列,这样设计的前提是某些列族的所有列经常是需要一起访问的,所以才会使得数据存储是最优的
Hbase table的组成
Table = rowkey + family + colume + timestamp + value
Rowkey是行键,标识唯一一行数据。一个rowkey中包含很多个列族,每个列族又包含了多个列,每一列数据包含了一个版本加上数据本身的值
数据存储模式
(Table,rowkey ,family,colume,timestamp) -> value
Hbase表结构是key-value结构的,前面的构成了一个key,对应了用户所存储的一个值。
列数据属性
默认一列数据可以保存三个版本,对于聊天应用特别方便,聊天记录是已读、未读等属性
数据存储原型
底层存储上是怎么维护数据的。简单理解就是,rowkey按照字典排序,如果rowkey相同那就根据column按照字典顺序排序
五、数据表解析
· 表名字叫做’demo:user’
· NAME 列族名字是 f1,记住建表一定要指定列族名
· VERSION 是Hbase的表保存的数据版本数,默认保存3个版本
· REPLICATION_SCOPE 值可以为0或者1,0代表不复制,1代表启用复制
· COMPRESSION_COMPACT,COMPRESSION 是表的压缩类型
压缩特性使用cpu资源换取磁盘资源,对于读写性能不会有太大的影响
六、数据存储目录解析
数据存储目录结构
.tmp目录,当对表创建或者删除操作的时候,会将表移动到tmp,然后再去做处理的表,是一个临时交换的表,临时存储一些当前需要修改的数据结构
WALs, 预写日志,被HLog实例管理的WAL文件
可以理解为存储HBase的日志,HBase分布式数据库系统的操作日志
archive,存储表的归档和快照,hbase再做表分割合并等操作完成之后会将hfile文件移动这目录中,然后将之前的hfile目录删除掉,这个目录是由master定时任务定期去处理的一个目录,维护和管理hbase存储的数据。
courrupt,存放损坏的日志文件,一般是空的。
data,存储数据的核心目录,系统表数据和用户表数据都存储在这
hbase.id,标识hbase进程用的唯一id
hbase.version,文件格式版本信息,其实就是表明了hfile的版本信息
old WALs,WALs 中的文件被持久化之后呢,就被移动到这个目录来等待删除
用户表数据存储目录结构
创建了一个test表
test:tabledesc表元信息目录
tableinfo:表元信息的具体文件
.tmp:中间临时数据,表元信息被更新的时候这个目录才会被用到
regioninfo:包含了对应region的序列化信息,由于当前只有一个region,所以只有一个regioninfo。就可以认为是表数据的元信息的目录信息
cf:test表的列族,包含所有列族的数据目录。其实就是hfile文件
hbase元信息表
hbase的元数据表为’hbase:meta’,存储在ZooKeeper上面。它也是一张普通的hbase表。它的结构如下:
region是存储数据的最基本单元
Key:
table,key,time 三个部分的组合。因为Hbase根据rowkey排序,所有可用很快的找打对应的表
Values: 指向的是region server指向的region
info:regioninfo 对于region的基本信息存储,平时基本上用不到
info:server region服务器的地址和端口,这样就可以找到服务器
info:serverstartcode 数据校验的时候才用得到的
里面的值也是会进行变化的。RegionServer挂掉,它也会及时的更新,Hbase表相当于Hbase的第一级索引,是Hbase最重要的系统表。