「从零单排hbase06」你必须知道的hbase最佳实践

阿丸 阿丸     2022-12-24     355

关键词:

前面,我们已经打下了很多关于HBase的理论基础,今天,我们主要聊聊在实际开发使用HBase中,需要关注的一些最佳实践经验。

1.Schema设计七大原则

1)每个region的大小应该控制在10G到50G之间;

2)一个表最好保持在 50到100个 region的规模;

3)每个cell最大不应该超过10MB,如果超过,应该有些考虑业务拆分,如果实在无法拆分,那就只能使用mob;

4)跟传统的关系型数据库不同,一个HBase的表中列族最多不超过3个,列族中的列可以动态添加的,不要设计过多列族;

5)列族名必须尽量短,因为我们知道在存储的时候,每个keyvalue都会包含列族名;

6)如果一个表存在一个以上的列族,那么必须要注意,不同列族之间行数相差不要太大。 例如列族A有10万行,而列族B有1亿行,那么rowkey就有1亿行,而region是按照行键进行切分的,因此列族A可能会被打散为很多很多小region,这会导致在扫描列族A时会引发较多IO,效率低下。

7)列族可以设置TTL时间,HBase在超过设定时间后,会自动删除数据。

设置方法有两种:

# 建表时设置,TTL单位为秒,此例中列簇‘f1‘的数据保留1天(86400秒)

hbase(main):002:0>create ‘table‘, NAME => ‘f1‘, TTL => 86400

# 通过修改表设置

hbase(main):002:0>alter ‘table‘, NAME => ‘f1‘, TTL => 86400

这里需要注意,一旦超过设定时间后,该数据就无法读取了,但是,真正的过期数据删除,是发生在major compaction时。

2.RowKey设计三大策略

HBase作为一个分布式存储数据库,虽然扩容非常容易,但是,对于“热点”问题,还是非常头疼的。

所谓“热点”问题(HotSpotting),就是请求(读或者写)短时间内落在了集中的个别region上,导致了该region所在机器的负载急剧上升,超过了单点实例的承受能力,从而引起性能下降或者不可用。

要解决这个问题,就需要设计RowKey时,使得数据尽量往多个region上去写。

举个例子:

假如region按照26个字母分成26个,那么同时写入m开头的rowkey的记录都会同时写入同一个region

比如m001,m002,m003,m004,m005。

因此,RowKey的设计非常关键。常见的设计策略有这么几种。

1)salting

salting策略就是将生成随机数放在行键的开头作为前缀,使得每个行键有随机的字典序。

对上面的案例进行优化,我们采用了salting策略,插入前给每个rowkey生成一个随机的字母,变成了

am001,zm002,nm003,qm004,lm005

这样就能同时往5个region里面写入了,成功打散。

副作用:由于前缀生成是随机的,因此如果想要按照字典序查询这些行,则需要做更多的事情。从这个角度上看,salting增加了写操作的吞吐量,却也增大了读操作的开销。

2)Hashing

Hashing策略也是一种特殊的salting,是用一个单向的 hash 来取代随机指派前缀。

这样能使一个给定rowkey的行在“salted”时有相同的前缀,因此,这样既可以分散RegionServer间的负载的,同时也允许在读操作时能够预测这个前缀值是什么。确定性hash( deterministic hash )可以让客户端重建完整的行键,然后就可以像正常一样用Get方法查询确定的行。

 

3)reverse key

第三种预防hotspotting的方法是反转一段固定长度或者可数的键,让变化最多的某个位置放在rowkey的第一位,

副作用:对于Get操作没有影响,但是不利于Scan操作进行范围查询,因为数据在原RowKey上的顺序已经被打乱。

3.预分区

在 HBase核心特性—region split 中,我们知道已经提到过关于预分区。

主要原因是当一张表被首次创建时,只会分配一个region给这个表。因此,在刚刚开始时,所有读写请求都会落在这个region所在的region server上,而不管你整个集群有多少个region server。不能充分地利用集群的分布式特性。

因此,预分区主要也是解决“热点”问题。

最为常见的建表语句为:

create ‘tb’,NAME => ‘f1’,COMPRESSION => ‘snappy’ , NUMREGIONS => 50, SPLITALGO => ‘HexStringSplit’

  • NUMREGIONS 为 region的个数,一般按照每个region 8-10GB左右来计算region数量,如果集群规模非常大,那么region数量可以适当取大一些
  • SPLITALGO 为 rowkey分割的算法,Hbase自带了三种pre-split的算法,分别是 HexStringSplit、DecimalStringSplit 和 UniformSplit。

各种Split算法适用场景:

  • HexStringSplit: rowkey是十六进制的字符串作为前缀的
  • DecimalStringSplit: rowkey是10进制数字字符串作为前缀的
  • UniformSplit: rowkey前缀完全随机

 

4.读性能优化

前面主要讲一些设计方面的优化点。

那如果在HBase的使用过程中,发现查询较慢,那么就需要根据具体情况,分析查询慢的原因,并采取相应的策略。

技术图片

 

看到这里了,原创不易,点个关注、点个赞吧,你最好看了~

知识碎片重新梳理,构建Java知识图谱:https://github.com/saigu/JavaKnowledgeGraph(历史文章查阅非常方便)

扫码关注我的公众号“阿丸笔记”,第一时间获取最新更新。同时可以免费获取海量Java技术栈电子书、各个大厂面试题。

技术图片

 

hbase篇-你不知道的hfile(代码片段)

...每日五分钟搞定大数据】系列,HBase第四篇这一篇你可以知道,HFile的内部结构?HBase读文件细粒度的过程?HBase随机读写快除了MemStore之外的原因?上一篇中提到了Hbase的数据以HFile的形式存在HDFS,物理存储路径是:NameSpace->Tabl... 查看详情

哪个etl最适合hbase

我正在使用Talend开放工具从HBase提取数据。是否有其他最佳(精确地:提取更多记录)开源工具,用于从HBase提取数据并将其加载到另一个数据库中。答案[当您寻找开源工具时,Talend是最好的工具。我可以看到你的问题精确地:... 查看详情

hbase三维存储

...imestamp(时间戳)三部分组成的三维有序存储。1.rowkey,我们知道rowkey是行的主键,而且hbase只能用个rowkey,或者一个rowkey范围即scan来查找数据。所以rowkey的设计是至关重要的,关系到你应用层的查询效率。我们知道,rowke 查看详情

hbasehbasegettingstarted(hbase入门指南)

...指南1.简介Quickstart 会让你启动和运行一个单节点单机HBase。2.快速启动–单点HBase这部分描述单节点单机HBase的配置。一个单例拥有所有的HBase守护线程—Master,RegionServers和ZooKeeper,运行一个单独JVM持久化到本地文件系统。这... 查看详情

如何将 HBase 表以 Parquet 格式移动到 HDFS?

...rquetformat?【发布时间】:2016-05-0409:31:06【问题描述】:我必须构建一个工具,将我们的数据存储从HBase(HFiles)以parquet格式处理到HDFS。请建议将数据从HBase表移动到Parquet表的最佳方法之一。我们必须将4亿条记录从HBase移动到Parquet... 查看详情

hbase字典顺序存储

...的设计是至关重要的,关系到你应用层的查询效率。我们知道,rowkey是以字典顺序排序的。而存储的字节码,字典排序,我们知道,如果是字母,那就是字母的顺序,比如,有两个rowkey,rowkey1 查看详情

hbase集群配置(代码片段)

...介绍hbase集群配置说明hbase想正确配置成功的前提是,你必须知道hadoop集群和zookeeper集群是如何配置的安装下载地址http://mirror.bit.edu.cn/apache/hbase/2.1.1/tar-zxvfhbase-2.1.1-bin.tar.gz解压mvhbase-2.1.1hbase换名配置环境变量sudovim/etc/profile添加ex... 查看详情

PIG - HBASE - 铸造值

...e表中的行。HBase表中的值存储为字节数组。我不知道是否必须编写一个将字节数组转换为各种类型的UDF,或者pig是否会自动执行此操作。我有以下脚本:raw=LOAD\'hbase://TABLE\'USINGorg.apache.pig.backend.ha 查看详情

HBase MasterProcWALs 问题

...在的错误,HbaseMasterProcWALs文件夹已填满了我的Hdfs。我想知道删除MasterProcWALs文件夹下的文件是否会删除Hbase中的任何数据?【问题讨论】:【参考方案1】:MasterProcWALs被master节点使用,这 查看详情

删除 HBase 中的列

...机?【问题讨论】:你能解释一下你想要做什么吗?我想知道更改架构(从数据和架构中删除列)是否需要关闭集群。【参考方案1】:HBase的Deletemutation上的deleteColu 查看详情

将 HBase 数据导出到 RDBMS

...要求,我想将数据从HBase导出到RDBM,如mysql或postgres。我知道我们有Sqoop作为选项,但它从MySQL导入并将其放入HBase,并将保存在HDFS中的数据导出到RDBMS,它不能直接从HBase导入数据。有没有工具可 查看详情

在hbase数据库中,每个region的建议最佳大小是?

...大小是什么?这个你可以从小红。中早一早就吃到一拍就知道。 参考技术B最佳大学要根据实质情况而定, 参考技术C实在是从未涉及到这个领域,我无法帮你解答这个问题,希望别人能帮帮你。 参考技术D在数据库每个的建议最... 查看详情

hbase原理——要弄懂的sequenceid

...认最大HLog文件数量为8。如果日志数量超过这个数量,就必须删除最老的HLog日志。那问题来了,如何知道待删除HLog日志对应的所有数据都已经落盘了?(如果知道哪些数据没有落盘,就可以强制对其执行flush,之后就可以将HLog删除... 查看详情

hbase原理——要弄懂的sequenceid

...认最大HLog文件数量为8。如果日志数量超过这个数量,就必须删除最老的HLog日志。那问题来了,如何知道待删除HLog日志对应的所有数据都已经落盘了?(如果知道哪些数据没有落盘,就可以强制对其执行flush,之后就可以将HLog删除... 查看详情

Kafka和HBase集成的最佳实践

...车辆传感器数据流式传输到Kafka。之后,这些传感器数据必须进行转换(即从人类可读数据中的protobuf反序列化)并存储在HBase中。1)你推荐哪个工具集(例如,Kafka- 查看详情

hbase轻松入门

...bsp;为什么需要HBase(我从哪里来)?      我们都知道,能量是不可能凭空产生的。HBase如是,它并不是有一群人吃饱了没事做要弄个HBase出来玩玩。一件新事物的诞生,必然是出于人们对旧有事物的不满足。在HBase诞生之... 查看详情

HBase 中的 OLAP 成为可能的原因

...们能够做到这一点。【问题讨论】:【参考方案1】:您必须在应用层中编写大量数据处理逻辑才能 查看详情

此时确保 HBase 表中的行数增加的最有效方法是啥?

】此时确保HBase表中的行数增加的最有效方法是啥?【英文标题】:What\'sthemostefficientwaytoassuretherowcountsareincreasedinanHBasetableatthisverymoment?此时确保HBase表中的行数增加的最有效方法是什么?【发布时间】:2012-10-1006:17:24【问题描述... 查看详情