HBase拆分策略

2023-10-27

转载自: http://blog.javachen.com/2014/01/16/hbase-region-split-policy.html

Region 概念

Region是表获取和分布的基本元素,由每个列族的一个Store组成。对象层级图如下:

Table       (HBase table)
    Region       (Regions for the table)
         Store          (Store per ColumnFamily for each Region for the table)
              MemStore        (MemStore for each Store for each Region for the table)
              StoreFile       (StoreFiles for each Store for each Region for the table)
                    Block     (Blocks within a StoreFile within a Store for each Region for the table)

Region 大小

Region的大小是一个棘手的问题,需要考量如下几个因素。

  • Region是HBase中分布式存储和负载均衡的最小单元。不同Region分布到不同RegionServer上,但并不是存储的最小单元。
  • Region由一个或者多个Store组成,每个store保存一个columns family,每个Strore又由一个memStore和0至多个StoreFile 组成。memStore存储在内存中, StoreFile存储在HDFS上。
  • HBase通过将region切分在许多机器上实现分布式。也就是说,你如果有16GB的数据,只分了2个region, 你却有20台机器,有18台就浪费了。
  • region数目太多就会造成性能下降,现在比以前好多了。但是对于同样大小的数据,700个region比3000个要好。
  • region数目太少就会妨碍可扩展性,降低并行能力。有的时候导致压力不够分散。这就是为什么,你向一个10节点的HBase集群导入200MB的数据,大部分的节点是idle的。
  • RegionServer中1个region和10个region索引需要的内存量没有太多的差别。

最好是使用默认的配置,可以把热的表配小一点(或者受到split热点的region把压力分散到集群中)。如果你的cell的大小比较大(100KB或更大),就可以把region的大小调到1GB。region的最大大小在hbase配置文件中定义:

 <property>
    <name>hbase.hregion.max.filesize</name>
    <value>10 * 1024 * 1024 * 1024</value>
  </property>

说明:

  1. 当region中的StoreFile大小超过了上面配置的值的时候,该region就会被拆分,具体的拆分策略见下文。
  2. 上面的值也可以针对每个表单独设置,例如在hbase shell中设置:
create 't','f'
disable 't'
alter 't', METHOD => 'table_att', MAX_FILESIZE => '134217728'
enable 't'

Region 拆分策略

Region的分割操作是不可见的,因为Master不会参与其中。RegionServer拆分region的步骤是,先将该region下线,然后拆分,将其子region加入到META元信息中,再将他们加入到原本的RegionServer中,最后汇报Master。

执行split的线程是CompactSplitThread。

自定义拆分策略

可以通过设置RegionSplitPolicy的实现类来指定拆分策略,RegionSplitPolicy类的实现类有:

ConstantSizeRegionSplitPolicy
    IncreasingToUpperBoundRegionSplitPolicy
        DelimitedKeyPrefixRegionSplitPolicy
        KeyPrefixRegionSplitPolicy

对于split,并不是设置了hbase.hregion.max.filesize(默认10G)为很大就保证不split了,需要有以下的算法:

  • IncreasingToUpperBoundRegionSplitPolicy,0.94.0默认region split策略。根据公式min(r2*flushSize,maxFileSize)确定split的maxFileSize,其中r为在线region个数,maxFileSize由hbase.hregion.max.filesize指定。
  • ConstantSizeRegionSplitPolicy,仅仅当region大小超过常量值(hbase.hregion.max.filesize大小)时,才进行拆分。
  • DelimitedKeyPrefixRegionSplitPolicy,保证以分隔符前面的前缀为splitPoint,保证相同RowKey前缀的数据在一个Region中
  • KeyPrefixRegionSplitPolicy,保证具有相同前缀的row在一个region中(要求设计中前缀具有同样长度)。指定rowkey前缀位数划分region,通过读取table的prefix_split_key_policy.prefix_length属性,该属性为数字类型,表示前缀长度,在进行split时,按此长度对splitPoint进行截取。此种策略比较适合固定前缀的rowkey。当table中没有设置该属性,或其属性不为Integer类型时,指定此策略效果等同与使用IncreasingToUpperBoundRegionSplitPolicy。

IncreasingToUpperBoundRegionSplitPolicy

这是0.94.0默认region split策略。根据根据公式min(r2*flushSize,maxFileSize)确定split的maxFileSize,这里假设flushSize为128M:

第一次拆分大小为:min(10G,1*1*128M)=128M
第二次拆分大小为:min(10G,3*3*128M)=1152M
第三次拆分大小为:min(10G,5*5*128M)=3200M
第四次拆分大小为:min(10G,7*7*128M)=6272M
第五次拆分大小为:min(10G,9*9*128M)=10G
第五次拆分大小为:min(10G,11*11*128M)=10G

可以看到,只有在第四次之后的拆分大小才为10G

配置拆分策略

你可以在hbase配置文件中定义全局的拆分策略,设置hbase.regionserver.region.split.policy的值即可,也可以在创建和修改表时候指定:

// 更新现有表的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");

说明:

  1. 上面的不同策略可以在不同的业务场景下使用,特别是第三种和第四种一般关注和使用的比较少。
  2. 如果想关闭自动拆分改为手动拆分,建议同时修改hbase.hregion.max.filesizehbase.regionserver.region.split.policy值。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

HBase拆分策略 的相关文章

  • Java分割字符串的表现

    这是我的应用程序中的当前代码 String ids str split 在分析应用程序时 字符串分割花费了不可忽视的时间 另外 split方法采用正则表达式 这在这里是多余的 我可以使用什么替代方法来优化字符串分割 是StringUtils
  • 使用 GNU Parallel 和 Split

    我正在将一个相当大的文件加载到 postgresql 数据库中 为此 我首先使用split在文件中获取较小的文件 每个 30Gb 然后我使用以下命令将每个较小的文件加载到数据库中GNU Parallel and psql copy 问题是大
  • 错误:org.apache.hadoop.hbase.MasterNotRunningException:null+hbase+hadoop

    我最近用两台机器 在ubuntu上 配置了hadoop集群 到目前为止效果很好 但是当我尝试在上面的 hadoop 集群上配置 hbase 时 它 显示错误 这就是我所做的 我有两台机器 192 168 1 110 Hadoop主站 192
  • 正则表达式解析类似 Javascript 函数调用的语法

    我有以下数据可能性 fnname fnname value fnname value valueN 我需要一种方法用 javascript 正则表达式解析它以获得数组 fnname fnname value fnname value val
  • 根据可能不存在于所有值上的分隔符将 pandas 列分成两部分

    我的数据框的一列看起来像这样 application blah 3 14 xyz 5 2 abc 代表软件 版本 我正在努力实现这样的目标 application name ver blah 3 14 blah 3 14 xyz 5 2 x
  • PHP 字符串分割

    我需要将一个字符串拆分为 2 2 3 3 个字符的块 并且可以通过使用 unpack 在 Perl 中执行此操作 unpack A2A2A3A3 thisisloremipsum 然而 相同的函数在 PHP 中不起作用 它给出以下输出 Ar
  • 如何将字符串分割成等长的子串?

    我正在寻找一个elegant way in Scala http www scala lang org 将给定字符串拆分为固定大小的子字符串 序列中的最后一个字符串可能更短 So split Thequickbrownfoxjumps 4
  • 如何定义Titan Graph DB Vertex的数据类型?

    我正在使用 Titan 和 Blueprint API 创建图形数据表 我使用 HBase 作为后端 我知道如何定义关键索引的数据类型 Example TitanKey name graph makeType name name dataT
  • 从文件读取时在 clojure 中分割行

    我正在学校学习 clojure 马上就要考试了 我只是在做一些事情以确保我掌握了窍门 我试图从文件中逐行读取 正如我所做的那样 只要有 我就想分割该行 到目前为止 这是我的代码 defn readFile map fn line cloju
  • regexp_split_to_table 和 row_number

    我有一个包含字符串数据的表 如下所示 id string data 1 red green blue 2 orange 3 purple cyan 我需要将字符串数据拆分为具有行号的项目 id num item 1 1 red 1 2 gr
  • 用空元素拆分 Java 中的字符串

    我正在逐行读取 csv 文件 一行可以如下所示 String str 10 1 现在我想根据 来分割 String splitted str split 现在的问题是 这只会产生 2 个元素 但我想要 5 个元素 前两个元素应包含 10 和
  • 如何在R中将文本拆分为两个有意义的单词

    这是我的数据框 df 中的文本 其中有一个名为 problem note text 的文本列 SSCIssue 钞票分配器故障执行检查 分配器故障 要求商店取出钞票分配器并将其放回去 仍然错误消息说前门已打开 因此 CE attn req联
  • 将一组对象分成一定数量的组的算法?

    例如 假设我有一个 2D 像素数组 换句话说 一个图像 我想将它们排列成组 以便组数加起来完美达到某个数字 例如 另一个 2D 中的总项目数 像素阵列 目前 我尝试使用比率和像素的组合 但这在完美整数比率 例如 1 2 1 3 1 4 等
  • 如何拆分 XML

    我的第一篇文章在这里 我已经搜索过 但没有找到我要找的东西 我不太确定需要什么技术来完成以下操作 我使用 Mule 3 3 CE 我需要拆分 XML 文件 我需要在每个分割的 XML 中保留 rootElement 及其属性 所有 XML
  • 当时间戳不属于索引时,如何按时间戳对数据帧进行切片?

    如何使用时间戳来分割我的 pandas 数据帧 我打电话时得到以下价格df30m Timestamp Open High Low Close Volume 0 2016 05 01 19 30 00 449 80 450 13 449 80
  • 拆分具有多行文本和单行文本的行

    我试图弄清楚如何拆分数据行 其中行中的 B C D 列包含多行 而其他列不包含多行 我已经弄清楚如何拆分多行单元格 如果我将这些列复制到新工作表中 手动插入行 然后运行下面的宏 仅适用于 A 列 但我在编码时迷失了休息 Here s wha
  • 将数组拆分为特定数量的块

    我知道array chunk 允许将数组拆分为多个块 但块的数量根据元素的数量而变化 我需要的是始终将数组拆分为特定数量的数组 例如 4 个数组 以下代码将数组分为 3 个块 两个块各有 2 个元素 1 个块有 1 个元素 我想要的是将数组
  • strtok - 如何避免换行并放入字符串数组?

    如果我欺骗了主题 我真的很抱歉 我在这里搜索但没有结果 我有代码 void split char str char splitstr char p char splitbuf 32 int i 0 p strtok str while p
  • Golang中按长度分割字符串

    有谁知道如何在 Golang 中按长度分割字符串 例如 每 3 个字符分割 helloworld 那么理想情况下它应该返回一个 hel low orl d 数组 或者 一个可能的解决方案是在每 3 个字符后附加一个换行符 所有的想法都非常感
  • 需要在R中跳过不同数量的行

    我正在使用以下代码来处理我的数据 但最近我意识到使用skip 27 在数据开始之前跳过存储在我的文件中的信息 不是一个好的选择 因为每个文件中要跳过的行数不同我的目标是读取存储在多个文件夹中的各种txt文件 并非所有文件都有相同的列数 列的

随机推荐

  • 【动手学习pytorch笔记】37.5 BERT微调

    BERT微调 import json import multiprocessing import os import torch from torch import nn from d2l import torch as d2l bert
  • tkinter简单选取文件或文件夹绝对路径

    选取文件夹 选取文件夹 def get folder root tkinter Tk root withdraw 获取文件夹路径 path filedialog askdirectory 返回文件夹路径 return path 选取文件路径
  • 阿里云智能编码插件Cosy,让你的开发过程既高效又轻松

    阿里云智能编码插件 Alibaba Cloud AI Coding Assistant 是一款AI编程助手 它提供代码智能补全和代码示例搜索能力 帮助你更快更高效地写出高质量代码 让你的开发过程既高效又轻松 点击立即体验 阿里云智能编码 你
  • 用mac做开发真的比用windows好么?

    近几年发现周围的程序员们使用mac的越来越多了 可是本人貌似对mac并不感冒 依旧在使用windows的队伍中 感觉win10用着也不错啊 虽然不怎么用mac 但是有一点不得不说mac的外形的确很酷 这一点不得不承认 也可能有一部分人就因为
  • Android开发-在Android应用里实现自动发送邮件的功能

    前言 前段时间由于项目的需要 就是在Android应用里的用户反馈功能需要当用户输入反馈的文本信息后 用户点击提交按钮自动把反馈的文本信息已发送邮件的形式发送给开发者 要实现这个功能 首先需要两个邮箱账号 一个是发送方的邮箱地址 一个是接收
  • AXI Uartlite IP AXI驱动代码

    说明 AXI Uartlite IP AXI驱动代码 根据博客 Xilinx AXI Uartlite IP核的使用 有问题联系微信 Crazzy M 效果简单展示 module uart parameter UART REG NUM 2
  • CAP 可能是CAP理论的最好解释

    一篇非常精彩的解释CAP理论的文章 翻译水平有限 不准确之处请参考原文 还请见谅 Chapter 1 Remembrance Inc Your new venture Last night when your spouse apprecia
  • centos7 监控文件内容变化打印

    tail命令可以输出文件末尾的内容 至于输出多少看你指定多少 最少是10行 使用 一下命令可以伴随文件内容的增长实时的查看文件内容的变化 tail f file name
  • Springboot + MySQL+ JPA Ⅰ 项目新建

    最近在学习JPA的 在此跟大家分享一下 持续更新中 开发工具IDEA 一 new project 选择 Spring Initializr Next 二 自定义项目名 我这边时smjdemo 三 选择需要依赖的包 Lombok 本人喜欢用
  • 使用代理服务获取网页源代码测试

    import requests url 输入测试访问网址 headers User Agent Mozilla 5 0 Windows NT 10 0 Win64 x64 AppleWebKit 537 36 KHTML like Geck
  • 一键开启mysql的审计功能(无需安装插件)

    本文所使用数据库为mysql8 0 5 x版本的mysql上没试过一下步骤调用审计功能 无需下载任何插件 两行命令就能搞定 一 首先查看审计配置情况 show global variables like log timestamps sho
  • Spring Boot 笔记 - 注解(四)-- @SpringBootApplication

    Many Spring Boot developers like their apps to use auto configuration component scan and be able to define extra configu
  • 二、Java代码实现冒泡排序

    冒泡排序描述 关键 相邻的两个元素进行比较 依次比较数组中相邻两个元素大小 若 a j gt a j 1 则交换两个元素 两两都比较一遍 就是一轮冒泡 结果是一轮冒泡后最大的元素排到了最后 重复以上的步骤 直到整个数组有序就行了 冒泡的优化
  • 字典序算法详解

    一 字典序 字典序 就是按照字典中出现的先后顺序进行排序 1 单个字符 在计算机中 25个字母以及数字字符 字典排序如下 0 lt 1 lt 2 lt lt 9 lt a lt b lt lt z 比如在 python 中 0 lt 9 l
  • R语言初学者必备的10个实用函数

    R语言初学者必备的10个实用函数 R语言是一种流行的数据分析和统计建模工具 它提供了丰富的函数和库来处理和分析数据 对于初学者来说 掌握一些常用的实用函数将使他们更加高效地使用R语言进行数据处理和可视化 本文将介绍10个初学者必备的实用函数
  • CPU上下文切换

    文章目录 CPU上下文切换 什么是CPU上下文 进程上下文切换 特权模式切换 进程上下文切换与系统调用的区别 什么时候会切换进程上下文 线程上下文切换 中断上下文切换 监控上下文切换 vmstat pidstat 减少上下文切换 CPU上下
  • 生命在于学习——网站Getshell的方法

    PS 本篇文章仅用于学习笔记记录 不可用于其他用途 一 通用getshell方法 1 任意文件上传 1 注意编程语言 asp aspx php jsp 2 上传成功 但是访问直接下载文件 以文本展示 原因 文件没有被解析 3 上传成功 蚁剑
  • Burp Suite软件常用模块

    目录 1 Proxy 代理模块 2 Repeater模块 请求重放 3 Intruder模块 入侵自动化攻击 Intruder的4种攻击模式 1 Sniper模式 狙击手模式 2 Battering ram模式 攻城锤模式
  • 解决HC05蓝牙模块主从配对失败及AT模式设置方案

    解决HC05蓝牙模块主从配对失败及AT模式设置方案 原创文章 转载请注明 本文为电脑端配置 关于连线 关于串口调试工具 关于AT指令与蓝牙模块配对 关于测试验证 原创文章 转载请注明 本文为电脑端配置 最近在做一个开源的Vorpal Hex
  • HBase拆分策略

    转载自 http blog javachen com 2014 01 16 hbase region split policy html Region 概念 Region是表获取和分布的基本元素 由每个列族的一个Store组成 对象层级图如