大数据学习(17)—— HBase表设计
为啥要把表设计拿出来独立成章?因为我觉得像我这样搞了很多年Java后端开发的技术人员,在学习HBase的时候,会受到关系型数据库3NF、BCNF的影响。事实上,数据库范式在HBase里完全没用,必须转变思想。因此把这一点单独写出来,供类似情况的技术人员参考。
HBase逻辑视图

这个图看起来像是Excel表格,不同的是,它的一个单元格可以有多个版本的数据,这是HBase的多版本特性,默认版本数是1。实际存储格式是每个单元格一行记录,如下图。
hbase(main):003:0> scan 'test'
ROW COLUMN+CELL
rowkey1 column=cf:level, timestamp=1608108298860, value=P9
rowkey1 column=cf:name, timestamp=1607677762394, value=guanyu
rowkey2 column=cf:salary, timestamp=1607328820620, value=200w
rowkey3 column=cf:corp, timestamp=1607330730061, value=Alibaba
rowkey4 column=cf:name, timestamp=1607331563986, value=XiaoYaoZi
4 row(s)
Took 1.7952 seconds
我们再来看看存放在HDFS里的hfile文件内容。
[hadoop@server01 hadoop]$ hbase hfile -p -f /hbase/data/default/test/bc89689612a0269a2216349bd23133ec/cf/c66c7553a5d6488a9e1e57ca2b0a5577
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/usr/hadoop-3.3.0/share/hadoop/common/lib/slf4j-log4j12-1.7.25.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/usr/hbase-2.2.6/lib/client-facing-thirdparty/slf4j-log4j12-1.7.25.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual binding is of type [org.slf4j.impl.Log4jLoggerFactory]
2020-12-16 18:30:46,116 INFO [main] metrics.MetricRegistries: Loaded MetricRegistries class org.apache.hadoop.hbase.metrics.impl.MetricRegistriesImpl
K: rowkey1/cf:level/1608108298860/Put/vlen=2/seqid=27 V: P9
K: rowkey1/cf:name/1607677762394/Put/vlen=6/seqid=14 V: guanyu
K: rowkey2/cf:salary/1607328820620/Put/vlen=4/seqid=0 V: 200w
K: rowkey3/cf:corp/1607330730061/Put/vlen=7/seqid=0 V: Alibaba
K: rowkey4/cf:name/1607331563986/Put/vlen=9/seqid=0 V: XiaoYaoZi
Scanned kv count -> 5
这个文件可以很明显地看出,它是一个键值存储系统,键包含rowkey、列族、列名(列标识符)、时间戳、数据类型(Put、Delete)、字符数组长度、seqid。值就是单元格存储的值。
这个键占用了大量的空间,而且不同数据它们的列族列名完全是一样的,太浪费空间了,这就需要用到HBase的压缩,压缩方式请自行查看官网。
seqid是个什么东西?百度了一下,可能是一个时间序列的标识,提示老的HLog是否可以删除。
HBase表设计原则
- 行键根据需求来设计,尽量短,尽量只调用一次API就可以完成需求。
- HBase原生语法不支持表join操作,适当使用冗余来简化查询操作。
- 列名(列标识符)可以存储数据,每一条记录的列名可以完全不同,但是尽量短。
表设计实战
以微博关注为例来做一个小小的表设计,可能与微博实际不符,仅用于说明设计方法。
关注关系如下:
景天关注重楼、龙葵、雪见
飞蓬关注景天、重楼
重楼关注飞蓬、紫萱
龙葵关注景天
雪见关注景天
紫萱关注雪见
这是一个多对多的关系,如果是关系型数据库,至少要两张表来存放。一张表存放人物信息,一张表存放人物关注关系。
时刻要想到,HBase没有join操作,只能用一张表来存放关注和被关注的信息,这肯定会存在数据冗余。不要怕,HBase可以支持十亿级别的列和百万级别的行,冗余不是问题。
我们可以这么设计
| 行键 | 列族cf1(关注谁) | 列族cf2(被谁关注) |
| 001_景天 | cf1:003=重楼,cf1:004=龙葵,cf1:005=雪见 | cf2:002=飞蓬,cf2:004=龙葵,cf2:005=雪见 |
| 002_飞蓬 | cf1:001=景天,cf1:003=重楼 | cf2:003=重楼 |
| 003_重楼 | cf1:002=飞蓬,cf1:006=紫萱 | cf2:001=景天,cf2:002=飞蓬 |
| 004_龙葵 | cf1:001=景天 | cf2:001=景天 |
| 005_雪见 | cf1:001=景天 | cf2:001=景天,cf2:006=紫萱 |
| 006_紫萱 | cf1:005=雪见 | cf2:003=重楼 |
是不是惊呆了,这都什么玩意。这种设计可以只用一次API调用就查出每个人关注了谁,每个人被谁关注了,按照需求来合理设计。
大数据学习(17)—— HBase表设计的更多相关文章
- HBase学习——3.HBase表设计
1.建表高级属性 建表过程中常用的shell命令 1.1 BLOOMFILTER 默认是 NONE 是否使用布隆过虑及使用何种方式,布隆过滤可以每列族单独启用 使用HColumnDescriptor. ...
- 大数据学习笔记——HBase使用bulkload导入数据
HBase使用bulkload批量导入数据 HBase可使用put命令向一张已经建好了的表中插入数据,然而,当遇到数据量非常大的情况,一条一条的进行插入效率将会大大降低,因此本篇博客将会整理提高批量导 ...
- 大数据学习笔记——Hbase高可用+完全分布式完整部署教程
Hbase高可用+完全分布式完整部署教程 本篇博客承接上一篇sqoop的部署教程,将会详细介绍完全分布式并且是高可用模式下的Hbase的部署流程,废话不多说,我们直接开始! 1. 安装准备 部署Hba ...
- 大数据学习(16)—— HBase环境搭建和基本操作
部署规划 HBase全称叫Hadoop Database,它的数据存储在HDFS上.我们的实验环境依然基于上个主题Hive的配置,参考大数据学习(11)-- Hive元数据服务模式搭建. 在此基础上, ...
- 大数据学习(13)—— HBase入门
从这一篇起,开始介绍HBase相关知识.还是一样,大数据的学习,获取官网知识很重要.官网看这里Apache HBase HBase简介 Apache HBase is the Hadoop datab ...
- 大数据学习系列之五 ----- Hive整合HBase图文详解
引言 在上一篇 大数据学习系列之四 ----- Hadoop+Hive环境搭建图文详解(单机) 和之前的大数据学习系列之二 ----- HBase环境搭建(单机) 中成功搭建了Hive和HBase的环 ...
- 大数据学习系列之九---- Hive整合Spark和HBase以及相关测试
前言 在之前的大数据学习系列之七 ----- Hadoop+Spark+Zookeeper+HBase+Hive集群搭建 中介绍了集群的环境搭建,但是在使用hive进行数据查询的时候会非常的慢,因为h ...
- 大数据学习系列之—HBASE
hadoop生态系统 zookeeper负责协调 hbase必须依赖zookeeper flume 日志工具 sqoop 负责 hdfs dbms 数据转换 数据到关系型数据库转换 大数据学习群119 ...
- 大数据学习day26----hive01----1hive的简介 2 hive的安装(hive的两种连接方式,后台启动,标准输出,错误输出)3. 数据库的基本操作 4. 建表(内部表和外部表的创建以及应用场景,数据导入,学生、分数sql练习)5.分区表 6加载数据的方式
1. hive的简介(具体见文档) Hive是分析处理结构化数据的工具 本质:将hive sql转化成MapReduce程序或者spark程序 Hive处理的数据一般存储在HDFS上,其分析数据底 ...
随机推荐
- 管理后台Vue
管理后台 遇到的问题 搭建 基于vue 3.0 Vue CLI 4.x Ant Design Vue 2.0 搭建后台管理系统 Ant Design Vue 2.0 npm i --save ant- ...
- div和img垂直居中的方法
div垂直居中可以使用height和line-height,多个div的话就不适用了. 可以使用下面的方式垂直居中 <div class="parent"> <d ...
- Go语言Slice作为函数参数详解
Go语言Slice作为函数参数详解 前言 首先要明确Go语言中实质只有值传递,引用传递和指针传递是相对于参数类型来说. 个人认为上诉的结论不对,把引用类型看做对指针的封装,一般封装为结构体,结构体是值 ...
- .NET 云原生架构师训练营(设计原则与模式)--学习笔记
在复杂系统的架构设计中引入设计原则与模式,能够极大降低复杂系统开发.和维护的成本 目录 几个问题 为什么要学习设计模式 优良架构设计的具体指标 理解复杂系统 面向对象思想(指导复杂系统的分析.设计.实 ...
- Java常见面试题 非常实用【个人经验】
必收藏的Java面试题 目录 Java 面试题 一.容器部分 二.多线程部分 三.SpringMvc部分 四.Mybatis部分 五.MySQL部分 六.Redis部分 七.RabbitMQ部分 八. ...
- 105、如何使用u盘制做linux镜像
105.1. 105.2. 105.3. 105.4.
- 01_JVM与Java体系结构
JVM发展历程 Sun Classic VM Exact VM 为了解决上一个虚拟机问题,jdk1.2时,sun提供了此虚拟机. Exact Memory Management:准确式内存管理 SUN ...
- MySQL主从异常恢复
说明 MySQL主从出现不同步的情况时,或者要添加新的从库时,可以使用以下方法进行操作回复主从. 停止业务应用 停止所有连接到主从库上的应用,在恢复主从期间禁止任何增删改等操作,否则恢复失败 停止主从 ...
- Hadoop:Hadoop的安装
CentOS7安装Hadoop需要有JDK,所以先下载安装JDK后,在进行安装Hadoop 下载Hadoop #联网状态下使用wget命令 wget http://archive.apache.org ...
- Message /index.jsp (line: [17], column: [45]) The JSP specification requires that an attribute name is preceded by whitespace
Error: Message /index.jsp (line: [17], column: [45]) The JSP specification requires that an attribut ...