HBase的预分区设计(很实用的一篇文章)

【大数据学习 | HBASE高级】rowkey的设计,hbase的预分区和压缩 regionserver堆栈内存大小,官方推荐每台regionserver内存大小设置20-24G,不推荐设置更大,因为更大的堆栈内存GC效率较低。,rowkey的设计至关重要,会影响region分布,如果rowkey设计不合理还会出现region写热点等一系列问题。需求:hbase存储的是用户的交易信息, 我想查某个用户在某个时间段内的交易记录,如何设计rowkey。用户id(md5), 用户名称, 交易时间, 交易金额, 交易说明。,或者数据在刚开始插入的数据都在一个region中,使得。 阅读详情

 

如果知道hbase数据表的key的分布情况,就可以在建表的时候对hbase进行region的预分区。这样做的好处是防止大数据量插入的热点问题,提高数据插入的效率。

背景:HBase默认建表时有一个region,这个region的rowkey是没有边界的,即没有startkey和endkey,在数据写入时,所有数据都会写入这个默认的region,随着数据量的不断  增加,此region已经不能承受不断增长的数据量,会进行split,分成2个region。在此过程中,会产生两个问题:1.数据往一个region上写,会有写热点问题。2.region split会消耗宝贵的集群I/O资源。基于此我们可以控制在建表的时候,创建多个空region,并确定每个region的起始和终止rowky,这样只要我们的rowkey设计能均匀的命中各个region,就不会存在写热点问题。自然split的几率也会大大降低。当然随着数据量的不断增长,该split的还是要进行split。像这样预先创建hbase表分区的方式,称之为预分区,下面给出一种预分区的实现方式:

首先看没有进行预分区的表,startkey和endkey为空。

要进行预分区,首先要明确rowkey的取值范围或构成逻辑,以我的rowkey组成为例:两位随机数+时间戳+客户号,两位随机数的范围从00-99,于是我划分了10个region来存储数据,每个region对应的rowkey范围如下:

-10|,10|-20|,20|-30|,30|-40|,40|-50|,50|-60|,60|-70|,70|-80|,80|-90|,90|-

一、HBase API创建分区表

在使用HBase API建表的时候,需要产生splitkeys二维数组,这个数组存储的rowkey的边界值。下面是java 代码实现:

  1. private byte[][] getSplitKeys() {

  2. String[] keys = new String[] { "10|", "20|", "30|", "40|", "50|",

  3. "60|", "70|", "80|", "90|" };

  4. byte[][] splitKeys = new byte[keys.length][];

  5. TreeSet<byte[]> rows = new TreeSet<byte[]>(Bytes.BYTES_COMPARATOR);//升序排序

  6. for (int i = 0; i < keys.length; i++) {

  7. rows.add(Bytes.toBytes(keys[i]));

  8. }

  9. Iterator<byte[]> rowKeyIter = rows.iterator();

  10. int i=0;

  11. while (rowKeyIter.hasNext()) {

  12. byte[] tempRow = rowKeyIter.next();

  13. rowKeyIter.remove();

  14. splitKeys[i] = tempRow;

  15. i++;

  16. }

  17. return splitKeys;

  18. }

为什么后面会跟着一个"|",是因为在ASCII码中,"|"的值是124,大于所有的数字和字母等符号,当然也可以用“~”(ASCII-126)。分隔文件的第一行为第一个region的stopkey,每行依次类推,最后一行不仅是倒数第二个region的stopkey,同时也是最后一个region的startkey。也就是说分区文件中填的都是key取值范围的分隔点。
需要注意的是,在上面的代码中用treeset对rowkey进行排序,必须要对rowkey排序,否则在调用admin.createTable(tableDescriptor,splitKeys)的时候会出错。创建表的代码如下:

  1. /**

  2. * 创建预分区hbase表

  3. * @param tableName 表名

  4. * @param columnFamily 列簇

  5. * @return

  6. */

  7. @SuppressWarnings("resource")

  8. public boolean createTableBySplitKeys(String tableName, List<String> columnFamily) {

  9. try {

  10. if (StringUtils.isBlank(tableName) || columnFamily == null

  11. || columnFamily.size() < 0) {

  12. log.error("===Parameters tableName|columnFamily should not be null,Please check!===");

  13. }

  14. HBaseAdmin admin = new HBaseAdmin(conf);

  15. if (admin.tableExists(tableName)) {

  16. return true;

  17. } else {

  18. HTableDescriptor tableDescriptor = new HTableDescriptor(

  19. TableName.valueOf(tableName));

  20. for (String cf : columnFamily) {

  21. tableDescriptor.addFamily(new HColumnDescriptor(cf));

  22. }

  23. byte[][] splitKeys = getSplitKeys();

  24. admin.createTable(tableDescriptor,splitKeys);//指定splitkeys

  25. log.info("===Create Table " + tableName

  26. + " Success!columnFamily:" + columnFamily.toString()

  27. + "===");

  28. }

  29. } catch (MasterNotRunningException e) {

  30. // TODO Auto-generated catch block

  31. log.error(e);

  32. return false;

  33. } catch (ZooKeeperConnectionException e) {

  34. // TODO Auto-generated catch block

  35. log.error(e);

  36. return false;

  37. } catch (IOException e) {

  38. // TODO Auto-generated catch block

  39. log.error(e);

  40. return false;

  41. }

  42. return true;

  43. }


在hbase shell中输入命令san 'hbase:meta'查看建表结果:

从上图可看出10个region均匀的分布在了3台regionserver上(集群就3台机器regionserver),达到预期效果。还可以在hbase的web UI界面中更加直观的查看建表的预分区信息。

再看看写数据是否均匀的命中各个region,是否能够做到对写请求的负载均衡:


 
  1. public class TestHBasePartition {

  2. public static void main(String[] args) throws Exception{

  3. HBaseAdmin admin = new HBaseAdmin(conf);

  4. HTable table = new HTable(conf, "testhbase");

  5. table.put(batchPut());

  6. }

  7.  
  8. private static String getRandomNumber(){

  9. String ranStr = Math.random()+"";

  10. int pointIndex = ranStr.indexOf(".");

  11. return ranStr.substring(pointIndex+1, pointIndex+3);

  12. }

  13.  
  14. private static List<Put> batchPut(){

  15. List<Put> list = new ArrayList<Put>();

  16. for(int i=1;i<=10000;i++){

  17. byte[] rowkey = Bytes.toBytes(getRandomNumber()+"-"+System.currentTimeMillis()+"-"+i);

  18. Put put = new Put(rowkey);

  19. put.add(Bytes.toBytes("info"), Bytes.toBytes("name"), Bytes.toBytes("zs"+i));

  20. list.add(put);

  21. }

  22. return list;

  23. }

  24. }


写了1万条数据,从Write Request Count一栏可以查看写请求是否均匀的分布到3台机器上,实测我的达到目标,完成。

二、在HBase shell中创建分区表,指定分区文件

在hbase shell中直接输入create,会看到如下的提示:

 


 
  1. Examples:

  2.  
  3. Create a table with namespace=ns1 and table qualifier=t1

  4. hbase> create 'ns1:t1', {NAME => 'f1', VERSIONS => 5}

  5.  
  6. Create a table with namespace=default and table qualifier=t1

  7. hbase> create 't1', {NAME => 'f1'}, {NAME => 'f2'}, {NAME => 'f3'}

  8. hbase> # The above in shorthand would be the following:

  9. hbase> create 't1', 'f1', 'f2', 'f3'

  10. hbase> create 't1', {NAME => 'f1', VERSIONS => 1, TTL => 2592000, BLOCKCACHE => true}

  11. hbase> create 't1', {NAME => 'f1', CONFIGURATION => {'hbase.hstore.blockingStoreFiles' => '10'}}

  12.  
  13. Table configuration options can be put at the end.

  14. Examples:

  15.  
  16. hbase> create 'ns1:t1', 'f1', SPLITS => ['10', '20', '30', '40']

  17. hbase> create 't1', 'f1', SPLITS => ['10', '20', '30', '40']

  18. hbase> create 't1', 'f1', SPLITS_FILE => 'splits.txt', OWNER => 'johndoe'

  19. hbase> create 't1', {NAME => 'f1', VERSIONS => 5}, METADATA => { 'mykey' => 'myvalue' }

  20. hbase> # Optionally pre-split the table into NUMREGIONS, using

  21. hbase> # SPLITALGO ("HexStringSplit", "UniformSplit" or classname)

  22. hbase> create 't1', 'f1', {NUMREGIONS => 15, SPLITALGO => 'HexStringSplit'}

  23. hbase> create 't1', 'f1', {NUMREGIONS => 15, SPLITALGO => 'HexStringSplit', CONFIGURATION => {'hbase.hregion.scan.loadColumnFamiliesOnDemand' => 'true'}}

  24. hbase> create 't1', {NAME => 'f1'}, {NAME => 'if1', LOCAL_INDEX=>'COMBINE_INDEX|INDEXED=f1:q1:8|rowKey:rowKey:10,UPDATE=true'}

可以通过指定SPLITS_FILE的值指定分区文件,如果分区信息比较少,也可以直接用SPLITS分区。我们可以通过如下命令建一个分区表,指定第一步中生成的分区文件:

create 'split_table_test', 'cf', {SPLITS_FILE => 'region_split_info.txt'}

假如我还想对hbase表做一个SNAPPY压缩,应该怎么写呢?

create 'split_table_test',{NAME =>'cf', COMPRESSION => 'SNAPPY'}, {SPLITS_FILE => 'region_split_info.txt'}

这里注意,一定要将分区的参数指定单独用一个大括号扩起来,因为分区是针对全表,而不是针对某一个column family。

下面,我们登陆一下master的web页面<Hmaster:60010>,查看一下hbase的表信息,找到刚刚新建的预分区表,进入查看region信息:

我们看到第一个region是没有startkey的,最后一个region是没有stopkey的。

 

 

hbase建表预分区的2种方法 Hbase自带了两种pre-split的算法,分别是HexStringSplit和UniformSplit。以下案例建表并设置预分区,分别测试以下2种方法。1.HexStringSplit算法。2.UniformSplit算法。示例:rowkey以日期为前缀。都分发到对应的region。 阅读详情

相关推荐

Hbase预分区与优化

1. Hbase设计七大原则 1.1)每个region的大小应该控制在10G到50G之间; 1.2)一个表最好保持在 50到100个 region的规模; 1.3)每个cell最大不应该超过10MB 如果超过,应该有些考虑业务拆分,如果实在无法拆分,那就只能使用mob; 1.4)我们设置一个列族 1.5)列族名必须尽量短 因为我们知道在存储的时候,每个keyvalue都会包含列族名; 1.6)如果一个表存在一个以上的列族,那么必须要注意,不同列族之间行数相差不要太大。 例如列族A有10万行

GavinKai 3122

hbase 预分区设计

hbase 预分区设计的三种方式,还有一个java API的方式

m0_72168501的博客 1471

HBase数据的导入和预分区

文章目录HBase数据的导入和预分区HBase数据导入1.准备数据2.使用ImportTsv将csv文件直接导入HBase中步骤1:在Hbase中创建一张表ns1:in_table步骤2:将data.csv导入到ns1:in01中步骤3:查看ns1:in01中的数据3.使用Completebulkload导入数据1.将原始的数据文件生成HFile存储在HDFS上2.将生成HFile中的数据导入HB...

qq_43502858的博客 1527

【HBase】带你了解一哈HBase的各种预分区

目录简单了解概述设置预分区一、手动指定预分区二、使用16进制算法生成预分区三、将分区规则写在文本文件中四、使用JavaAPI进行预分区 简单了解 概述 由上图可以看出,每一个表都有属于自己的一个Region,但Region内的数据达到10GB时,会进行分割,但仍会在同一个RegionServer上,而预分区的作用主要是增加数据读写效率、负载均衡、防止数据倾斜、方便集群容灾调度Region和优化...

关于我转生变成程序猿这档事 913

HBase的预分区

文章目录HBase预分区是什么为什么要设置预分区如何设置预分区 HBase预分区是什么 HBase中的预分区就是在创建表格之前,指定好rowkey在哪个范围的数据会落到哪个分区中,因为HBase会按照字典顺序把rowkey进行排序的,所以指定好rowkey范围即可让对应的数据落到对应的分区中去。 为什么要设置预分区 设置了预分区之后,一个分区就会落到一个region中去,设置好之后会有如下好处: 提高数据读写效率 某一个范围的数据都落在同一个区域,在提交读写请求的时候,就能很快知道数据的位置上或者数据应该

weixin_43854618的博客 931

HBase的预分区、rowKey设计技巧、协处理器

文章目录HBase的预分区1、为何要预分区?2、如何预分区?3、如何设定预分区?1、手动指定预分区2、使用16进制算法生成预分区3、分区规则创建于文件中4、使用JavaAPI创建预分区HBase的rowKey设计技巧1 rowkey长度原则2 rowkey散列原则3 rowkey唯一原则什么是热点HBase的协处理器1、 起源2、 协处理器有两种: observer 和 endpoint3、协处理器加载方式4、 协处理器卸载5、 协处理器Observer应用实战第一步:HBase当中创建第一张表proc1第

bitmao888的博客 634

hbase java 分区_HBase预分区方法

(what)什么是预分区?HBase表在刚刚被创建时,只有1个分区(region),当一个region过大(达到hbase.hregion.max.filesize属性中定义的阈值,默认10GB)时,表将会进行split,分裂为2个分区。表在进行split的时候,会耗费大量的资源,频繁的分区对HBase的性能有巨大的影响。HBase提供了预分区功能,即用户可以在创建表的时候对表按照一定的规则分区。...

weixin_30036289的博客 777

Ollama本地大模型部署指南:从核心原理到实战避坑

大语言模型(LLM)作为人工智能领域的核心技术,通过海量数据训练获得强大的语言理解和生成能力。其工作原理基于Transformer架构,通过自注意力机制处理序列数据,在文本生成、代码编写和对话系统等场景展现出巨大价值。随着开源模型的普及,本地部署成为关注焦点,它解决了数据隐私和定制化需求,但面临环境配置和资源管理的挑战。Ollama作为开源工具,通过封装模型格式和统一API,简化了本地部署流程,支持GPU加速和性能调优,让开发者能够快速集成到IDE和自动化脚本中,实现高效的本地AI应用部署。

weixin_30915951的博客 451

一篇文章完成Hbase入门

HBase是一种分布式、可扩展、支持海量数据存储的NoSQL数据库。

lydms的博客 1万+

嵌入式充电协议深度解析:从QC到PD3.1的技术演进与实战应用

本文深入解析了从QC到PD3.1的嵌入式充电协议技术演进与实战应用。通过电压谈判、协议芯片设计、Type-C接口优化等关键技术,详细介绍了快充协议在嵌入式系统中的实现挑战与解决方案,包括兼容性测试、EMC问题处理及空间限制创新设计,为开发者提供了宝贵的实践经验。

weixin_29194817的博客 419

用OpenIPC复活你的旧摄像头:手把手教你给君正T31芯片设备刷开源固件

本文详细介绍了如何使用OpenIPC项目为君正T31芯片的旧摄像头刷入开源固件,解锁更多功能并延长设备寿命。从硬件识别、风险控制到详细刷机步骤和后期配置,手把手教你将闲置摄像头改造为智能监控设备,实现隐私可控、功能扩展等优势。

weixin_30790841的博客 763

Hbase的预分区与Hbase的rowKey的设计原则

Hbase的预分区与Hbase的rowKey的设计原则 文章目录Hbase的预分区与Hbase的rowKey的设计原则1、HBase的预分区1.1、为何要预分区?1.2、如何预分区?1.3、如何设定预分区?1.3.1、手动指定预分区1.3.2、使用16进制算法生成预分区1.3.3、分区规则创建于文件中1.3.4、使用JavaAPI创建预分区2、HBase的rowKey设计技巧2.1 rowkey...

Mr_Yang888的博客 1万+

浪潮服务器ESXI6.7部署实战:手动集成RAID驱动避坑指南

本文详细介绍了在浪潮服务器上部署ESXI6.7时手动集成RAID驱动的完整流程和避坑指南。从驱动获取、解压技巧到封装实战,逐步解决国产服务器常见的驱动缺失问题,特别针对PM8060 RAID卡提供具体解决方案,帮助IT运维人员顺利完成ESXI部署。

weixin_33725722的博客 461

HBase预分区、HBase Shell预分区、HBase Shell读取split文件预分区、HBase Java API预分区 09

1. HBase的预分区概念 HBase表被创建时,只有1个Region,当一个Region过大达到默认的阀值时(默认10GB大小),HBase中该Region将会进行split,分裂为2个Region,以此类推。 表在进行split的时候,会耗费大量的资源,频繁的分区对HBase的性能有巨大的影响。 所以,HBase提供了预分区功能,即用户可以在创建表的时候对表按照一定的规则分区。 预分区是默认...

啊策策大数据社区 3419

单细胞数据导入实战:Read10X函数常见报错与解决方案

本文针对单细胞转录组分析中Read10X函数数据导入的常见问题,提供了详细的实战解决方案。重点解析了因文件路径错误、压缩文件未解压、版本命名不符及内存不足导致的报错,并给出了检查路径、正确解压、重命名文件、调整参数及优化内存等具体操作步骤,帮助用户高效完成单细胞数据导入,为后续分析奠定坚实基础。

weixin_28235513的博客 237

AI+AB测试提升电商主图点击率实战指南

在电商运营中,主图点击率(CTR)是衡量商品吸引力的核心指标,直接影响转化率和订单增长。通过AI技术批量生成高质量主图素材,结合数据驱动的AB测试方法,可以显著提升点击率。AI工具如MidJourney和Stable Diffusion能够快速生成多样化视觉方案,而自动化处理流水线则确保素材规格统一。AB测试体系通过多维变量控制和流量分配策略,科学验证不同素材效果。这种方法特别适用于需要快速迭代的电商场景,某女装店铺案例显示CTR从1.2%提升至3.8%,验证了AI+数据协同优化的技术价值。

weixin_29058331的博客 298

【HBase】HBase 自动拆分和预分区

文章目录一、Region 自动拆分二、Region 自动拆分策略2.1、ConstantSizeRegionSplitPolicy2.2、IncreasingToUpperBoundRegionSplitPolicy2.3、SteppingSplitPolicy2.4、KeyPrefixRegionSplitPolicy2.5、DelimitedKeyPrefixRegionSplitPolicy...

w1992wishes的博客 4453

【对比学习+分割】CRIS:CLIP驱动RIS图像分割(CVPR 2022)

CRIS: CLIP-Driven Referring Image Segmentation

这个博客太懒了什么都没说 3324

HBase预分区方法

HBase预分 1.(what)什么是预分区? HBase表在刚刚被创建时,只有1个分区(region),当一个region过大(达到hbase.hregion.max.filesize属性中定义的阈值,默认10GB)时, 表将会进行split,分裂为2个分区。表在进行split的时候,会耗费大量的资源,频繁的分区对HBase的性能有巨大的影响。 HBase提供了预分区功能,即用户可以在创建表的时候对表按照一定的规则分区。 2.(why)预分区的目的是什么? 减少由于region spli.

yang灬仔 1610

Allegro172版本DFM功能介绍

Allegro172版本提供了实时DFM检查的功能,让违反要求的地方实时以DRC的形式报出来,让加工不可加工因素在设计的时候同步避免。打开Constraint,选择Manufacturing, 所有DFM相关DRC都在这。把所有下面DRC开关(DFM,DFA,DFT)都选择on,选择OK。这个规则和物理和间距规则等等都没有关系,单独的一个加工规则。这些DRC大部分是正常的,正常的可以去修改规则来消除。等待DRC刷新,板子上会出现很多DRC,类似下图。下面介绍如何调用和产生DFM规则。一直往下点击next。

weixin_54787054的博客 1336

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

HBase-RowKey设计和预分区

本篇总结记录了在防止hbase产生热点问题时的解决方案,主要从两个方面进行分析,一设计合理的rowkey,将数据集进行合理的散列。二设计合理的预分区,将散列后的数据集均匀的插入到region中,以防止hbase产生数据倾斜等热点问题。后续遇到更好的设计方案再及时更新。

东境物语 2211

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

hbase 预分区、RowKey设计、内存优化、基础优化

  每一个region维护着startRow与endRowKey,如果加入的数据符合某个region维护的rowKey范围,则该数据交给这个region维护。那么依照这个原则,将数据所要投放的分区提前大致的规划好,以提高HBase性能   预估未来半年或者一年数据,计算出分区数量(如100个);   确定分区键 … 注: ,和数据长短无关,如 前缀的设置必须合理,否则数据写入一个Region   创建splits.txt文件 执行: 注: 即使文件中的,依然会自行排序  一条数据的唯一标识就是row

不是一枚开发 7万+

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

HBase 创建表预分区

分区HBase中,表会被划分为1…n个Region,被托管在RegionServer中。Region二个重要的属性:StartKey与 EndKey表示这个Region维护的rowKey范围,当我们要读/写数据时,如果rowKey落在某个start-end key范围内,那么就会定位到目标region并且读/写到相关的数据。 默认地,当我们只是通过HBaseAdmin指定TableDescript

Nougats的博客 1万+

HBase优化(预分区、RowKey设计)

文章目录HBase优化1、预分区1.1 手动设定预分区1.2 生成十六进制序列预分区1.3 按照文件设置规则预分区1.4 使用JavaAPI创建预分区(不常用)2、RowKey的设计案例优化:设计一个同时满足以上两个需求的RowKey预分区优化提前将分区号和月份进行对应优化需求23、内存优化4、hbase-site.xml基础优化 HBase优化 1、预分区 每一个region维护着startRowKey与endRowKey,如果加入的数据符合某个region维护的rowKey范围,则该数据交给这个regi

ZYN的博客 1349

Hbase优化之预分区

    如果在hbase shell中使用create建表时只写了表名和列族名,那么这张表将只有一个region ,当一个region的大小超过阈值时会自动split成两个,但split操作会带来资源消耗。region个数太少时,在数据量大、访问量大,或被批处理程序读写情况下性能可能会很差,并且伴随大批量读写而来的GC可能会使regionserver宕机,接着region被transit到其他节点...

fantuanbaba的博客 2169

HBase预分区、rowKey设计、协处理、调优

12、HBase与MapReduce的集成 HBase当中的数据最终都是存储在HDFS上面的,HBase天生的支持MR的操作,我们可以通过MR直接处理HBase当中的数据,并且MR可以将处理后的结果直接存储到HBase当中去 需求:读取HBase当中一张表的数据,然后将数据写入到HBase当中的另外一张表当中去。注意:我们可以使用TableMapper与TableReducer来实现从HBase当...

Imflash的博客 802
上一篇: Scala闭包定义及用法
下一篇: 预期数据下HBase的预分区的实现
那记忆微凉
博客等级 码龄9年 412粉丝 387原创
评论 4
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值