hbase--walgroup源码分析

本文深入探讨HBase中WALGroup机制的原理与实现,介绍如何通过配置启用多WAL,提高写入性能约20%。文章详细解释了RegionGroup与WALGroup的概念,以及BoundedGroupingStrategy等策略的运作方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

欢迎关注本人公众号

在这里插入图片描述
本文介绍hbase的walgroup原理及实现

开启多wal

默认情况下,一个regionserver只有一个wal文件。 在HBase-5699之后,可以配置多个wal,在hbase-site.xml中,添加以下配置,既可开启多wal(同一个RS服务中):

<property>
    <name>hbase.wal.provider</name>
    <value>multiwal</value>
  </property>

具体有几个walgroup,实际是通过org.apache.hadoop.hbase.wal.BoundedGroupingStrategy#NUM_REGION_GROUPS的配置值来决定的,默认是org.apache.hadoop.hbase.wal.BoundedGroupingStrategy#DEFAULT_NUM_REGION_GROUPS=2

walgroup的格式为:providerId.regiongroup-0;providerId.regiongroup-1

在这里插入图片描述

  1. 写入性能较单WAL提升20%
  2. hbase.wal.regiongrouping.strategy = bounded(分组策略)
  3. hbase.wal.regiongrouping.numgroups = 2(组数量,可以根据盘数设置,默认是2)

这里有两个概念,一个是walgroup,一个是regiongroup,这两个是对应的关系

RegionGrouping策略 RegionGroupingStrategy

hbase提供了RegionGroup的策略接口RegionGroupingStrategy,他有三个实现,默认实现是BoundedGroupingStrategy

在这里插入图片描述

public static interface RegionGroupingStrategy {
    String GROUP_NAME_DELIMITER = ".";

    /**
     * Given an identifier and a namespace, pick a group.
     */
    String group(final byte[] identifier, byte[] namespace);
    void init(Configuration config, String providerId);
  }


BoundedGroupingStrategy中的默认实现:
public String group(byte[] identifier, byte[] namespace) {
    String idStr = Bytes.toString(identifier);

    //groupNameCache缓存了region到walgroup(或者说regiongroup)的映射关系。**

    // 这里是简单的轮询。
    //hbase集群重启以后,每个region对应的walgroup是会发生变化的。
    return computeIfAbsent(groupNameCache, idStr,
      () -> groupNames[getAndIncrAtomicInteger(counter, groupNames.length)]);
  }

NamespaceGroupingStrategy也是一个比较实用的策略。

可以通过配置hbase.wal.regiongrouping.strategy=bounded来指定分组策略,目前支持4中:
defaultStrategy(默认策略,与bounded相同),identity,bounded,namespace,对应类Strategies

static enum Strategies {
    defaultStrategy(BoundedGroupingStrategy.class),
    identity(IdentityGroupingStrategy.class),
    bounded(BoundedGroupingStrategy.class),
    namespace(NamespaceGroupingStrategy.class);

    final Class<? extends RegionGroupingStrategy> clazz;
    Strategies(Class<? extends RegionGroupingStrategy> clazz) {
      this.clazz = clazz;
    }
  }

策略修改以后,需要重启RS服务生效,所以,wals文件夹内的文件会迁移到oldwals中,然后RS开启时,根据策略重新在wals文件夹内生成新wal文件。sequence依然region级别递增。

初始化region时设置walGroup信息

在这里插入图片描述

在开启hbase服务时,RS服务会打开region,在此过程中,按照配置,打开一定数量的wal日志文件。如果从单个wal修改为多个,原先的wal会被删除,取而代之的是一个WAL组,如上图。

打开创建wal的代码在org.apache.hadoop.hbase.wal.AsyncFSWALProvider#createWAL

protected AsyncFSWAL createWAL() throws IOException {
    //这里只会调用一次[每个wal创建一次],因为上层有缓存(org.apache.hadoop.hbase.wal.AbstractFSWALProvider.getWAL)
    return new AsyncFSWAL(CommonFSUtils.getWALFileSystem(conf), CommonFSUtils.getWALRootDir(conf),
        getWALDirectoryName(factory.factoryId),
        getWALArchiveDirectoryName(conf, factory.factoryId), conf, listeners, true, logPrefix,
        META_WAL_PROVIDER_ID.equals(providerId) ? META_WAL_PROVIDER_ID : null,
        eventLoopGroup, channelClass);
  }

在写文件时,如何获取wal对象呢?在org.apache.hadoop.hbase.wal.RegionGroupingProvider#getWAL(org.apache.hadoop.hbase.client.RegionInfo)中根据region信息获取wal

public WAL getWAL(RegionInfo region) throws IOException {
    String group;
    if (META_WAL_PROVIDER_ID.equals(this.providerId)) {
      group = META_WAL_GROUP_NAME;
    } else {
      byte[] id;
      byte[] namespace;
      if (region != null) {
        id = region.getEncodedNameAsBytes();
        namespace = region.getTable().getNamespace();
      } else {
        id = HConstants.EMPTY_BYTE_ARRAY;
        namespace = null;
      }

//下面strategy.group的实现就在org.apache.hadoop.hbase.wal.BoundedGroupingStrategy#group中,轮询获取wal
      group = strategy.group(id, namespace);
    }
    WAL wal = getWAL(group);

    return wal;
  }

在HFSLOG

<think>嗯,用户遇到了一个Java程序运行时的错误,具体是执行`java -jar hbase-manager-admin-2.0.9.jar`时提示无法访问jar文件。首先,我需要分析可能的原因。 用户给出的路径是`~/software/hbase-manager-2.0.8-hbase-2.x/`,但尝试运行的jar文件版本是2.0.9,而目录名是2.0.8。这可能是一个版本不匹配的问题,用户可能下载了不同版本的jar文件,或者目录名没有更新。这时候需要检查文件名是否正确,是否存在拼写错误或者版本号不一致的情况。 接下来,用户执行命令的当前目录是否正确?用户显示的路径是在`hbase-manager-2.0.8-hbase-2.x`目录下,但可能该目录下并没有hbase-manager-admin-2.0.9.jar文件。这时候需要使用`ls`命令来确认该文件是否存在,或者是否有权限问题。 另外,文件权限也是一个常见的问题。如果jar文件没有可读权限,Java无法读取它,导致错误。这时候需要检查文件的权限设置,使用`ls -l`查看,并用`chmod`修改权限。 还有可能是文件损坏,虽然可能性较低,但如果用户下载过程中出现问题,可能导致jar文件不完整。这时候可以重新下载文件,或者检查文件的哈希值是否匹配。 综合这些可能性,我应该分步骤引导用户检查文件名、路径、权限以及文件完整性。同时,提醒用户注意版本号和目录结构的一致性,避免因路径错误导致的问题。需要确保用户能够逐步排查,找到具体原因,并给出相应的解决命令,比如ls、pwd、chmod等,帮助用户自己解决问题。</think>你遇到的错误信息 `Error: Unable to access jarfile hbase-manager-admin-2.0.9.jar` 表示 Java 无法找到或访问指定的 JAR 文件。以下是逐步排查和解决的建议: --- ### **1. 检查文件名和路径** - **现象分析**: 当前目录是 `hbase-manager-2.0.8-hbase-2.x`,但尝试运行的 JAR 文件版本为 `2.0.9`,可能存在文件名或路径不匹配。 - **操作步骤**: 在终端输入以下命令,确认 JAR 文件是否存在: ```bash ls -l hbase-manager-admin-*.jar ``` - 如果输出为空,说明文件不存在。 - 如果文件名是 `hbase-manager-admin-2.0.8.jar`,需修改命令中的版本号。 --- ### **2. 确认当前工作目录** - **现象分析**: 错误可能源于未在 JAR 文件所在目录下执行命令。 - **操作步骤**: 输入 `pwd` 确认当前目录是否为 `~/software/hbase-manager-2.0.8-hbase-2.x`。 如果不是,需切换到正确目录: ```bash cd ~/software/hbase-manager-2.0.8-hbase-2.x ``` --- ### **3. 检查文件权限** - **现象分析**: 如果 JAR 文件权限不足,Java 无法读取。 - **操作步骤**: 赋予文件可读权限: ```bash chmod +r hbase-manager-admin-2.0.9.jar ``` --- ### **4. 验证文件完整性** - **现象分析**: 文件可能因下载不完整或损坏导致无法访问。 - **操作步骤**: 重新下载 JAR 文件,或通过校验哈希值(如 MD5/SHA1)验证文件完整性。 --- ### **5. 指定绝对路径运行(备用方案)** 如果上述步骤无效,可尝试直接指定 JAR 文件的绝对路径: ```bash java -jar ~/software/hbase-manager-2.0.8-hbase-2.x/hbase-manager-admin-2.0.9.jar ``` --- ### **总结** 常见原因优先级排序: 1. **文件名或路径错误**(如版本号 `2.0.8` vs `2.0.9`) 2. **文件未正确下载或缺失** 3. **权限不足** 请按顺序排查,通常可解决问题。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

快乐崇拜234

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值