【DB】HBase的基本概念

【DB】HBase的基本概念

大家好,又见面了,我是全栈君。

一 Hbase是个啥东东? 
在说Hase是个啥家伙之前,首先我们来看看两个概念。面向行存储和面向列存储。面向行存储。我相信大伙儿应该都清楚,我们熟悉的RDBMS就是此种类型的。面向行存储的数据库主要适合于事务性要求严格场合,或者说面向行存储的存储系统适合OLTP。可是依据CAP理论,传统的RDBMS。为了实现强一致性,通过严格的ACID事务来进行同步,这就造成了系统的可用性和伸缩性方面大大折扣。而眼下的非常多NoSQL产品,包含Hbase,它们都是一种终于一致性的系统,它们为了高的可用性牺牲了一部分的一致性。好像。我上面说了面向列存储,那么究竟什么是面向列存储呢?Hbase,Casandra,Bigtable都属于面向列存储的分布式存储系统。

看到这里,假设您不明确Hbase是个啥东东,不要紧,我再总结一下下:

Hbase是一个面向列存储的分布式存储系统。它的长处在于能够实现高性能的并发读写操作,同一时候Hbase还会对数据进行透明的切分,这样就使得存储本身具有了水平伸缩性

二 Hbase数据模型 
HBase,Cassandra的数据模型很类似。他们的思想都是来源于Google的Bigtable,因此这三者的数据模型很类似,唯一不同的就是Cassandra具有Super cloumn family的概念,而Hbase眼下我没发现。好了。废话少说。我们来看看Hbase的数据模型究竟是个啥东东。

在Hbase里面有以下两个基本的概念,Row key,Column Family。我们首先来看看Column family,Column family中文又名“列族”,Column family是在系统启动之前预先定义好的,每个Column Family都能够依据“限定符”有多个column.以下我们来举个样例就会很的清晰了。

假如系统中有一个User表。假设依照传统的RDBMS的话。User表中的列是固定的,比方schema 定义了name,age,sex等属性。User的属性是不能动态添加的。可是假设採用列存储系统。比方Hbase。那么我们能够定义User表,然后定义info 列族。User的数据能够分为:info:name = zhangsan,info:age=30,info:sex=male等。假设后来你又想添加另外的属性。这样非常方便仅仅须要info:newProperty就能够了。

或许前面的这个样例还不够清晰,我们再举个样例来解释一下。熟悉SNS的朋友,应该都知道有好友Feed,一般设计Feed,我们都是依照“某人在某时做了标题为某某的事情”,可是同一时候一般我们也会预留一下keyword,比方有时候feed或许须要url,feed须要image属性等,这样来说。feed本身的属性是不确定的。因此假设採用传统的关系数据库将很麻烦。况且关系数据库会造成一些为null的单元浪费,而列存储就不会出现这个问题。在Hbase里,假设每个column 单元没有值,那么是占用空间的。

以下我们通过两张图来形象的表示这样的关系:

【DB】HBase的基本概念

上图是传统的RDBMS设计的Feed表,我们能够看出feed有多少列是固定的,不能添加,而且为null的列浪费了空间。

可是我们再看看下图。下图为Hbase,Cassandra,Bigtable的数据模型图,从下图能够看出,Feed表的列能够动态的添加。而且为空的列是不存储的,这就大大节约了空间,关键是Feed这东西随着系统的执行。各种各样的Feed会出现,我们事先没办法预測有多少种Feed,那么我们也就没有办法确定Feed表有多少列,因此Hbase,Cassandra,Bigtable的基于列存储的数据模型就很适合此场景。讲到这里,採用Hbase的这种方式。另一个很重要的优点就是Feed会自己主动切分。当Feed表中的数据超过某一个阀值以后。Hbase会自己主动为我们切分数据,这种话,查询就具有了伸缩性。而再加上Hbase的弱事务性的特性,对Hbase的写入操作也将变得很快。

【DB】HBase的基本概念

上面说了Column family。那么我之前说的Row key是啥东东,事实上你能够理解row key为RDBMS中的某一个行的主键。可是由于Hbase不支持条件查询以及Order by等查询,因此Row key的设计就要依据你系统的查询需求来设计了额。我还拿刚才那个Feed的列子来说,我们通常是查询某个人最新的一些Feed,因此我们Feed的Row key能够有下面三个部分构成<userId><timestamp><feedId>,这样以来当我们要查询某个人的最进的Feed就能够指定Start Rowkey为<userId><0><0>。End Rowkey为<userId><Long.MAX_VALUE><Long.MAX_VALUE>来查询了,同一时候由于Hbase中的记录是依照rowkey来排序的,这样就使得查询变得很快。

三 Hbase的优缺点 
1 列的能够动态添加,而且列为空就不存储数据,节省存储空间.

2 Hbase自己主动切分数据。使得数据存储自己主动具有水平scalability.

3 Hbase能够提供高并发读写操作的支持

Hbase的缺点:

1 不能支持条件查询。仅仅支持依照Row key来查询.

2 临时不能支持Master server的故障切换,当Master宕机后,整个存储系统就会挂掉.

关于数据库伸缩性的一点资料:
http://www.jurriaanpersyn.com/archives/2009/02/12/database-sharding-at-netlog-with-mysql-and-php/

http://adam.blog.heroku.com/past/2009/7/6/sql_databases_dont_scale/

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/115519.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • MySQL对group by原理和理解

    MySQL对group by原理和理解写在前面的话:用了好久groupby,今天早上一觉醒来,突然感觉groupby好陌生,总有个筋别不过来,为什么不能够select*fromTablegroupbyid,为什么一定不能是*,而是某一个列或者某个列的聚合函数,groupby多个字段可以怎么去很…

    2022年5月26日
    34
  • 深度图像基础知识(一)[通俗易懂]

    深度图像基础知识(一)[通俗易懂]深度图像(depthimage)也被称为距离影像(rangeimage),是指将从图像采集器到场景中各点的距离(深度)作为像素值的图像,它直接反映了景物可见表面的几何形状。深度图像经过坐标转换可以计算为点云数据,有规则及必要信息的点云数据也可以反算为深度图像数据。深度数据流所提供的图像帧中,每一个像素点代表的是在深度感应器的视野中,该特定的(x,y)坐标处物体到离摄像头平面最近的

    2022年4月25日
    51
  • 用递归函数求斐波那契数列_利用递归求斐波那契数列

    用递归函数求斐波那契数列_利用递归求斐波那契数列函数递归求斐波那契数列//函数递归求斐波那契数列//编写程序,求数列1,1,2,3,5,8,13,21,……//思路://第一步:找出表示数列第N项的递归公式:F(N)=F(N-1)+F(N-2)//第二步:递归的结束条件,当N=1或N=2时,F(N)=1;longintFib(intn){ if(n<=2) return1; else returnFib(n-1)+Fib(n-2); //拿n=3带入一下,第一个返回值为1第二个返回值1

    2025年8月30日
    7
  • Eclipse中使用SVN Eclipse配置SVN[通俗易懂]

    Eclipse中使用SVN Eclipse配置SVN[通俗易懂]Eclipse集成SVN文章目录Eclipse集成SVN一、安装SVN二、导入Eclipse中的项目到SVN三、检出Checkout项目到Eclipse中四、提交Commit修改后的内容到服务器五、在Eclipse中执行update更新代码六、在Eclipse中解决冲突七、在Eclipse中恢复历史版本一、安装SVN二、导入Eclipse中的项目到SVN三、检出Checkout项目到Eclipse中四、提交Commit修改后的内容到服务器五、在Ec

    2022年9月26日
    7
  • 判断图同构大杀器—nauty算法

    判断两图是否同构是一个经典问题。nauty算法作为时下较为流行的主流算法,具有效率高,剪枝力度强等优势。当然,在某些特殊情况会失灵。虽然该算法的概念在上世纪80年代就提出来了,但发展至今,仍然是不可忽略的一种方法。本人翻遍了中文互联网,没找到详细相关介绍,在stackoverflow上边找到了一个问答,顺着帖子的回复找到了算法原作者自建的网站,如获至宝。再结合离散数学,看懂了这个算法的大致流程。总结如下:nauty算法:判断两个图是否同构。思路:①设置一套编号系统,给两个图进行编号,如果两个

    2022年4月8日
    36
  • c++ so文件_C语言调用Python

    c++ so文件_C语言调用Python转自文章《编程基础—–c++与c调用so文件》http://blog.csdn.net/yf210yf/article/details/117129991.制作so文件:libadd_c.soadd.c:intadd(inta,intb){ returna+b;}编译:gcc-shared-fpic-lm-ldl-olibadd_c

    2026年1月23日
    4

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号