Hbase特点:
- 1.Hbase是一个构建在HDFS上面的分布式数据库
- 2.HDFS的缺点:除了能够存储海量的数据之外,缺点是不支持小文件,不支持并发写,不支持文件随机修改,查询效率低
- 3.Hbase是一个支持百万级别高并发写入,支持实时查询,适合存储稀疏数据的分布式数据库系统,Hbase是列式存储,MysqL是行式存储。
- 4.Hbase中的数据相当于把每一行的每一列拆开, 然后通过rowkey进行关联起来,rowkey相同的这些数据其实就是原来的一行的数据。这样进行存储的好处是,可以不存储空值,由于把一行的数据变成了key-value这种类型的,所以Hbase可以存储上百万列,又由于Hbase是基于HDFS进行存储,所以可以存储上百万行,是一个真正的海量数据库。
在MysqL中的存储数据
Hbase中存储数据
注意:
很多时候我们进行查询的时候只是关注某几列,在进行select的时候,MysqL中是扫描所有记录,然后拿出特定的列,再返回结果,但是Hbase中是按照列进行存储所以在Hbase中直接选取响应的列即可,不需要进行全表扫描。
但是如果要是进行查询一行的数据的话,Hbase是不是变得很慢么?
Hbase中的列族,就是把一些列放在一起比如把job和salary都放到work这个列族下面,在存储的时候一个列族的数据会存储在一起,可以一次性的取出来,如果要查询所有列的信息的话只需要将所有列的都存储在一个列族里面即可,
注意:Hbase中列是可以随时进行添加的,但是列族在定义表的时候就需要定义好。
比如我们的某个业务需要查询很多列,我们只要将这几列放到同一个列族,里面即可一次性取出所有列的信息,查询速度更快。在生产环境的时候由于性能和数据均衡的考虑,我们一般只会用一个列族,最多两个列族。
rowkey的设计:
Hbase只能够通过rowkey进行查询,不能够通过sql一样的查询,有些中间件将sql翻译了Hbase的查询规则,从而支持SQL查询hbase,一个rowkey可以理解为一个字符串。在hbase中只需要把查询的字段巧妙的设置在rowkey中,一个rowkey可以理解为一个字符串,Hbase就是根据rowkey来建立索引的。
Hbase提供了三种查询方式:
1.rowkey是根据B+tree的方式进行组织数据的,
2.rowkey必须唯一且尽可能的短,
3.rowkey是字符串形式的,按照字典顺序进行排序,
4.rowkey类似于MysqL中的主键需要保证其唯一性,还有就是每一个key-value对都包含5.rowkey所以rowkey要尽可能的小,rowkey越短越节省空间
**问题:**hdfs是不适合小文件存储的。但是hbase中的一条记录只有一点点数据,记录的条数很多,属于海量的小文件,存在hdfs中不合适?
这里要用到LSM三层的存储模型:
数据 ===> 内存 ===>文件
Hbase会把数据先放到内存当中,内存满了会把内存中的内容刷写到文件当中,Hbase会定期把磁盘上的小文件进行合并,变成一个大文件,hbase会定期把存储在hdfs上面的小文件合并成为一个大文件。利用LMS三层的模型提高了写入效率的同时,也适合Hbase 的文件存储。
Hbase利用了WAL预写日志
Hbase利用了WAL预写日志的思想,Hbase会将数据的操作先写入日志当中,然后存到内存当中,哪天机器挂了,内存丢了还是能够从WAL中进行恢复。Hbase的WAL机制通过日志恢复策略保证了内存数据的不丢失。
数据修改:
Hbase是可以修改和删除数据的,其实Hbase数据都有一个版本号,修改数据的时候并不是把数据真正的删除掉了,而是追加了一条最新版本的记录。
Hbase通过时间戳timestamp来标识数据的版本信息,查询的时候只会查询最新版本的数据,删除的时候同样是追加一条最新版本的记录,只是标记这个数据删除了,通过特殊的标记来标识来标识记录被删除。
在LSM三层架构当中,本来一条数据有三个版本的信息,只有最后一条数据有用,Hbas在进行合并的时候会将用不到的记录删除掉,节省存储空间。
Hbse数据的合并
Hbase把合并分为两种:一种是minor compact,这种方式只会对少数的文件进行简单合并,不会对数据进行清理,还有一个是大的合并major compact,这种方式会将大部分的文件进行合并,并且清理数据。一般爱生产环境会禁止大合并,一般的大合并都是在业务的低峰值期间手动进行,比如用一个定时任务。
Hbase的架构:
HMaster和HregionServer,HRegionServer是真正存储数据的地方,HMaster的任务相对不繁重,但是却比较重要,它主要是通过调整和管理Region分布来实现HRegionServer的负载均衡。
在Hbase中每一张表都会元数据信息,这些信息也是被存储为Hbase表,成为元信息,也叫meat表,这是一种系统表。就像MysqL中的系统表一样,hbase是先拿到Meta表,然后就可以知道数据是在哪个 HRegionServer上面,Meta表存储在Zookeeper上面
其实Region是hbase在rowkey上的切分,每个Region都可以通过startKey和endKey来确定rowkey的范围,一个HRegionServer上可能会有多个Region。数据是根据rowkey和一定的哈希规则,分散到不同的Region上面,而Region又是属于某一个HRegionServer上的。
rowkey设计的另一个原则,就是散列性,rowkey的头几个字母,最好不要是一样的,不然会分布在同一个HRegionServer上面,导致这个HRegionServer的负载非常高,累死累活,其他HRegionServer却没事干。一般可以根据一定规则算一个数据的摘要,比如md5,把md5的头几位拼在rowkey的前面。
Store,我们之前说过,一个列簇中的列是存储在一起的,对应到这里,一个列簇中的数据就是存到一个Store中。
这里StoreFile只是一个名字,它是以HFile的格式存储在hdfs上,HFile是一个存储格式,在新版本的HFile存储格式中,它就是一个类似B+树的索引索引形式。
HLog是用来记录操作的,放置机器宕机之后内存中的数据丢失。
Hbase的读写流程
1.写流程:
-
1.hbase client要写输入了,先从zookeeper中拿到Meta表信息,根据数据的rowkey找到应该往哪个RegionServer写
-
2.然后hbase会将数据写入对应RegionServer的内存MemStore中,同时记录操作日志WAL
-
3.当MemStore超过一定阈值,就会将内存MemStore中的数据刷写到硬盘上,形成StoreFile
-
4.在触发了一定条件的时候,小的StoreFile会进行合并,变成大的StoreFile,有利于hdfs存储
其实当大量rowkey相近的数据都被分配到一个Region中,导致这个Region数据过大的时候,Region进行拆分,HMaster会对拆分后的Region重新分配RegionServer,这是HMaster的负载均衡策略
2.读流程:
-
1.hbase client要读数据了,先从zookeeper中拿到Meta表信息,根据要查的rowkey找到对应的数据在哪些RegionServer上
-
2.分别在这些RegionServer上根据列簇进行StoreFile和MemStore的查找,得到很多key-value结构的数据
-
3.根据数据的版本找到最新数据进行返回
OLTP应用叫联机事务处理应用,就是类似银行转账等业务的,这类应用对事务要求比较高,而OLAP应用叫联机分析处理应用,比如推荐系统,是在收集了大量用户行为后进行分析,再得出结论的应用,主要侧重分析,对事务要求非常低。
总结:
- 1、hbase是列式存储,和MysqL的行式存储不一样
- 2、hbase中有列簇概念,同一个列簇下的列存储在一起,在Region的一个StoreFile中
- 3、hbase是按照rowkey进行查找,要查询的字段要想办法放到rowkey中
- 4、hbase内部使用LSM三层模型进行存储,数据先写到内存MemStore中,内存达到一定阈值再刷写到硬盘StoreFile中,再满足一定条件时,小的StoreFile会合并为大的StoreFile
- 5、hbase适合OLAP类的应用
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。