hbase的元数据会保存在mysql吗

hbase的元数据会保存在mysql吗,第1张

大家都知道Hadoop是一个数据库,其实说的的就是Hbase。它和我们平常理解的关系型数据库有什么区别呢?

1它是NoSQL的,它没有SQL的接口,有自己的一套API。
2关系型数据库可以做汇总,可以进行常规的分析,但是Hbase不可以,它不能做汇总。那么Hbase *** 作不方便,不能做汇总,不能做分析,有什么作用呢?它的随机读写效率很高,可以存储海量数据,基于某个网点,某个城市,某个机器随机去查询速度快。或者去存储基于时间序列的数据,比如微信、微博、日志的数据,效率很高。
3它的存储是列式的,平常我们接触的MySQL,Oracle,RDBMS都是行存储。行存储和列存储的区别是:行存储适合在线事务的场景,适合随机的访问,比如去银行修改账户记录,修改个人信息,这个修改就是从数据库中找到你信息所在的行。列存储就是以列为单位进行连续存储,如果以列存储放到银行这个场景中会是怎样的一种效果呢?如果想要修改信息,那么定义到用户所在行信息,就会扫描到整个表,所以行存储主要用于在线事务处理,而列存储适用于数据分析。因为在大数据的数据库场景中,我们会构建很宽的事实表,通过信息模型有个中心,围绕这个中心扩散出很多维度,这个中间表是一个很宽的表,在我们进行特定业务分析的时候,比如分析广告业务推广的情况,可能只需要从很多资料中选取一部分变量进行分析,如果使用行存储,那么就是全表扫描,而使用列存储会选取特定部分,效率很高。
HBase vs RDBMS

通过以上描述,我们分析一下hbase的特点:
(1)存储海量数据:Pb+
(2)高吞吐:每秒每个节点上千次写
(3)适合处理稀疏数据(半结构化数据):存储一行的空列没有空间浪费。因为半结构化数据有大量的空存在,那么使用结构化数据存储到关系型数据库,就会有大量的空间浪费,而且不适合做分析。
但是hbase访问模式是受到限制的,它对基于行键的查找做了优化,而不是全文查询;没有事务,只支持单行 *** 作。
说了这么多,那么我们为什么使用Hbase呢?这里我们做一个对比:
(1)使用HDFS
你只需要追加到数据集(没有随机写)
通常读取整个数据集(没有随机读)
(2)使用HBase
你需要随机写或读
每秒对TB级的数据执行上千次 *** 作
(3)使用RDBMS
数据放在一个大节点上
需要全部的事务支持
需要实时查询的能力

最适合使用Hbase存储的数据是非常稀疏的数据(非结构化或者半结构化的数据)。Hbase之所以擅长存储这类数据,是因为Hbase是column-oriented列导向的存储机制,而我们熟知的RDBMS都是row- oriented行导向的存储机制(郁闷的是我看过N本关于关系数据库的介绍从来没有提到过row- oriented行导向存储这个概念)。在列导向的存储机制下对于Null值得存储是不占用任何空间的。比如,如果某个表 UserTable有10列,但在存储时只有一列有数据,那么其他空值的9列是不占用存储空间的(普通的数据库MySql是如何占用存储空间的呢)。 Hbase适合存储非结构化的稀疏数据的另一原因是他对列集合 column families 处理机制。 打个比方,ruby和python这样的动态语言和c++、java类的编译语言有什么不同 对于我来说,最显然的不同就是你不需要为变量预先指定一个类型。Ok ,现在Hbase为未来的DBA也带来了这个激动人心的特性,你只需要告诉你的数据存储到Hbase的那个column families 就可以了,不需要指定它的具体类型:char,varchar,int,tinyint,text等等。 Hbase还有很多特性,比如不支持join查询,但你存储时可以用:parent-child tuple 的方式来变相解决。 由于它是Google BigTable的 Java 实现,你可以参考一下:google bigtable 。
解读Hadoop Hbase适合存储哪类数据,参考:>利用选项2, 先打通Hive对HBase指定表的全表访问, 再建立一个新的空表, 把查询出来的数据全部导入到新表当中, 以后的所有数据分析 *** 作在新表中完成。
说干就干, 让我们试一个简单的例子。
首先在HBase里面建一个表, 名为 student, 包含 id 和 name 两个column
hbase shell
create 'student', 'id', 'name'
向表中插入两行数据
put 'student', 'row1', 'id:val', '1'
put 'student', 'row1', 'name:val', 'Tony'
put 'student', 'row2', 'id:val', '2'
put 'student', 'row2', 'name:val', 'Mike'
注意:在插入数据的时候一定要指定column (如id:val, name:value) 直接使用column family (如 id, name) 去存数据会导致后面Hive 建表的时候有问题。
扫描此表, 确定数据已经插入
scan 'student'
ROW COLUMN+CELL
row1 column=id:val, timestamp=1384939342989, value=1
row1 column=name:val, timestamp=1384939365511, value=Tony
row2 column=id:val, timestamp=1384939351444, value=2
row2 column=name:val, timestamp=1384939379245, value=Mike


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/10257438.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-06
下一篇 2023-05-06

发表评论

登录后才能评论

评论列表(0条)

保存