分布式数据库HBase:

  1. 更改docker-compose.yml文件。

# ======================

  # 🧩 新增 ZooKeeper 服务

  # ======================

  zookeeper:

    image: zookeeper:3.8

    container_name: zookeeper

    restart: always

    ports:

      - 2181:2181

    networks:

      - default

  # ======================

  # 🧩 新增 HBase Master

  # ======================

  hbase-master:

    image: harisekhon/hbase:2.1

    container_name: hbase-master

    restart: always

    environment:

      - HBASE_MASTER=true

      - HBASE_CONF_hbase_rootdir=hdfs://namenode:9000/hbase

      - HBASE_CONF_hbase_cluster_distributed=true

      - HBASE_CONF_hbase_zookeeper_quorum=zookeeper

    ports:

      - 16010:16010     # HBase Master Web UI

    depends_on:

      - namenode

      - datanode

      - zookeeper

    networks:

      - default

  # ======================

  # 🧩 新增 HBase RegionServer

  # ======================

  hbase-regionserver:

    image: harisekhon/hbase:2.1

    container_name: hbase-regionserver

    restart: always

    environment:

      - HBASE_REGION_SERVER=true

      - HBASE_CONF_hbase_rootdir=hdfs://namenode:9000/hbase

      - HBASE_CONF_hbase_cluster_distributed=true

      - HBASE_CONF_hbase_zookeeper_quorum=zookeeper

    depends_on:

      - hbase-master

      - zookeeper

    networks:

      - default

在配置中增加了HBase和zookeeper的镜像,让集群拥有HBase数据库。

  1. 更改了上面的配置后,把所有的容器都down掉,要重新根据新的配置文件构建新的容器,命令docker-compose down
  2. Down掉所有容器后,因为增加了两个镜像,需要拉取。

方式有两种:1.改好配置后直接在对应的hadoop文件下执行docker-compose up -d,他会自动拉取没有拉取的镜像,然后构建好容器,直接就可以跑了。

2.单独拉取需要拉取的镜像,也是要进入对应的hadoop文件下进行执行,docker pull 对应的镜像名字。docker pull harisekhon/hbase:2.1以及zookeeper:3.8.单独拉取完成后再docker-compose up -d重启服务。

  1. 重启服务后,在命令行使用docker ps查看容器状态,如果健康就可以测试HBase的功能了。使用命令行:

Python代码操作

使用python代码操作,而且是在宿主机上写,所以要暴露端口到宿主机9090。

  1. 更改docker-compose.yml文件,增加暴露端口9090,

  1. 把所有容器down掉,重新根据新的配置构建,命令如下:

Docker-compose down

Docker-compose up -d

  1. 进入hbase-master容器命令如下:

启动 Thrift 服务(默认端口是 9090):

就可以写python代码了。

Python需要下载一下thrift包,命令:pip install happybase thriftpy2

# -*- coding: utf-8 -*-
import happybase  # 导入 happybase 库,用于连接 HBase

# 1. 建立连接
# host='localhost' 表示 HBase Thrift 服务运行在本机
# port=9090 表示 Thrift1 默认端口
connection = happybase.Connection(host='localhost', port=9090)
connection.open()  # 打开连接

# 2. 查看已有表
print("当前存在的表:", connection.tables())  # 返回列表,例如 [b'test']

# 3. 创建表
# 参数:表名和列族
# 字典 key 为列族名,value 可以设置 max_versions 等
table_name = 'mytable'
if table_name.encode() not in connection.tables():
    connection.create_table(
        table_name,
        {
            'cf1': dict(max_versions=3),  # 列族 cf1,最多保留 3 个版本
            'cf2': dict(max_versions=1)   # 列族 cf2,最多保留 1 个版本
        }
    )
    print(f"表 {table_name} 创建成功")
else:
    print(f"表 {table_name} 已存在")

# 4. 获取表对象
table = connection.table(table_name)

# 5. 插入数据
# put(key, {列族:值})
table.put(b'row1', {b'cf1:name': b'Alice', b'cf1:age': b'25'})
table.put(b'row2', {b'cf1:name': b'Bob', b'cf2:score': b'90'})
print("插入数据完成")

# 6. 查询数据
# 6.1 查询单行
row = table.row(b'row1')  # 返回字典 {b'cf1:name': b'Alice', b'cf1:age': b'25'}
print("row1 的数据:", row)

# 6.2 扫描全表
print("扫描整个表:")
for key, data in table.scan():
    print(key, data)

# 6.3 带前缀扫描
print("扫描 row 前缀为 'row' 的行:")
for key, data in table.scan(row_prefix=b'row'):
    print(key, data)

# 6.4 获取指定列
row = table.row(b'row2', columns=[b'cf1:name'])
print("row2 指定列 cf1:name:", row)

# 7. 删除数据
# 删除单个列
table.delete(b'row1', columns=[b'cf1:age'])
print("删除 row1 cf1:age 列完成")

# 删除整行
table.delete(b'row2')
print("删除 row2 整行完成")

# 8. 批量操作
with table.batch() as b:
    b.put(b'row3', {b'cf1:name': b'Charlie', b'cf2:score': b'85'})
    b.put(b'row4', {b'cf1:name': b'David'})
    b.delete(b'row1', columns=[b'cf1:name'])
print("批量操作完成")

# 9. 统计表行数(扫描统计)
count = sum(1 for _ in table.scan())
print(f"{table_name} 当前行数:", count)

# 10. 删除表
# connection.delete_table(table_name, disable=True)  # 先禁用再删除
# print(f"表 {table_name} 已删除")

# 11. 关闭连接
connection.close()
print("HBase 连接关闭")

Logo

开源鸿蒙跨平台开发社区汇聚开发者与厂商,共建“一次开发,多端部署”的开源生态,致力于降低跨端开发门槛,推动万物智联创新。