`

Hadoop HBase中split原理学习

 
阅读更多
在Hbase中split是一个很重要的功能,Hbase是通过把数据分配到一定数量的region来达到负载均衡的。一个table会被分配到一个或多个region中,这些region会被分配到一个或者多个regionServer中。在自动split策略中,当一个region达到一定的大小就会自动split成两个region。table在region中是按照row key来排序的,并且一个row key所对应的行只会存储在一个region中,这一点保证了Hbase的强一致性 。
在一个region中有一个或多个stroe,每个stroe对应一个column families(列族)。一个store中包含一个memstore 和 0 或 多个store files。每个column family 是分开存放和分开访问的。

预split(pre-splitting)
预split就是在建表时,指定拆分的各key,可以指定多份,在HBase shell下执行就像这样:
create 'test_table', 'f1', SPLITS=> ['a', 'b', 'c']
或用外部文件表示,每一行为一个切分点(key)
$ echo -e "a\nb\nc" >/tmp/splits
create 'test_table', 'f1', SPLITSFILE=>'/tmp/splits'

自动split
如果你之前没听过region还要split也不要紧,HBase会在region量达到一定程度时,自己进行 split。什么时候自动进行split呢,这是根据Split Policy来决定的,0.94之前是一个定值 (ConstantSizeRegionSplitPolicy),之后改成根据一个公式(IncreasingToUpperBoundRegionSplitPolicy) 来计算是否要split

手动split
自动split在前面说了并不如自己管理split靠谱(但这也增加了程序员的运维成本), 如果你也下定决心要自己动手,那还需要修改配置文件hbase-site.xml中的 hbase.hregion.max.filesize(对,就是前面公式里的第二项)为一个较大的值,比如100G。 因此这里需要说下手动split。只需要在HBase shell中执行一条语句:
split 'regionName', 'splitKey'
更多用法可以在HBase shell中查。另外也可以在HBase的GUI管理界面中直接操作,如果split point不写,相当于只指定了表要被切分,则HBase会自行将表切分一次。经过几次试验, 这类“自动”切分对于少量数据(比如100条)或没有数据的region不会切分, 每个region都会被测试一次要不要切分。

在org.apache.Hadoop.hbase.regionserver包中,可以找到这么几个自带的splitPolicy: ConstantSizeRegionSplitPolicy
IncreasingToUpperBoundRegionSplitPolicy
KeyPrefixRegionSplitPolicy。

ConstantSizeRegionSplitPolicy:按固定长度分割region,固定长度取值优先获取table的”MAX_FILESIZE” 值,若没有设定该属性,则采用在hbase-site.xml中配置的hbase.hregion.max.filesize值,在0.94版本中这个值的缺省值已经被调整为:10 * 1024 * 1024 * 1024L 也就是10G,网上很多关于 hbase.hregion.max.filesize 默认值 1G的文章应该都是基于0.92的hbase的。这个在使用中需要明确具体的hbase版本号。这个策略是0.94版本之前默认使用的,采用该策略后,当table的某一region中的某一store大小超过了预定的最大固定长度时,对该region进行split。splitPoint算法的选择还是依据“数据对半”原则,找到该region的最大store的中间长度的rowkey进行split。

IncreasingToUpperBoundRegionSplitPolicy:按照region数量累增划分region,该策略为Hbase 0.94默认使用的策略,采用该策略分割的region大小是不相等的,每次新region的大小随着region数量的增多而增大。具体增长方法为:
Min (R^2 *  'MEMSTORE_FLUSHSIZE'||'hbase.hregion.memstore.flush.size', “hbase.hregion.max.filesize”);
其中R 为当前这个region所在regionserver中对应此table的region数,MEMSTORE_FLUSHSIZE 为table创建时指定大小,若table指定了此属性则忽略下面的hbase.hregion.memstore.flush.size 。

hbase.hregion.memstore.flush.size 为hbase-site中设定大小 默认128M
hbase.hregion.max.filesize 为hbase-site中设定的单个region大小,默认10G


每次region大小是取上述两个size中较小的那个。

假设使用hbase.hregion.memstore.flush.size 128M, hregion.max.filesize为10G, 那么每次region增长情况为:512M,1152M,2G,3,2G,4,6G,6,2G,etc。当region增长到9个时,9*9*128M/1024=10.125G >10G,至此以后region split大小都固定为10G。

KeyPrefixRegionSplitPolicy:指定rowkey前缀位数划分region,通过读取table的prefix_split_key_policy.prefix_length属性,该属性为数字类型,表示前缀长度,
在进行split时,按此长度对splitPoint进行截取。个人理解是rowkey前缀不相等,则划分region。此种策略比较适合固定前缀的rowkey。当table中没有设置prefix_split_key_policy.prefix_length属性,或prefix_split_key_policy.prefix_length属性不为Integer类型时,指定此策略效果等同与使用IncreasingToUpperBoundRegionSplitPolicy。

// 更新现有表的split策略  
         HBaseAdmin admin = new HBaseAdmin( conf);  
         HTable hTable = new HTable( conf, ”test” );  
         HTableDescriptor htd = hTable.getTableDescriptor();  
         HTableDescriptor newHtd = new HTableDescriptor(htd);  
         newHtd.setValue(HTableDescriptor.SPLIT_POLICY, KeyPrefixRegionSplitPolicy.class.getName());// 指定策略  
         newHtd.setValue(“prefix_split_key_policy.prefix_length”, ”2″);  
         newHtd.setValue("MEMSTORE_FLUSHSIZE", "5242880"); // 5M  
         admin.disableTable("test");  
         admin.modifyTable(Bytes.toBytes("test"), newHtd);  
         admin.enableTable("test");  


0.94版本之前使用的是ConstantSizeRegionSplitPolicy策略,此策略只是大于一个基本固定的阀值就允许split,而现在的策略则是store大小大于一个变化的阀值就允许split,什么意思呢,举个例子,当hbase相关split的属性都没有配置,采用默认,一张表刚建立,默认情况只有1个region,那么逻辑上是当这个region的store大小超过 1*1*1*flushsize = 128M(没有自己设置flushSize)时 才会允许split,如果达到这个值切分后,会有两个region,其中一个region中的某个store大小大于 2*2*2*flushsize = 512M 时,则允许split,如此计算下去,直到这个大小超过了hbase.hregion.max.filesize+ hbase.hregion.max.filesize*随机小数*hbase.hregion.max.filesize.jitter才允许split,基本也就固定了,如果粗劣的计算可以把这个hbase.hregion.max.filesize的大小作为最后的阀值,默认是10G,也就说当这个阀值变化到10G,这个阀值就基本上不再变化。

这种思想使得阀值达到一个基本固定的值之前先做了几次split,而这几次split的数据量很少,对hbase的影响也没有那么大,而且相当于数据导入量不大的时候就做了一次“预分region”,在一定意义上减少了以后的热点region的发生。

分享到:
评论
发表评论

文章已被作者锁定,不允许评论。

相关推荐

    混合场景下大规模 GPU 集群构建与实践.pdf

    混合场景下大规模 GPU 集群构建与实践.pdf

    29 螺栓组联接成本优化设计.rar

    1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。

    走向现代化数据分析架构:趋势与挑战.pdf

    走向现代化数据分析架构:趋势与挑战.pdf

    基于Matlab极化天线和目标之间的信号传输建模 matlab代码.rar

    1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。

    08-1 圆锥齿轮行星机构运动分析.rar

    1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。

    金融大数据存储实践.pdf

    金融大数据存储实践.pdf

    (源码)基于SpringCloudAlibaba的系统管理平台.zip

    # 基于Spring Cloud Alibaba的系统管理平台 ## 项目简介 本项目是一个基于Spring Cloud Alibaba框架的系统管理平台,采用前后端分离的模式,集成了微服务架构。前端基于RuoYiVue框架,后端采用Spring Boot、Spring Cloud Alibaba技术栈。注册中心和配置中心选型Nacos,权限认证使用Redis,流量控制框架选型Sentinel。 ## 项目的主要特性和功能 1. 用户管理完成系统用户配置,支持用户增删改查、权限分配等功能。 2. 部门管理配置系统组织机构(公司、部门、小组),支持树结构展现和数据权限。 3. 岗位管理配置系统用户所属担任职务。 4. 菜单管理配置系统菜单,操作权限,按钮权限标识等。 5. 角色管理角色菜单权限分配、设置角色按机构进行数据范围权限划分。 6. 字典管理对系统中经常使用的一些较为固定的数据进行维护。 7. 参数管理对系统动态配置常用参数。

    这是来自于的c++考试题目

    这是来自于的c++考试题目

    (源码)基于Python和KissFFT的音频处理系统.zip

    # 基于Python和KissFFT的音频处理系统 ## 项目简介 本项目是一个基于Python和KissFFT库的音乐音频处理系统。它利用Python的简洁语法和强大的数据处理能力,结合KissFFT库的高效傅里叶变换算法,实现对音频数据的分析、处理和转换。项目主要目标是处理音乐音频数据,进行特征提取、频谱分析、频率转换等操作,以便于后续的音乐生成、分析和识别等任务。 ## 项目的主要特性和功能 音频数据加载与预处理项目支持从MIDI文件加载音乐数据,并提供数据过滤、编码等预处理功能,以便于后续处理。 FFT算法实现利用KissFFT库实现快速傅里叶变换(FFT)算法,用于音频信号的频谱分析和频率转换。 音频数据可视化提供可视化工具,用于展示音频信号的频谱分布、音符稀疏性等信息。 模型训练与评估支持模型训练与评估,包括自编码器、LSTM等模型,用于音乐生成、预测等任务。

    PADSLayout 常用封装库 ORCAD 常用原理图元器件库

    PADSLayout 常用封装库 ORCAD 常用原理图元器件库 常用的都用,喜欢的朋友们抓紧拿下

    云原生数据库管控探索和实践.pdf

    云原生数据库管控探索和实践.pdf

    yolo算法-人脸情绪数据集-1020张图像带标签-积极的.zip

    yolo系列算法目标检测数据集,包含标签,可以直接训练模型和验证测试,数据集已经划分好,包含数据集配置文件data.yaml,适用yolov5,yolov8,yolov9,yolov7,yolov10,yolo11算法; 包含两种标签格:yolo格式(txt文件)和voc格式(xml文件),分别保存在两个文件夹中; yolo格式:<class> <x_center> <y_center> <width> <height>, 其中: <class> 是目标的类别索引(从0开始)。 <x_center> 和 <y_center> 是目标框中心点的x和y坐标,这些坐标是相对于图像宽度和高度的比例值,范围在0到1之间。 <width> 和 <height> 是目标框的宽度和高度,也是相对于图像宽度和高度的比例值

    基于Matlab的变压器短路故障仿真模型

    在本文中,我们利用Matlab软件建立了一个简单的电力系统模型,该模型由电力系统模块及测量模块组成,能够模拟变压器故障,对不同故障进行仿真波形分析。

    毕业设计&课设_基于 RK3588 的边缘预警项目(C++)(含多种功能,有详细架构、编译及使用说明).zip

    该资源内项目源码是个人的课程设计、毕业设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过严格测试运行成功才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。

    33 梯形截面管道结构尺寸的优化设计.rar

    1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。

    Java期末大作业指南-涵盖矩阵乘法与GUI应用开发-综合评估

    内容概要:本文档为大学课程Java程序设计的期末大作业指导书,涵盖了多个不同难度的任务,旨在测试学生的Java编程能力以及对Java GUI的设计理解和运用水平。任务包括使用for循环计算指定数学表达式的值、实现两个已定义矩阵相乘的操作、利用Java GUI构建简易的功能型应用程序——一个可以执行基本算术操作的计算器、以及一个小而有趣的游戏——网球接球挑战游戏。通过解决这些问题,学生将加深对Java编程环境及其相关API的理解和掌握,提高自身的编码实践能力和创新思考空间。 适合人群:适用于正在进行Java学习阶段的学生、对提升个人编程技能感兴趣的初学者或希望巩固基础的专业开发者。 使用场景及目标:本项目作为一次全面考察学生技术实力的大作业形式存在,旨在促使同学们回顾所学知识并在实践中深化记忆。此外,还可以作为一种教学工具来帮助新手快速入门Java语言和图形界面设计的相关技巧。 其他说明:需要注意的是,在解答过程中遇到困难的同学可以通过QQ讨论组向教师求助;然而,为了确保作业的公平公正,教师不会直接给出解决方案的具体方法论。

    C#ASP.NET养老院老人信息管理系统源码数据库 SQL2008源码类型 WebForm

    ASP.NET养老院老人信息管理系统源码 这是一款非常优秀的养老院老人信息管理系统。程序功能齐全,可选择性强。 管理员后台: 1、人员信息管理:老人信息管理、管理员信息管理、员工信息管理 2、公寓信息管理:添加公寓楼信息、管理公寓楼信息、添加公寓信息、管理公寓信息 3、公寓安排管理:添加公寓安排、公寓安排管理、缴费管理 4、健康管理信息管理:添加健康管理信息、管理健康管理信息 5、紧急联络人管理 6、意见信息管理 7、公告信息管理:添加公告信息、管理公告信息 8、出入信息管理:请假信息管理、访客记录管理、退住情况 员工后台: 1、人员信息管理:老人信息管理 2、健康管理信息管理:管理健康管理信息 3、紧急联络人管理 4、意见信息管理 5、公告信息管理:管理公告信息 6、出入信息管理:请假信息管理、访客记录管理、退住情况 老人后台: 1、修改个人信息 2、修改登陆密码 3、意见信息管理:发布意见信息、意见信息管理 4、查看公告信息

    毕业设计&课设_基于用户协同过滤的商品推荐系统:含多种管理功能,用 Java 等技术实现.zip

    该资源内项目源码是个人的课程设计、毕业设计,代码都测试ok,都是运行成功后才上传资源,答辩评审平均分达到96分,放心下载使用! ## 项目备注 1、该资源内项目代码都经过严格测试运行成功才上传的,请放心下载使用! 2、本项目适合计算机相关专业(如计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载学习,也适合小白学习进阶,当然也可作为毕设项目、课程设计、作业、项目初期立项演示等。 3、如果基础还行,也可在此代码基础上进行修改,以实现其他功能,也可用于毕设、课设、作业等。 下载后请首先打开README.md文件(如有),仅供学习参考, 切勿用于商业用途。

    Kettle 是Kettle E.T.T.L. Envirnonment只取首字母的缩写,这意味着它被设计用来帮助你实现你的

    什么是 Pentaho Pentaho Data Integration (PDI) 提供抽取、转换和加载 (ETL) 功能,使用统一的方式实现了一系列复杂的ETL过程。 如果你第一次接触 Pentaho,你可能会看到或听到 Pentaho 数据集成称为“Kettle”。Pentaho Data Integration 最初是一个名为“Kettle”的开源项目。术语 KETTLE 是一个递归术语,代表 Kettle Extraction Transformation Transport Load Environment。Pentaho 收购 Kettle 后,更名为 Pentaho Data Integration。其他 PDI 组件(例如Spoon、Pan和Kitchen)的名称最初是为了支持 ETL 产品的“烹饪”隐喻。 PDI 常见用途 PDI 客户端(也称为 Spoon)是一个桌面应用程序,使你能够构建转换以及安排和运行作业。 PDI 客户端的常见用途包括: 不同数据库和应用之间的数据迁移。 充分利用云、集群和大规模并行处理环境将大量数据集加载到数据库中。 数据清洗,步

Global site tag (gtag.js) - Google Analytics