小菜鸟

java菜鸟号正在起航

HBase 读数据流程:一条 RowKey 从客户端到磁盘,经历了什么?

HBase 里查一条数据,不是”直接去文件里找”这么简单。它要经过 ZooKeeper、元数据表、RegionServer,还要在内存、缓存、磁盘三层里搜一遍。

绕这么大一圈,是为了两个目标:

  1. 定位:数据在哪个 RegionServer 上?→ 靠 ZooKeeper + hbase:meta
  2. 读取:数据在内存还是磁盘?→ 靠 MemStore → BlockCache → StoreFile 三层查

整体流程:四步走

graph TD  
    A[客户端] --> B[ZooKeeper获取hbase:meta位置]  
    B --> C[访问hbase:meta表]  
    C --> D[定位目标Region及RegionServer]  
    D --> E[连接目标RegionServer]  
    E --> F{读取数据}  
    F -->|找到| G[MemStore]  
    F -->|未找到| H[BlockCache]  
    H -->|找到| I[返回数据]  
    H -->|未找到| J[读取StoreFile]  
    J --> K[写入BlockCache]  
    K --> I
1. 客户端 → ZooKeeper:问"元数据表在哪?"
2. 客户端 → 元数据表:问"我的数据在哪个 RegionServer?"
3. 客户端 → RegionServer:连上去,说"我要查这个 RowKey"
4. RegionServer → 客户端:从 MemStore/BlockCache/StoreFile 里找到数据,返回

前三步是”定位”,最后一步是”读取”。

第一步:找元数据表的位置——问 ZooKeeper

HBase 里所有表的 Region 分布信息都记录在 hbase:meta 表里。但 hbase:meta 表本身也是个表,它也存在某个 RegionServer 上。

问题来了:我怎么知道 hbase:meta 在哪?

ZooKeeper 存了这个信息。

客户端启动时,先连 ZooKeeper,找 /hbase/meta-region-server 这个节点,拿到 hbase:meta 表所在的 RegionServer 地址。

这一步的目的是:找到”目录”在哪。

第二步:查元数据表——定位目标 Region

拿到 hbase:meta 的位置后,客户端向那个 RegionServer 发请求,查 hbase:meta 表:

阅读全文 »

HBase Shell 核心命令:建表、查数据、删数据,一套命令全搞定

HBase Shell 是管理 HBase 最直接的工具——建表、改结构、查数据、删数据、看统计,都在这里。

这套命令分四类:

类别 管什么
表管理 创建、修改、删除表结构
数据读写 插入、查询、扫描数据
数据删除 删列、删行、删表
高级功能 原子计数器

表结构管理:建表、改表、删表

1. 建表(create)——什么时候用? 新业务要存数据了,先建表。

# 建一张表,至少指定一个列族
create 'user_info', 'info', 'log'

# 建表时指定列族属性(比如保留 5 个版本)
create 'user_info', {NAME => 'info', VERSIONS => 5}

注意:列族是建表时必须定的,一旦建好改起来麻烦。 建表前想清楚有哪些列族。

2. 看表列表(list)——什么时候用? 忘了表名叫什么、想看看集群里有哪些表。

list
list 'user.*'   # 模糊匹配

3. 看表结构(describe)——什么时候用? 忘了这个表有哪些列族、每个列族的版本数设了多少。

describe 'user_info'

输出里能看到列族名、版本数、TTL、压缩算法等。

4. 改表结构(alter)——什么时候用? 业务变了,需要加新列族、删旧列族、改版本数。

# 加列族
alter 'user_info', NAME => 'new_family'

# 删列族
alter 'user_info', NAME => 'old_family', METHOD => 'delete'

# 改版本数
alter 'user_info', NAME => 'info', VERSIONS => 5

删除列族前要确认该列族下没有业务在用的数据。 列族删了,数据就没了。

阅读全文 »

HBase 部署全指南:单机测试 vs 集群生产,照着配就能跑

使用的版本为2.2.7

HBase 的部署分两种模式:

  • 单机模式:一台机器,用来学习、测试、验证功能
  • 集群模式:多台机器,生产环境跑数据

两种模式的配置文件几乎一样,区别只在几个关键参数——hbase.cluster.distributed 设 true 还是 false、hbase.rootdir 指本地还是 HDFS、ZK 用内置还是外置。

单机模式:一台机器跑起来

适合开发测试,配置最简单。

前提条件:

  • JDK 8+,JAVA_HOME 配好
  • 如果用 HDFS 存数据,Hadoop 要先启动(也可以用本地文件系统,不用 Hadoop)

配置文件(conf/hbase-env.sh):

export JAVA_HOME=/usr/lib/jvm/java-8-openjdk
# 关掉内置 ZooKeeper(用独立 ZK)
export HBASE_MANAGES_ZK=false

配置文件(conf/hbase-site.xml):

<configuration>
  <!-- 数据存哪:可以是 HDFS,也可以是本地文件系统 -->
  <property>
    <name>hbase.rootdir</name>
    <value>hdfs://localhost:9000/hbase</value>
    <!-- 如果用本地文件系统:file:///opt/hbase/data -->
  </property>
  
  <!-- ZooKeeper 数据目录 -->
  <property>
    <name>hbase.zookeeper.property.dataDir</name>
    <value>/opt/hbase/zkData</value>
  </property>
  
  <!-- 单机模式 -->
  <property>
    <name>hbase.cluster.distributed</name>
    <value>false</value>
  </property>
</configuration>

启动顺序:

# 如果用 HDFS,先起 Hadoop
start-dfs.sh

# 再起 HBase
bin/start-hbase.sh

# 检查进程
jps
# 应该看到:HMaster 和 HRegionServer(单机模式下两个进程都在一台机器)
阅读全文 »

使用 ojAlgo+OR-Tools 求解线性规划(LP)问题

OR-Tools(Google Optimization Tools)是谷歌开源的优化工具库,支持线性规划(LP)、混合整数规划(MIP)等多种问题,内置 CBC、SCIP 等高效求解器。结合 ojAlgo 的模型构建能力与 OR-Tools 的求解能力,可在最小化代码修改的前提下,提升复杂优化问题的求解效率。本文以具体示例介绍这种整合方案。

方案优势

  • 模型构建复用:用 ojAlgo 的直观 API 定义变量和约束,无需重写模型逻辑。
  • 求解能力增强:OR-Tools 支持多种高效求解器(如 SCIP、CBC),尤其擅长处理大规模整数规划问题。
  • 低侵入性:仅需修改求解部分代码,业务逻辑(变量、约束定义)保持不变。

环境配置

依赖引入

pom.xml中添加 ojAlgo 和 OR-Tools 的依赖:

<!-- ojAlgo:模型构建 -->
<dependency>
    <groupId>org.ojalgo</groupId>
    <artifactId>ojAlgo</artifactId>
    <version>51.4.1</version>
</dependency>

<!-- OR-Tools:求解器 -->
<dependency>
    <groupId>com.google.ortools</groupId>
    <artifactId>ortools-java</artifactId>
    <version>8.2.9025</version>
</dependency>

问题定义

求解以下整数线性规划问题(与前文 ojAlgo 示例一致):
目标函数minimize 5x₁ + 6x₂ + 23x₃ + 5x₄ + 24x₅ + 6x₆ + 23x₇ + 5x₈
约束条件

阅读全文 »

HBase 核心数据结构:四维坐标定数据,一张表长什么样?

关系型数据库的表是”二维”的——行和列。

HBase 的表是”四维”的——行键(RowKey)+ 列族(Column Family)+ 列(Column)+ 时间戳(Timestamp) 四者共同定位一个值。

(RowKey, Column Family:Column, Timestamp) → Value

整体视图:四维坐标定位数据

HBase 的表可以想象成一张巨大的稀疏矩阵,用四个维度定位数据:

RowKey(行键) → 列族 → 列 → 时间戳 → 值

举个例子:

RowKey="user_001", Column Family="info", Column="name", Timestamp=t1 → "张三"
RowKey="user_001", Column Family="info", Column="age",  Timestamp=t1 → "25"
RowKey="user_001", Column Family="log",  Column="login", Timestamp=t2 → "2024-01-15 08:00"

同一个 RowKey 下,不同列族、不同列、不同版本的数据可以自由组合。空值不占存储空间。

命名空间(Namespace):表的”文件夹”

命名空间是最高层的逻辑组织单元,相当于 MySQL 里的 Database。

# 创建命名空间
create_namespace 'user_data'

# 在命名空间里建表
create 'user_data:user_info', 'info', 'log'

作用:

  • 表名隔离(不同命名空间可以有同名表)
  • 权限批量管理
  • 资源限额控制

两个默认命名空间:

  • default:用户表默认归属
  • hbase:系统元数据表(如 hbase:meta
阅读全文 »
0%