Hadoop HBase概念学习系列之模式设计(十)
Hbase与RDBMS的区别在于:HBase的Cell(每条数据记录中的数据项)是具有版本描述的(versioned),行是有序的,列(qualifier)在所属列簇(Column families)存在的情况下,由客户端自由添加。以下的几个因素是Hbase Schema设计需要考虑的问题:
1、 Hbase中没有joins的概念
大表的结构可以使得不需要joins,而解决这一问题。
注意:HBase中没有join的概念,但是,大表的结构可以使其不需要Join操作就能解决Join操作所解决的问题。
2、Row keys 设计
主键,在Region里按字母顺序来排序(byte数组存储)。
写入要分散,如订单表: order_id做逆排序后做rowkey,以便分布式存储,避免数据只保存在个别节点上。
多条件查询时,设为组合row key
注:读取数据只能按row key(及其range)或scan全表扫描,确保查询高效
3、列族CF设计
尽量少,建议CF数量在1-2个。
设计Hbase schema的时候,要尽量只有一个column family。
flush和compaction触发的基本单位都是Region级别。当一个CF有大量的数据的时候会触发整个region里面的其他CF的memstore(其实这些memstore可能仅有少量的数据,还不需要flush的)也发生flush动作;
另外compaction触发的条件是当store file的个数(不是总的store file的大小)达到一定数量的时候会发生,而flush产生的大量store file通常会导致compaction,flush/compaction会发生很多IO相关的负载,这对Hbase的整体性能有很大影响,所以选择合适的column family个数很重要。
案例1、学生表和课程表,多对多
关系数据库中设计:
HBase中:
Student 表
|
Row Key |
CF |
CF |
|
info |
course |
|
|
Student_id(reverse逆排序) |
Info:name Info:age Info:sex |
Course:c1 Course:c2 … |
Course表
|
Row Key |
CF |
CF |
|
info |
Student |
|
|
Course_id(reverse逆排序) |
Info:title Info:introduction Info:teacher_id |
Student:t1=student_id Student:t2 … |
案例2、person 和 身份证card表
关系数据库:
|
Person表 |
|
Pserson_id |
|
Name |
|
sex |
|
Card |
|
Card表 |
|
ID |
|
City_id |
HBase中:
Person表
|
Row Key |
CF |
|
info |
|
|
Person_id |
Info:name Info:sex Info:age Info:card |
……
案例2、订单order 和 订单明细表order_item,一对多
关系数据库中:
Order表
|
Order_Id |
|
Order_mount |
|
User_id |
|
City_id |
|
…. |
Order_item 表
|
Item_Id |
|
Order_Id |
|
Product_id |
|
Unit_price |
|
Order_num |
|
….. |
HBase 中:
方案一:
Order表
|
Row key |
CF |
|
info |
|
|
Order_Id |
Info: Order_mount Info:user_id Info:city_id ….. |
Order_item 表
|
Row key |
CF |
|
info |
|
|
Order_id-item_id |
Info: Order_mount Info:user_id Info:city_id Info:order_id ….. |
方案二:
Order表
|
Row key |
CF |
CF |
|
info |
item |
|
|
Order_Id |
Info: Order_mount Info:user_id Info:city_id Info:create_time ….. |
Item:i1<item_id> Item:i2 ….. |
Order_item 表
|
Row key |
CF |
|
info |
|
|
item_id |
Info: Order_mount Info:user_id Info:city_id Info:order_id ….. |
多条件查询时,需要增加一个index表
Row key为查询条件组合
|
Row key |
CF |
|
info |
|
|
[create_time]_[order_id]_[city_id] |
Info:order_id |
Hadoop HBase概念学习系列之模式设计(十)的更多相关文章
- Hadoop HBase概念学习系列之RowKey设计(二十九)
HBase里的RowKey设计,分为随机查询的RowKey设计和连续查询的RowKey设计.
- Hadoop HBase概念学习系列之优秀行键设计(十六)
我们通过行键访问HBase.尽管使用扫描过滤器可以一次性指明大量的键,但是HBase仅仅能够根据行键识别出一行. 优秀的行键设计可以保证良好的HBase性能. 1.行键存在于HBase中的每一个单元格 ...
- Hadoop HBase概念学习系列之HBase里的高表设计概念(表设计)(二十八)
在下面这篇博文里,我给各位博客们,分享了创建HBase表,但这远不止打好基础. HBase编程 API入门系列之create(管理端而言)(8) 在关系型数据库里,表的高表和宽表是不存在的.在如HBa ...
- Hadoop HBase概念学习系列之HBase里的宽表设计概念(表设计)(二十七)
在下面这篇博文里,我给各位博客们,分享了创建HBase表,但这远不止打好基础. HBase编程 API入门系列之create(管理端而言)(8) 在关系型数据库里,表的高表和宽表是不存在的.在如HBa ...
- Hadoop HBase概念学习系列之HBase里的时间戳(二十六)
HBase集群要求每个节点的时间必须同步.HBase对于节点的时间扭曲(time skew)容忍度很低(这和HDFS是不一样的). 这主要是因为HBase需要使用系统时间来产生时间戳.如果系统时间不同 ...
- Hadoop HBase概念学习系列之HBase里的长表VS宽表VS窄表(十五)
有时候啊,HBase表的设计方案通常,还会考虑如下一些因素,当然,这只是考虑范围里的部分呢. 更多的行还是更多的版本?后者使用了HBase自带的功能.但是需要在列簇中定义最大版本数,这样做可能有风险. ...
- Hadoop HBase概念学习系列之HBase里的客户端和HBase集群建立连接(详细)(十四)
需要遵循以下步骤: 1.客户端和Zookeeper集群建立连接.在这之前客户端需要获得一些信息(可以从HBase配置文件中读取或是直接指定).客户端从Zookeeper集群中读取-ROOT-表的位置信 ...
- Hadoop HBase概念学习系列之hbase shell中执行java方法(高手必备)(二十五)
hbase shell中执行java方法(高手必备),务必掌握! 1. 2. 3. 4. 更多命令,见scan help.在实际工作中,多用这个!!! API参考: http://hbase.apac ...
- Hadoop HBase概念学习系列之HBase的Shell(步骤非常清晰)(二十四)
这部分知识点,是必须要熟练玩转的! 见 5 hbase-shell + hbase的java api 的进入HBase Shell 强烈建议,先看我上面的这篇博文,是实实际际的步骤. 另外,附上一 ...
随机推荐
- Spring的@Scheduled任务调度
一. 定时任务实现方式 定时任务实现方式: Java自带的java.util.Timer类,这个类允许你调度一个java.util.TimerTask任务.使用这种方式可以让你的程序按照某一个频度执行 ...
- 【LeetCode题解】237_删除链表中的节点
目录 237_删除链表中的节点 描述 解法 思路 Java 实现 Python 实现 237_删除链表中的节点 描述 请编写一个函数,使其可以删除某个链表中给定的(非末尾)节点,你将只被给定要求被删除 ...
- kubernetes continually evict pod when node's inode exhausted
kubernetes等容器技术可以将所有的业务进程运行在公共的资源池中,提高资源利用率,节约成本,但是为避免不同进程之间相互干扰,对底层docker, kubernetes的隔离性就有了更高的要求,k ...
- histoty显示时间戳
设置Linux可以查看历史命令的执行时间 大家都知道Linux平台上,可以通过history命令查看最近所执行过的命令,但history命令默认所显示的只有编号和命令的,只知道命令是最近所执行 ...
- api.execScript
在指定 window 或者 frame 中执行脚本,对于 frameGroup 里面的 frame 也有效,若 name 和 frameName 都未指定,则在当前 window 中执行脚本,具体执行 ...
- 美图吴欣鸿:请不要叫我CEO
关于采访提纲上“对互联网+如何理解?”的问题能否不做回答? 他的说法听上去谦虚而实在,“我一般对于这种大的.有点政策性的问题其实是Hold不住的,我的谈话风格就是比较随性.感性,也很难说去推出一个很强 ...
- JavaScript 学习(一)
此篇为学习笔记 JS 简介 JavaScript 是一种轻量级的脚本编程语言JavaScript 是可插入 HTML 页面的编程代码.JavaScript 插入 HTML 页面后,可由所有的现 ...
- __block和__weak修饰符的区别
block下循环引用的问题 __block本身并不能避免循环引用,避免循环引用需要在block内部把__block修饰的obj置为nil __weak可以避免循环引用,但是其会导致外部对象释放了之后, ...
- Android基础知识你知道多少?
https://github.com/zhantong/interview/blob/master/Android/Android.md 四大组件是什么? 四大组件的启动方式? Activity生命周 ...
- Spring学习手札(三)理解IoC 拯救不开心
Inverse of Control,翻译成“控制反转”,是Spring的核心.IoC不是一种技术,而是一种设计思想.就是将原本在程序中手动创建对象的控制权(new Object() ),交由Spri ...