Docker下跑hadoop--命令行和python操作HBase
分布式数据库HBase:
- 更改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数据库。
- 更改了上面的配置后,把所有的容器都down掉,要重新根据新的配置文件构建新的容器,命令docker-compose down
- Down掉所有容器后,因为增加了两个镜像,需要拉取。

方式有两种:1.改好配置后直接在对应的hadoop文件下执行docker-compose up -d,他会自动拉取没有拉取的镜像,然后构建好容器,直接就可以跑了。
2.单独拉取需要拉取的镜像,也是要进入对应的hadoop文件下进行执行,docker pull 对应的镜像名字。docker pull harisekhon/hbase:2.1以及zookeeper:3.8.单独拉取完成后再docker-compose up -d重启服务。
- 重启服务后,在命令行使用docker ps查看容器状态,如果健康就可以测试HBase的功能了。使用命令行:

Python代码操作
使用python代码操作,而且是在宿主机上写,所以要暴露端口到宿主机9090。
- 更改docker-compose.yml文件,增加暴露端口9090,

- 把所有容器down掉,重新根据新的配置构建,命令如下:
Docker-compose down
Docker-compose up -d
- 进入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 连接关闭")





所有评论(0)