加入收藏 | 设为首页 | 会员中心 | 我要投稿 武汉站长网 (https://www.027zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

大数据开发HBase架构原理(第二十五篇)

发布时间:2022-12-03 08:02:00 所属栏目:大数据 来源:未知
导读: 一、Region概念Region可以翻译为区域,在HBase里面,一个表中的数据,会按照行被横向划分为多个Region。每个Region,是按照存储的RowKey的最小行键和最大行键指定的,使用区间[startRowKey

一、Region概念Region可以翻译为区域,在HBase里面,一个表中的数据,会按照行被横向划分为多个Region。每个Region,是按照存储的RowKey的最小行键和最大行键指定的,使用区间[startRowKey,endRowKey]随着表中的数据越来越多,Region会越来越大,那么Region会自动分裂,目的是保证每个Region不会太大

表刚创建的时候,默认只有一个Region,随着数据量的增多,Region就会自动分裂,就产生了多个Region。在查询这个表里面的数据的时候,首先要知道数据在哪个Region里面,再从这个Region中读取数据大数据存储架构,如果知道数据在哪个Region中呢?

在向表里面插入数据的时候,Rowkey是必须指定不能缺少的,并且RowKey在存储的时候,它是有序存储的,那么我们在定位数据的时候,就可以先拿到RowKey对应的Region进行比较。因为每个Region中,它都有一个最小的RowKey和最大的RowKey,这样就能很快的判断出来数据是不是在这个Region里面,只要和它里面最大的RowKey比一下。如果比这个RowKey小,说明在这个里面,如果比它大,说明在后面,再和下一个Region的最大RowKey比一下

每个Region中最大RowKey是有地方维护的,HBase内部默认提供了一个目录表维护这个关系,如果这个表T1里面有两个列族:C1\C2。那么在存储的时候,列族C1中的数据,在底层它是一个独立的文件,列族C2在底层也是一个独立的文件,每一个列族中的数据在底层存储的时候都是一个单独的文件。当这个表有多个Region的时候,每个Region内部的每个列族,它会是一个单独的文件

总结:

在后期设计列族的时候,可以把经常读取的列给它存储到一个列族里面,不经常读取的列放到另一个列族里面。这样我们在读取部分列的数据的时候,就只需要读取对应列族文件的数据就行了,这样可以提高读取效率。

Q:如果一个列族中有两个列,那么这两个列会存储到两个列族文件中吗?

不会的,它们都在一个列族中!

Q:一行记录会不会分到多个文件中存储?

会的,因为一行记录,它里面涉及到多个列族,每个列族都是一个文件

Q:一个列族中的数据会不会存在多个Region中存储?

会的,因为这个表里面的数据足够多的时候,后期会被横向切分为多个Region

二、HBase详细架构

大数据 数据存储_分布式数据存储架构_大数据存储架构

客户端想要连接HBase的时候,需要先连接Zookeeper,首先会找Zookeeper里面/hbase/mate-region-server这个节点。这个节点里面保存了HBase中mate表的数据,也就是Region所在的Regionserver节点信息。:16030/rs-status

2.1、HRegionServer

Region是HRegion的简写,就是HBase的Region可以简写为HRegion。在一个HRegionserver里面HLog只有一个,HRegion是可以有多个的。HLog是负责记录日志的,针对这个HRegion里面,它接收的所有写操作,包括put、delete等操作,只要会对数据产生变化的操作,都会先记录到这个日志里面,然后再把数据写到对应的HRegion里面。HRegion就是负责存储实际数据的

HRegion里面,它会有多个Store,每个Store对应一个列族。当我们向这个HRegionserver里面去写数据的时候,会先写HLog,然后再往这个HRegion里面去写,再往HRegion里面去写数据的时候,会根据指定的列族信息把数据写到不同的Store里面。

Store里面包含:MemStore、StoreFile。用户真正往里面写数据的时候,会写到MemStore里面,这是一个基于内存的Store。当MemStore写满之后,MemStore会把数据持久化到那个StoreFile里面

2.2、WAL(Write-Ahead Logging)预写日志系统

WAL最重要的作用是灾难恢复,和MySQL的Binlog类似,它记录所有的数据改动,一旦服务器崩溃,通过重放log可以恢复奔溃之前的数据。

在HBase中,HLog是WAL的实现类,一个HRegionServer对应一个HLog实例

2.3、HFileHFile是HBase中重要的一个存在,可以说是HBase架构中最小的结构,HBase的底层数据都在HFile中。HFile从根本上来说是HDFS中的文件,只是它有自己特殊的格式HFile文件格式

Data(数据块)

大数据 数据存储_分布式数据存储架构_大数据存储架构

负责保存表中的数据,是key-value这种格式。这部分数据可以被压缩,每一个数据块都有一个Magic头,里面负责存储偏移量和第一个key

Meta(元数据块)

主要存储用户自定义的一些key-value,这个是可选的

File Info

定长的,主要记录了文件的一些元数据信息

Data Index(数据块索引)

记录了每个数据块的起始索引

Meta Index(元数据块索引)

记录了每个元数据块的索引

Trailer

主要用于指向其它数据块的一个起始点

2.4、BloomFilter布隆过滤器

布隆过滤器是一种比较巧妙的概率型数据结构,可以用来告诉你“某样东西一定不存在或者可能存在”。布隆过滤器是HBase中的高级功能,它能减少特定访问模式(get/scan)下的查询时间,进而提升HBase集群的吞吐率。

2.5、HFile Compaction(合并)机制当MemStore超过阀值的时候,就会持久化生成一个(StoreFile)HFile因此随着不断写入,HFile的数量将会越来越多,HFile数量过多会降低读性能,为了避免对读性能的影响,可以对这些HFile进行合并操作,把多个HFile合并成一个HFile合并操作需要对HBase的数据进行多次的重新读写,会产生大量的IO合并操作分为major(大合并)和minor(小合并)两种minor(小合并):只做部分文件的合并操作,小合并的过程一般较快,而且IO相对较低major(大合并):将Region下的所有HFile合并成一个文件。此时,会忽略已经标记为删除的数据,ttl过期的数据、版本超过限定的数据,大合并会产生大量的IO操作,对HBase的读写性能产生较大影响2.6、Region Split(分裂)机制HBase默认只会给每个新创建的Table分配一个Region。此时,所有的读写请求都会访问到同一个RegionSever的同一个Region中,进而出现读写热点问题为了达到负载均衡,当Region达到一定的大小时就会将一个Region分裂成两个新的子Region,并对父Region进行清除处理HMaster会根据Balance策略,重新分配Region所属的RegionSever,最大化的发挥分布式系统的优点2.7、Region Balance策略HMaster进程会自动根据指定策略挑选出一些Region,并将这些Region分配到负载比较低的RegionServer上目前支持两种Region策略:DefaultLoadBalancer和StochasticLoadBalancer三、HBase高级用法3.1、Scan的常见Java API用法scan.addFamily()指定列族scan.addColumn()指定列,如果没有调用任何addFamily或者Column,会返回所有的Columnsscan.readAllVersions()读取所有版本数据scan.setTimeRange()指定最大的时间戳和最小的时间戳,只有在此范围内的cell才能被获取scan.setTimeStamp()指定时间戳scan.setFilter()指定Filter来过滤掉不需要的信息scan.withStartRow()指定开始的行,如果不指定,则从表头开始scan.withStopRow()指定结束的行(不含此行)scan.setBatch()指定最多返回的cell数目,为了防止一行中有过多的数据,导致OOMscan.setCaching()指定scan底层每次连接返回的数据条数,默认值为1,适当调大可以提高查询性能,设置太大会比较消耗性能

(编辑:武汉站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!