查询网站后台登陆地址,网站建设预估费用,html5做网站的好处,印刷 网站模板目录 什么是HBase简述HBase 的数据模型HBase 的读写流程HBase 在写的过程中的region的split的时机HBase 和 HDFS 各自的使用场景HBase 的存储结构HBase 中的热现象#xff08;数据倾斜#xff09;是怎么产生的#xff0c;以及解决办法有哪些HBase rowkey的设计原则HBase 的列… 目录 什么是HBase简述HBase 的数据模型HBase 的读写流程HBase 在写的过程中的region的split的时机HBase 和 HDFS 各自的使用场景HBase 的存储结构HBase 中的热现象数据倾斜是怎么产生的以及解决办法有哪些HBase rowkey的设计原则HBase 的列族设计HBase 中 compact 用途是什么什么时候触发分为哪几种有什么区别hbase 基本架构hbase 和 hive 有什么区别HBase的MemStore的刷写MemStore在刷写磁盘过程中还可以继续写入吗Region分裂期间能不能对外提供服务HBase和MySQL的存储结构有什么不同HBase的LSM结构LSM树和B树做比较LSM树为什么要用布隆过滤器HBase为什么适合写HBase为什么查询快HBase不同写入方式的应用场景HBase的BulkLoadHBase中的一个节点宕机了怎么办MemStore中排序方法HBase是列式存储吗行式存储和列式存储有什么区别HBase的HFile的格式 什么是HBase HBase 是一种 分布式、可扩展、支持海量数据存储 的 NoSQL 数据库支持对大数据进行随机、实时的读/写访问。
简述HBase 的数据模型 HBase 的数据模型同关系型数据库很类似数据存储在一张表中有行有列。 其中
namespace命名空间类似于关系型数据库中的 database每个命名空间下有多个表。HBase 默认有两个命名空间分别叫做 default 和 hbaseregion类似于关系型数据库中的 table。但是 HBase 在定义表的时候不需要定义具体的列只需要定义列族就可以了row表示一行数据每行数据有一个 rowkey 和多个列组成数据是按照 rowkey 的字典顺序排列的column每一列都有列族和列限定符组成timestamp用于标识数据的不同版本每条数据写入的时候如果不指 定时间戳默认为写入 HBase 的时间cell 最小单元由{rowkey, column, timestamp}唯一确定
HBase 的读写流程 读流程
1Client 先访问 zookeeper获取 hbase:meta 表位于哪个Region Server。
2访问对应的Region Server获取 hbase:meta 表根据读请求的namespace:table/rowkey查询出目标数据位于哪个Region Server中的哪个Region中。并将该 table 的region信息以及meta表的位置信息缓存在客户端的 meta cache方便下次访问。
3与目标Region Server进行通讯
4分别在 MemStore 和 StoreFileHFile中查询目标数据并将查到的所有数据进行合并。此处所有数据是指同一条数据的不同版本time stamp或者不同的类型Put/Delete。
5将查询到的新的数据块BlockHFile 数据存储单元默认大小为64KB缓存到Block Cache。
6将合并后的最终结果返回给客户端。
写流程
1Client 先访问 zookeeper 获取 hbase:meta 表位于哪个Region Server。
2访问对应的 Region Server获取 hbase:meta 表根据读请求的 namespace:table/rowkey查询出目标数据位于哪个Region Server中的哪个Region中。并将该table的region信息以及meta表的位置信息缓存在客户端的 meta cache方便下次访问。
3与目标 Region Server 进行通讯
4将数据顺序写入追加到 WAL
5将数据写入对应的 MemStore数据会在 MemStore 进行排序
6向客户端发送 ack
7等达到 MemStore 的刷写时机后将数据刷写到HFile。
HBase 在写的过程中的region的split的时机 默认情况下每个 Table 起初只有一个 Region随着数据的不断写入Region 会自动进行拆分。刚拆分时两个子 Region 都位于当前的Region Server但处于负载均衡的考虑HMaster 有可能会将某个 Region 转移给其他的 Region Server。
Region Split 时机
1当1个region中的某个Store下所有 StoreFile 的总大小超过 hbase.hregion.max.filesize(默认10G)该Region就会进行拆分0.94版本之前。
2当1个region中的某个Store下所有StoreFile的总大小超过Min(initialSize*R^3 ,hbase.hregion.max.filesize)该Region就会进行拆分。其中 initialSize 的默认值为2*hbase.hregion.memstore.flush.size(默认128M)R 为当前 Region Server 中属于该 Table 的 Region个数0.94版本之后。
具体的切分策略为
第一次split1^3 * 256 256MB第二次split2^3 * 256 2048MB第三次split3^3 * 256 6912MB第四次split4^3 * 256 16384MB 10GB因此取较小的值10GB
后面每次split的size都是10GB了。
3Hbase 2.0引入了新的 split 策略如果当前 RegionServer 上该表只有一个 Region按照2 * hbase.hregion.memstore.flush.size分裂否则按照 hbase.hregion.max.filesize 分裂。
HBase 和 HDFS 各自的使用场景 首先一点需要明白 Hbase 是基于 HDFS 来存储的
HDFS:
一次性写入多次读取。保证数据的一致性。主要是可以部署在许多廉价机器中通过多副本提高可靠性提供了容错和恢复机制。
HBase:
瞬间写入量很大数据库不好支撑或需要很高成本支撑的场景数据需要长久保存且量会持久增长到比较大的场景。HBase 不适用与有 join多级索引表关系复杂的数据模型大数据量 (100s TB 级数据) 且有快速随机访问的需求。如: 淘宝的交易历史记录。数据量巨大无容置疑面向普通用户的请求必然要即时响应业务场景简单不需要关系数据库中很多特性 (例如交叉列、交叉表事务连接等等)
HBase 的存储结构 Hbase 中的每张表都通过行键(rowkey)按照一定的范围被分割成多个子表(HRegion),默认一个 HRegion 超过 256M 就要被分割成两个由 HRegionServer管理管理哪些 HRegion 由 Hmaster 分配。 HRegion 存取一个子表时会创建一个 HRegion 对象然后对表的每个列族(Column Family) 创建一个 store 实例每个 store 都会有 0 个或多个 StoreFile 与之对应每个 StoreFile 都会对应一个 HFileHFile 就是实际的存储文件一个 HRegion 还拥有一个 MemStore 实例。
HBase 中的热现象数据倾斜是怎么产生的以及解决办法有哪些 热点现象某时间段内对 HBase 的读写请求集中到极少数的 Region 上导致这些 region 所在的 RegionServer 处理请求量骤增负载量明显偏大而其他的 RegionServer 明显空闲。
原因
hbase 的中的数据是按照 rowkey的字典序排序的大量连续的 rowkey 集中写在个别的 region各个 region 之间数据分布不均衡创建表时没有提前预分区创建的表默认只有一个 region大量的数据写入当前 region创建表已经提前预分区但是设计的 rowkey 不合理
解决办法
预分区就是 在创建表的时候就提前划分出多个 region 而不是默认的一个rowkey 设计就是 通过设计出合理的 rowkey让数据均匀的分布到所有的 region 中;加盐就是在Rowkey的前面增加随机数具体就是给Rowkey分配一个随机前缀以使得它和之前的Rowkey的开头不同
HBase rowkey的设计原则 1长度原则一般是100位以内
2散列原则 rowkey要具有散列性
3唯一原则一个 rowkey 只能出现一次
rowkey设计常用方法
计算hash值字符串拼接字符串反转
HBase 的列族设计 原则在合理范围内能尽量少的减少列簇就尽量减少列簇官网中建议一张表应该有 1 到3 个列族所以列族的数量不应过多。 最优将所有相关性很强的 key-value 都放在同一个列簇下这样既能做到查询效率最高也能保持尽可能少的访问不同的磁盘文件。以用户信息为例可以将必须的基本信息存放在一个列族而一些附加的额外信息可以放在另一列族。
HBase 中 compact 用途是什么什么时候触发分为哪几种有什么区别 触发时间
由于 memstore 每次刷写都会生成一个新的 HFile当 HFile 的数量达到一定程度后就需要进行 StoreFile Compaction。
Compact 的作用
合并文件提高读写数据的效率清除过期多余版本的数据
HBase 中实现了两种 compaction 的方式
Minor compaction 会将临近的若干个较小的 HFile 合并成一个较大的 HFile会清理部分过期和删除的数据 Major compaction 会将一个 Store 下的所有的 HFile 合并成一个大 HFile会清理掉所有过期和删除的数据
hbase 基本架构 HBase主要包括 region server 和masterregion server主要用于region的管理而master主要用于管理region server另外还有zookeeper和hdfszookeeper主要是用来保证master的高可用hdfs提供存储服务。
hbase 和 hive 有什么区别 1hbase是一个数据库而hive一般用于构建数据仓库
2hbase可以看做是一个存储框架而hive是一款分析框架
3hbase的查询延迟比较低常用于在线实时的业务而hive常用于离线的业务
HBase的MemStore的刷写 MemStore 刷写时机
1当某个 memstore 的大小达到了 hbase.hregion.memstore.flush.size默认值128M其所在region的所有memstore都会刷写。每次刷写都会有一个新的文件产生。 当 memstore 的大小达到了 hbase.hregion.memstore.flush.size(默认128M) * hbase.hregion.memstore.block.multiplier(默认4) 时会阻止继续往该memstore写数据。
2 当 region server 中 memstore 的总大小达到 java_heapsize *hbase.regionserver.global.memstore.size(默认0.4) *hbase.regionserver.global.memstore.size.lower.limit(默认0.95)region 会按照其所有 memstore 的大小顺序由大到小依次进行刷写。直到 region server 中所有 memstore 的总大小减小到上述值以下。当 region server 中 memstore的总大小达到 java_heapsize*hbase.regionserver.global.memstore.size(默认0.4) 时会阻止继续往所有的memstore写数据。
3到达自动刷写的时间也会触发 memstore flush。自动刷新的时间间隔由该属性进行配置hbase.regionserver.optionalcacheflushinterval(默认1小时)。
4当WAL文件的数量超过 hbase.regionserver.max.logsregion会按照时间顺序依次进行刷写直到WAL文件数量减小到 hbase.regionserver.max.logs以下该属性名已经废弃现无需手动设置最大值为32。
MemStore在刷写磁盘过程中还可以继续写入吗 在 HBase 中当 MemStore 中的数据量达到一定阈值时HBase 会将其刷写到磁盘上的 StoreFile 中以释放内存空间并保证数据持久化。
MemStore 在刷写磁盘的过程中仍然可以继续接收新的写入请求这些写入请求会被缓存到 MemStore 中直到下一次刷写磁盘操作触发时才会一并写入到磁盘上的 StoreFile 中。
Region分裂期间能不能对外提供服务 不能。
在分裂过程中HBase会暂停对外服务。同时在分裂完成之前HBase也不会将新的Region对外提供服务只有分裂完成后才会对外提供服务。因为分裂过程中需要进行数据的重新分配和数据移动如果在分裂过程中继续对外提供服务会导致数据的不一致性和丢失。
HBase和MySQL的存储结构有什么不同 1MySQL采用的是关系型数据库的存储结构使用B树或者是Hash索引来存储数据。MySQL中的表结构是固定的每个表都有一定数量的列每个列存储的数据类型也是预先定义好的对于每一行数据都是按照固定的表结构进行存储的。
2HBase采用的是NoSQL数据库的存储结构使用 LSM 树来存储数据。在HBase中数据存储在表中的行和列族中列是动态的可以随时新增和删除列的数据类型也是动态的可以按需指定。HBase中的数据按照rowkey进行排序并且rowkey是可变长度的字节数组可以根据具体的需求自由定义。
HBase的LSM结构 B树是MySQL的底层数据结构LSM树就是HBase的底层数据结构。LSM树和B树相比LSM树牺牲了部分读性能用来大幅提高写性能。
LSM树的设计思想非常朴素将对数据的修改增量保持在内存中达到指定的大小限制后将这些修改操作批量写入磁盘不过读取的时候稍微麻烦需要合并磁盘中历史数据和内存中最近修改操作所以写入性能大大提升读取时可能需要先看是否命中内存否则需要访问较多的磁盘文件。
LSM树和B树做比较 1写性能
LSM树LSM树以追加写Append-Only Write方式操作将写入的数据先追加到内存中的日志文件Write-Ahead Log然后定期合并到磁盘中的数据文件因此在写入大量数据时具有较高的性能。B树B树的写操作是直接在内存中进行更新然后再将更新操作同步到磁盘中的位置相对于LSM树来说写入性能较为稳定。
2读性能
LSM树由于数据在多个层级内存、磁盘和可能的缓存上分布存储因此读取数据可能需要多次磁盘访问导致读取性能相对较低。B树B树的数据结构更适合范围查询和顺序访问因为数据在叶子节点上形成有序的链表结构可以通过遍历叶子节点实现范围查询。
LSM树为什么要用布隆过滤器 布隆过滤器是一种数据结构用于快速判断一个元素是否存在于一个集合中。
在LSM树中使用布隆过滤器的主要目的是减少磁盘访问次数。由于LSM树中的数据通常存储在多个文件中而查询时需要在所有文件中查找数据因此需要进行大量的磁盘访问这会严重影响查询性能。使用布隆过滤器可以将一部分数据过滤掉减少磁盘访问次数提高查询性能。 需要注意的是布隆过滤器可能会出现误判即将一个不存在的元素判断为存在。这是由于哈希函数产生的冲突和位数组大小限制造成的。为了降低误判率布隆过滤器需要占用一定的空间因此需要根据实际情况进行调整。此外为了避免误判造成的影响可以在数据查找时进行二次确认。当布隆过滤器判断元素存在时可以进一步检查实际数据如果不存在则可以纠正误判。 HBase为什么适合写 因为HBase的存储引擎用的是LSM树是一种面向磁盘的数据结构HBase底层的存储引擎为LSM-TreeLog-Structured Merge-Tree。LSM核心思想的核心就是放弃部分读能力换取写入的最大化能力。
LSM Tree它的核心思路其实非常简单就是假定内存足够大因此不需要每次有数据更新就必须将数据写入到磁盘中而可以先将最新的数据驻留在内存中等到积累到最后多之后再使用归并排序的方式将内存内的数据合并追加到磁盘队尾因为所有待排序的树都是有序的可以通过合并排序的方式快速合并到一起。另外写入时候将随机写入转换成顺序写数据写入速度也很稳定。
HBase为什么查询快 1基于LSM树的存储方式
HBase采用基于LSM树的存储方式这种存储方式将数据分为内存和磁盘两层存储内存部分称为MemStore磁盘部分称为HFile。MemStore存储的数据是有序的并且每次插入数据时会进行排序和合并因此可以减少数据的查找和排序开销提高查询效率。
2分布式存储架构
HBase采用分布式存储架构数据可以分散存储在集群中的多台机器上。在查询时HBase可以利用分布式存储架构进行并行查询从而提高查询效率。
3列存储方式
HBase采用列存储方式同一列族的数据被存储在一起可以避免不必要的IO操作提高数据读取效率。
4布隆过滤器
通过Rowkey定位Region这当中会先经过BlockCache这边找不到的话再经过MemStore和Hfile查询这当中通过布隆过滤器过滤掉一些不需要查询的HFile。
5基于Region的负载均衡
HBase会将数据划分为多个Region进行存储每个Region对应着一段连续的行键。HBase会自动对Region进行负载均衡保证数据分布均匀避免热点数据和单点故障。
HBase不同写入方式的应用场景 HBase支持多种写入方式以下是常见的几种写入方式和对应的应用场景
单行写入使用Put对象将一行数据写入HBase表中。适用于小批量或单个数据写入的场景。批量写入使用Put对象批量写入多行数据。适用于大批量数据写入的场景。BulkLoad写入使用HFile格式的数据文件直接导入HBase表中。适用于海量数据写入的场景。- - 无覆盖写入使用checkAndPut方法实现无覆盖写入即只有当目标列不存在时才写入。适用于需要保证数据完整性的场景。CAS写入使用checkAndPut方法实现基于版本的CASCompare-And-Set写入即只有当目标列的版本与预期版本一致时才写入。适用于需要保证数据一致性和避免竞争写入的场景。
需要根据实际业务场景和数据量大小选择适当的写入方式以保证写入性能和数据完整性。
HBase的BulkLoad BulkLoad写入使用HFile格式的数据文件直接导入HBase表中。当我们需要大批量向HBase中导入数据就可以通过HBase的BulkLoad方法来快速将海量数据导入到HBase中。
主要包括三个步骤
Extract异构数据源数据导入到 HDFS 之上。Transform通过用户代码可以是 MR 或者 Spark 任务将数据转化为 HFile。LoadHFile 通过 loadIncrementalHFiles 调用将 HFile 放置到 Region 对应的 HDFS 目录上该过程可能涉及到文件切分。
HBase中的一个节点宕机了怎么办 1Master故障恢复原理
在HBase体系结构中Master主要负责实现集群的负载均衡和读写调度并没有直接参与用户的请求所以整体负载并不很高。
HBase采用基本的热备方式来实现Master高可用。通常情况下要求集群中至少启动两个Master进程进程启动之后会到ZooKeeper上的Master节点进行注册注册成功后会成为ActiveMaster其他在Master节点未注册成功的进程会到另一个节点Backup-Masters节点进行注册并持续关注Active Master的情况一旦Active Master发生宕机这些Backup-Masters就会立刻得到通知它们再次竞争注册Master节点注册成功就可成为Active Master。
一方面Active Master会接管整个系统的元数据管理任务包括管理ZooKeeper以及meta表中的元数据并根据元数据决定集群是否需要执行负载均衡操作等。另一方面Active Master会响应用户的各种管理命令包括创建、删除、修改表move、merge region等命令。
2RegionServer故障恢复原理
Master如何检测RegionServer宕机HBase检测宕机是通过Zookeeper实现的 正常情况下RegionServer会周期性向Zookeeper发送心跳一旦发生宕机心跳就会停止超过一定时间SessionTimeoutZookeeper就会认为RegionServer宕机离线并将该消息通知给Master。
一旦RegionServer发生宕机HBase会马上检测到这种宕机并且在检测到宕机之后将宕机RegionServer上的所有Region重新分配到集群中其他正常的RegionServer上再根据 HLog 进行丢失数据恢复恢复完成之后就可以对外提供服务。整个过程都是自动完成的并不需要人工介入。
MemStore中排序方法 在 HBase 中MemStore 是用于缓存表中数据的内存结构它是 HBase 实现高性能读写的重要组成部分。在 MemStore 中排序方式主要有以下两种方法
以行键Row Key为排序依据以时间戳为排序依据
HBase是列式存储吗行式存储和列式存储有什么区别 HBase是一种列簇数据库column-family database但是不属于列式数据库column-oriented database。
区别
列存储 同一列存放在一起数据类型相同则更好的进行压缩同一列存放在一起则排序更加方便基于排序方便where某一列会更加快基于列和列分开存储这种形式天生就适合分布式的存储并能完全利用并发写入和并发读取的能力。 行存储 更容易实现事务性、一致性控制。
HBase的HFile的格式 HFile文件是不定长的长度固定的只有其中的两块Trailer和FileInfo。
Trailer中有指针指向其他数据块的起始点FileInfo记录了文件的一些meta信息。Data Block是Hbase IO的基本单元为了提高效率HRegionServer中有基于LRU的Block Cache机制。每个Data块的大小可以在创建一个Table的时候通过参数指定默认块大小64KB大号的Block有利于顺序Scan小号的Block利于随机查询。每个Data块除了开头的Magic以外就是一个个KeyValue对拼接而成Magic内容就是一些随机数字目的是防止数据损坏。