特点以及基本概念
- 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:时间戳,标记数据写入的时间
- 也用于
区分的不同的版本
- 默认值就是数据的写入时间
- 每一列都自带时间戳
逻辑结构
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表的每一行都拥有相同的列
颗粒度更细的一种数据的存储方式