特点以及基本概念

  • 1、特点
  • 大表
  • 分布式
  • 多版本:VERSIONS
  • NoSQL: non-relational database
  • 2、概念
  • 基本存储
  • Hbase的概念以及逻辑结构
  • namespace:命名空间
  • table
  • rowkey:行键,它的功能就是MySQL中的主键的功能
  • column family:列族或者列簇
  • column:hbase表中的一列,任何一列都必须属于某个列族
  • VERSION:这是列族的一个属性,可以定义这个列族中的所有列可以存储几个版本的值,默认为1
  • Timestamp:时间戳,标记数据写入的时间
  • 逻辑结构
  • 3、列存储


1、特点

大表

  • 存储的容量非常大
  • 亿级别的行和百万级别的列

分布式

  • 分布式存储
  • 基于分布式内存:数据优先会读写分布式内存
  • 提供快速的读写
  • 基于分布式磁盘:Hbase底层依赖于HDFS
  • 提供数据的持久化

多版本:VERSIONS

  • 一般情况:表中的数据行和列决定一个值
  • mysql
  • 今年小明18岁
  • insert into table values(小明,18);
  • 到了明年,19岁了
  • update table set age = age + 1;
  • 查询小明
  • 小明 19
  • MySQL中有没有存储小明去年多少岁?
  • 没有的
  • 年龄这一列只存了一个值,新的值会覆盖老的值
  • Hbase中可以存储多版本
  • 设置小明的年龄可以存储多个版本:3个版本
  • 今年小明18岁
  • 小明 18 2020
  • 明年小明19岁
  • 小明 18 2020
  • 19 2021
  • 后年小明20岁
  • 小明 18 2020
  • 19 2021
  • 20 2022
  • 大后年小明21岁
  • 小明 19 2021
  • 20 2022
  • 21 2023
  • 默认只会显示最新的版本
  • 可以根据你的需求查询到任意存储的某个版本
  • 如何区分不同的版本,通过时间戳【系统默认使用数据插入时间】

NoSQL: non-relational database

  • RDBMS:关系型数据库
  • MYSQL、Oracle、PostgreSQL
  • NoSQL:非关系型数据库
  • Hbase、Redis、MongoDB
  • 共同点
  • 都是数据库,用于存储数据的
  • 都有数据库、表、行、列的概念,但是有些许的区别
  • 不同点
  • RDBMS
  • 一般用于存储结构化数据行和列是固定的
  • 支持SQL语句
  • 性能中规中矩,能存储中等大小的数据量,性能也是中等
  • NoSQL
  • 存储结构化或者半结构化数据,行和列可以是动态的
  • 一般都不支持SQL语句,每个NoSQL都有自己的操作命令
  • 每一种NoSQL都有自己的特点
  • 存储容量大,读写性能比RDBMS慢
  • 存储容量小,读写性能比RDBMS快的多
  • 存储容量大,基于内存存储,读写性能比RDBMS要快
  • 存储的数据格式都不同
  • Hbase:容量大、读写快,持久化存储
  • Redis:容量小、读写快,持久化存储

2、概念

基本存储

  • Hbase通过分布式将多台机器的内存在逻辑上进行了合并
  • 当我们写入数据到Hbase中,数据会写入某台机器的内存中
  • 当内存中的数据达到一定的条件,会写入HDFS,保存为文件
  • 内存中会存储新的数据
  • 当我们从 Hbase中读数据时,优先从内存中查找数据
  • 如果数据还在内存中,直接返回
  • 如果数据不在内存,肯定就在HDFS文件中
  • 第一次:会从HDFS文件中找到数据然后返回
  • 如果这个数据开启了缓存,第一次读取以后可以放入缓存
  • 第二次:直接从缓存中读取

Hbase的概念以及逻辑结构

概念

MySQL

Hbase

数据库

database

namespace


table

table


primary key:主键

rowkey:行键

列族

-

column family


column

column

多版本

-

VERSION

时间戳

timestamp

timestamp

namespace:命名空间

  • 类似于数据库的概念,用于区分表的存储,每张表必然属于某一个NameSpace
  • 就是Hbase中的数据库
  • 注意
  • Hbase的数据库是不能切换的

table

  • 访问Hbase中的表的时候,必须加上namespace的名称
  • namespace:tbname
  • 特例:default数据库中的表可以不加
  • 只要不加namespace来访问的表,就是default数据库中的表

rowkey:行键,它的功能就是MySQL中的主键的功能

  • 类似于主键的概念:用于唯一标记一行
  • 区别
  • 在MySQL中,一般有两种方式来设计主键
  • 方式一:会从数据中找一列,作为主键,唯一标记一行
  • stuId name age sex
  • stuId:作为主键
  • 方式二:用自增的一列作为主键
  • id name age sex
  • id是自增的一列作为主键
  • 可以没有主键
  • Hbase中的行键是非常独立的一列,任何一张Hbase表都必须有rowkey
  • 列名是定死的,就叫rowkey
  • 这一列的值是什么由你自己决定
  • 一定要有唯一性
  • hbase的表
  • rowkey name age sex
  • Rowkey的作用
  • 唯一标识一行
  • 顺序:将Hbase中每一行的数据根据Rowkey构建有序
  • 也作为Hbase中的唯一索引

column family:列族或者列簇

  • 本质的设计概念:就是分组
  • 拥有相似IO属性的列进行分组
  • 相似IO属性:要读一起读,要写一起写的列
  • Hbase中的任何一列都必须要属于某一个列族,rowkey除外
  • Hbase任何一张表至少要有一个列族
  • 分组由你自己决定
  • student表
  • basic:列族1
  • name
  • age
  • other:列族2
  • phone
  • address

column:hbase表中的一列,任何一列都必须属于某个列族

  • 如果访问某一列,必须加上列族的名称
  • cf:colname
  • Hbase表中的每一行都可以拥有不同的列
id		name			age
001		zhangsan		18

id		name			age		sex
002		lisi			20		male

id		name			age		phone
003		wangwu			20		110

VERSION:这是列族的一个属性,可以定义这个列族中的所有列可以存储几个版本的值,默认为1

  • 默认每一列都只有1个版本
  • 默认查询时,只显示每一列的最新的版本

Timestamp:时间戳,标记数据写入的时间

  • 也用于区分的不同的版本
  • 默认值就是数据的写入时间
  • 每一列都自带时间戳

逻辑结构

hbase发展和主要功能 hbase特点_数据

3、列存储

  • 传统的MySQL等数据库是按行存储的
  • 创建表的时候会定义列,每一行都有这些列
  • 每次插入一条数据,就是一行
  • insert into table values(001,小明,18,male,110,null);
  • 每次修改、查询、删除、都是对行进行操作的
  • update tbname set key=value where;
  • 按行更新
  • select * from tbname where
  • 按行查询
  • select id,name from tbname where;
  • 先从文件中将符合条件的行全部获取,然后再对每一行的列进行过滤
  • delete from table where ;
  • 按行删除
  • Hbase每一条数据都是按列操作
  • 每次操作:插入、删除、更新、都是对列进行操作
  • 插入:为某个Rowkey插入一列
  • 列是动态插入
  • 创建表的时候不用定义列
  • hbase表中每一行列都可以不一样
  • 删除:删除某个rowkey的某一列
  • 为什么要按列操作呢 ?
  • Hbase底层的存储就是按列存储
  • 一张表的一列的数据都存在一起
  • 大数据中处理数据都是按列进行处理
  • select id,name from tbname where;
  • 方案一:将所有行取出来,然后过滤每一行这两列
  • 按行存储
  • 方案二:从表的数据中直接取出这两列数据
  • 按列存储
  • Hbase能不能实现类似于MySQL这种架构?
  • 可以,让Hbase表的每一行都拥有相同的列
  • 颗粒度更细的一种数据的存储方式