Hbase学习笔记

Hbase适合需对数据进行随机读操作或者随机写操作、大数据上高并发操作,比如每秒对PB级数据进行上千次操作以及读写访问均是非常简单的操作。交易历史纪录查询很适合用Hbase作为底层数据库。
https://blog.csdn.net/imgxr/article/details/80130075?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.nonecase&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1.nonecase HBase在滴滴出行的应用场景和最佳实践

概念

每个Regin是一个切片,多个Regin归一个ReginServer管

经常一起用的列放到一个family里面

KV如何组织很灵活

HFile写HDFS,容量是Hadoop的集群决定

构建在HDFS之上的、分布式的、面向列的开源数据库。只有普通的增删改查等操作,没有表之间的关联查询。

  1. 高效
    1.1 将随机读写转化为顺序读写,适应高并发写入。
    1.2 均衡效果好读写性能和机器数保持线性相关。
    1.3 行中没有保存数据的列,不占存储空间。

  2. 分布式特性
    2.1 基于HDFS、Zookeeper。
    2.2 一致性、可用性、分区容忍性。
    2.3 大数据存储。
    2.4 易拓展。

  3. HBase表的特点
    3.1 大
    一个表可以有数十亿行,上百万列。
    3.2 面向列
    面向列(族)的存储和权限访问,列(族)独立索引。
    3.3 稀疏
    对于为空(null)的列,并不占用存储空间,因此,表可以设计的非常稀疏。
    3.4 数据类型单一
    HBase中的数据类型都是字符串(string)。
    3.5 无模式
    每行都有一个可排序的主键和任意多的列,列可以根据需求动态增加,同一张表中不同的行可以有截然不同的列。

  4. HBase表查询
    通过单个Row Key访问;通过Row Key的range;全表扫描。

  5. 列族(Column Family)
    列族在创建表的时候声明,一个列族可以包含多个列,列中的数据都是以二进制形式存在,没有数据类型。
    列族是一些列的集合。
    一个列族所有列成员是有相同的前缀。比如,列courses:histor和courses:math都是列族courses的成员。冒号(:)是列族的分隔符,用来区分前缀和列名。

  6. HBase存储细节
    每个列族存储在HDFS上的一个单独文件夹中。
    Key和Version number会在每个列族中存储一份。
    空值不会被保存。

  7. 时间戳与存储单元(Timestamp and Cell)
    HBase中通过row和columns确定的为一个存储单元称为cell。每个cell都保存着同一份数据的多个版本。
    在写入数据时,时间戳可以由HBase自动赋值(当前系统时间精确到毫秒),也可以显示赋值。
    每个cell中,不同版本的数据按照时间的倒序排序。
    {row, column, version}元祖就是一个Hbase中的一个cell。

  8. HBase存储目录
    .tmp :临时目录
    WALs:是RegionServer在处理数据插入和删除的过程中用来记录操作内容的一种日志。
    data:核心目录,存储HBase表的数据
    data/default:在用户创建表的时候,没有指定namespace时,表就创建在此目录下。
    data/hbase:系统内部创建的表。
    hbase.id:存储的是集群的唯一的cluster id (uuid),就是一串uuid字符串。
    hbase.version:集群版本号。
    oldWALs:当WALs目录中的logs没有用之后,会将这些logs移动到此目录下,HMaster会定期的进行清理。

  9. HBase基础架构
    ZooKeeper、HMaster、HReginServer。

  10. namespace
    表和命名空间的隶属关系在在创建表时决定,通过以下格式指定:
    :

  11. 行存储和列存储
    Hbase学习笔记_第1张图片
    https://blog.csdn.net/dc_726/article/details/41143175 几张图看懂列式存储

内存结构

Hbase学习笔记_第2张图片

  1. RowKey:行键,可理解成MySQL中的主键列。

  2. Column:列,可理解成MySQL列。

  3. ColumnFamily:列族, HBase引入的概念:

将多个列聚合成一个列族。

可以理解成MySQL的垂直分区(将一张宽表,切分成几张不那么宽的表)。

此机制引入的原因,是因为HBase相信,查询可能并不需要将一整行的所有列数据全部返回。(就像我们往往在写SQL时不太会写select all一样)

对应到文件存储结构(不同的ColumnFamily会写入不同的文件)。

  1. TimeStamp:在每次跟新数据时,用以标识一行数据的不同版本(事实上,TimeStamp是与列绑定的。)

那我们为何会得到HBase的读写高性能呢?其实所有数据库操作如何得到高性能,答案几乎都是一致的,就是做索引。

HBase的设计抛弃了传统RDBMS关系数据库管理系统(Relational Database Management System)的行式数据模型,把索引和数据模型原生的集成在了一起。

一个行键映射一个列族数组,列族数组中的每个列族又映射一个列标识数组,列标识数组中的每一个列标识(Column Qualifier)又映射到一个时间戳数组,里面是不同时间戳映射下不同版本的值,但是默认取最近时间的值,所以可以看成是列标识(Column Qualifier)和它所对应的值的映射。用户也可以通过HBase的API去同时获取到多个版本的单元数据的值。Row Key在HBase中也就相当于关系型数据库的主键,并且Row Key在创建表的时候就已经设置好,用户无法指定某个列作为Row Key。

1,一个Table可以有多个Region,他们可以在一个相同的RegionServer上,也可以分布在不同的RegionServer上。,

2,一个Region由多个Store构成,每个Store对应了一个Table在这个Region中的一个Column Family,即每个Column Family就是一个集中的存储单元,因而最好将具有相近IO特性的Column存储在一个Column Family,以实现高效读取(数据局部性原理,可以提高缓存的命中率)。

3,Store是HBase中存储的核心,它实现了读写HDFS功能,一个Store由一个MemStore 和0个或多个StoreFile组成。

你可能感兴趣的:(学习笔记,hbase)