大数据学习栈记——HBase操作(shell & java)

本文介绍HBase在shell终端的常见操作以及如何利用java api操作HBase,操作系统:Ubuntu24.04

参考:

https://blog.51cto.com/u_16099228/8016429

https://blog.csdn.net/m0_37739193/article/details/73618899

https://cloud.tencent.com/developer/article/1936188

启动HBase

Hbase操作主要包括两种模式:通过Shell输入命令或者通过编程语言(Java、Python等)调用API

首先启动Hbase,顺序为:

启动Hadoop → 启动Zookeeper → 启动HBase

start-all.sh

zkp start

start-hbase.sh

HBase Shell模式

进入HBase Shell模式,在hadoop101:

hbase shell #进入HBase shell 命令行模式

如果需要退出HBase Shell模式,在hadoop101上执行:

exit

如果在运行过程中出现了超时的日志,可以忽略,打回车即可

1. 在HBase中创建表(Shell模式)

假设这里要创建一个表student,该表包含Sname、Ssex、Sage、Sdept、course等字段。需要注意的是,在关系型数据库(比如MySQL)中,需要首先创建数据库,然后再创建表,但是,在HBase数据库中,不需要创建数据库,只要直接创建表就可以。按照PPT教程,在HBase中创建student表的Shell命令如下:

create 'student','Sname','Ssex','Sage','Sdept','course'

这里的各个字符表示的是列族,一个HBase表最多可以有32个列族。超过这个限制会导致表的创建或修改失败,但通常情况下不需要那么多的列族。列族多的话,会给HBase带来很多问题(这个是一个常见的考点!)。

另外,仔细体会一下,HBase建表时,仅仅建立了列族,没有建立列。列是在put数据的时候才出现的。

2. 在HBase中查看表信息(Shell模式)

创建完"student"表后,可通过describe命令查看"student"表的基本信息。

describe 'student'

可以使用list命令查看当前HBase数据库中已经创建了哪些表,命令如下:

list

3. 在HBase中添加数据(Shell模式)

可以用Shell命令手工插入数据,命令如下:

put 'student','95001','Sname','LiYing'

HBase 使用 put 命令可以向数据表中插入一行新的数据,或者覆盖指定行的数据。put 命令一次只能插入一个单元格的数据:

put 'namespace:table','RowKey','CF:CQ','value', timestamp

  • 第一个参数 namespace:table 为指定命名空间下的表名。
  • 第二个参数RowKey为行键的名称,字符串类型。
  • 第三个参数CF:CQ为列族和列的名称。列族名必须是已经创建的,否则 HBase 会报错;列名是临时定义的,因此列族里的列是可以随意扩展的。
  • 第四个参数value为单元格的值。在 HBase 里,所有数据都是字符串的形式。
  • 最后一个参数timestamp为时间戳,如果不设置时间戳,则系统会自动插入当前的时间作为时间戳。

继续添加4个单元格的数据,用来记录LiYing同学的相关信息,命令如下:

put 'student','95001','Ssex','male'

put 'student','95001','Sage','22'

put 'student','95001','Sdept','CS'

put 'student','95001','course:math','80'

解释:这里的course:math表示在course列族下面新建了一个math列,成绩为80分

4. 删除表(Shell模式)

删除表需要分两步操作,第一步先让该表不可用,第二步删除表。比如,要删除student表,可以使用如下命令:

disable 'student'

drop 'student'

7. 查询历史数据(Shell模式)

为了查询历史数据,这里创建一个teacher表,首先,在创建表的时候,需要指定保存的版本数(假设指定为5),命令如下:

create 'teacher',{NAME=>'username',VERSIONS=>5}

创建表的完整语法:

create <table>, {NAME => <family>,VERSIONS => <VERSIONS>}

然后,插入数据,并更新数据,使其产生历史版本数据,需要注意的是,这里插入数据和更新数据都是使用put命令,具体如下:

put 'teacher','91001','username','Mary'

put 'teacher','91001','username','Mary1'

put 'teacher','91001','username','Mary2'

put 'teacher','91001','username','Mary3'

put 'teacher','91001','username','Mary4'

put 'teacher','91001','username','Mary5'

查询时,默认情况下回显示当前最新版本的数据,如果要查询历史数据,需要指定查询的历史版本数,由于上面设置了保存版本数为5,所以,在查询时制定的历史版本数的有效取值为1到5,具体命令如下:

get 'teacher','91001',{COLUMN=>'username',VERSIONS=>5}

get 'teacher','91001',{COLUMN=>'username',VERSIONS=>3}

HBase Java API

1. 导入maven依赖

首先,找到hbase的jar包

输入HBase后,找到很多包

通过https://blog.51cto.com/u_16213369/9390696这篇文章和PPT中的源代码,感觉我们是需要HBase Client包,点击Apache HBase Client,

我安装的HBase是2.5.8版本,hadoop是3.3.6,应该就是2.5.8-hadoop3这个配置吧

在pom.xml里添加

<!-- https://mvnrepository.com/artifact/org.apache.hbase/hbase-client -->

<dependency>

<groupId>org.apache.hbase</groupId>

<artifactId>hbase-client</artifactId>

<version>2.5.8-hadoop3</version>

</dependency>

随后刷新

2. 与HBase建立连接(Java模式)

参考:

https://www.cnblogs.com/yxym2016/p/14698745.html

HBase学习四之JAVA编程_tabledescriptorbuilder-CSDN博客

在网上找了一个模板,简化了一下,并且按照我的配置设置了参数。代码如下:

java 复制代码
package HBase;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.*;
import org.apache.hadoop.hbase.client.*;
// import org.apache.hadoop.hbase.util.Bytes;

import java.io.IOException;

public class TestHBase {

    public static void main(String[] args) {
        try {
            // 获取配置文件信息
            Configuration conf = HBaseConfiguration.create();
            conf.set("hbase.zookeeper.quorum", "hadoop101,hadoop102,hadoop103");   // 我的三台zookeeper服务器是master、node1和node2
            // 建立连接,获取connection对象
            Connection connection = ConnectionFactory.createConnection(conf);
            // 获取admin对象,用于建表、删表等
            Admin admin = connection.getAdmin();

            /*
            在中间编写代码即可
            */

            // 关闭资源
            admin.close();
            connection.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

3. 在HBase建立表和增加数据(Java模式)

代码如下:

java 复制代码
package HBase;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.*;
import org.apache.hadoop.hbase.client.*;
import org.apache.hadoop.hbase.util.Bytes;

import java.io.IOException;
import java.util.Arrays;
import java.util.Collection;

public class Database {

    public static void main(String[] args) {
        try {
            // 获取配置文件信息
            Configuration conf = HBaseConfiguration.create();
            conf.set("hbase.zookeeper.quorum", " hadoop101,hadoop102,hadoop103");  // 我的三台zookeeper服务器是master、node1和node2
            // 建立连接,获取connection对象
            Connection connection = ConnectionFactory.createConnection(conf);
            // 获取admin对象
            Admin admin = connection.getAdmin();
            // 准备创建一张student表,有两个列族info和course
            // 构建表描述构建器,一张表只需要一个
            TableDescriptorBuilder tableDescriptorBuilder = TableDescriptorBuilder.newBuilder(TableName.valueOf("student"));
            // 构建列族描述构建器,每个列族需要一个
            ColumnFamilyDescriptorBuilder columnFamilyDescriptorBuilder1 = ColumnFamilyDescriptorBuilder.newBuilder(Bytes.toBytes("info"));
            ColumnFamilyDescriptorBuilder columnFamilyDescriptorBuilder2 = ColumnFamilyDescriptorBuilder.newBuilder(Bytes.toBytes("course"));
            // 构建列族描述,每个列族描述构建器可以构建一个
            ColumnFamilyDescriptor columnFamilyDescriptor1 = columnFamilyDescriptorBuilder1.build();
            ColumnFamilyDescriptor columnFamilyDescriptor2 = columnFamilyDescriptorBuilder2.build();
            // 添加列族,由于有多个列族,所以需要先构造一个Connection对象,然后使用tableDescriptorBuilder.setColumnFamilies()方法
            Collection<ColumnFamilyDescriptor> families = Arrays.asList(columnFamilyDescriptor1, columnFamilyDescriptor2);
            tableDescriptorBuilder.setColumnFamilies(families);
            // 如果只有一个列族,就用下面这个方法
            // tableDescriptorBuilder.setColumnFamily(columnFamilyDescriptor);
            // 构建表描述
            TableDescriptor tableDescriptor = tableDescriptorBuilder.build();
            // 创建表
            admin.createTable(tableDescriptor);
            // 获得表student的table对象
            TableName tableName = TableName.valueOf("student");
            Table table = connection.getTable(tableName);
            // 定义第一个row key
            String rowKey1 = "0001";
            // 构建Put对象,对应put命令
            Put put = new Put(Bytes.toBytes(rowKey1));
            // 添加列,第一个参数是列族名,第二个参数是列名,第三个参数是值
            put.addColumn(Bytes.toBytes("info"), Bytes.toBytes("name"), Bytes.toBytes("tom"));
            put.addColumn(Bytes.toBytes("info"), Bytes.toBytes("gender"), Bytes.toBytes("male"));
            put.addColumn(Bytes.toBytes("course"), Bytes.toBytes("math"), Bytes.toBytes("80"));
            // 将数据插入数据库
            table.put(put);
            // 关闭表
            table.close();
            // 关闭资源
            admin.close();
            connection.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

使用下列shell命令查看数据,发现数据成功写入HBase中的student表

get 'student','0001'

4. 在HBase查询数据(Java模式)

代码如下:

java 复制代码
package HBase;

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.*;
import org.apache.hadoop.hbase.client.*;
import org.apache.hadoop.hbase.util.Bytes;

import java.io.IOException;
import java.util.List;

public class Query {

    public static void main(String[] args) {
        try {
            // 获取配置文件信息
            Configuration conf = HBaseConfiguration.create();
            conf.set("hbase.zookeeper.quorum", "hadoop101,hadoop102,hadoop103");  // 我的三台zookeeper服务器是master、node1和node2
            // 建立连接,获取connection对象
            Connection connection = ConnectionFactory.createConnection(conf);
            // 获取admin对象,用于建表、删表等
            Admin admin = connection.getAdmin();
            // 获得表student的table对象
            TableName tableName = TableName.valueOf("student");
            Table table = connection.getTable(tableName);
            // 获得rowkey为0001的get对象
            Get get = new Get(Bytes.toBytes("0001"));
            // 得到查询结果
            Result result = table.get(get);
            // 得到单元格列表
            List<Cell> cells = result.listCells();
            // 输出rowkey
            System.out.println("rowKey= " + Bytes.toString(result.getRow()));
            // 遍历所有的cell
            for (Cell cell : cells) {
                // 输出列名
                System.out.print(Bytes.toString(cell.getQualifierArray(), cell.getQualifierOffset(), cell.getQualifierLength()) + ":");
                // 输出单元格的值
                System.out.println(Bytes.toString(cell.getValueArray(), cell.getValueOffset(), cell.getValueLength()));
            }
            // 关闭表格
            table.close();
            // 关闭资源
            admin.close();
            connection.close();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

执行完成后,在IDEA的控制台可以看到下面的信息,成功输出rowkey为0001的记录。

相关推荐
知识分享小能手4 小时前
React学习教程,从入门到精通, React 属性(Props)语法知识点与案例详解(14)
前端·javascript·vue.js·学习·react.js·vue·react
qq_508823406 小时前
金融量化指标--2Alpha 阿尔法
大数据·人工智能
好家伙VCC7 小时前
数学建模模型 全网最全 数学建模常见算法汇总 含代码分析讲解
大数据·嵌入式硬件·算法·数学建模
茯苓gao7 小时前
STM32G4 速度环开环,电流环闭环 IF模式建模
笔记·stm32·单片机·嵌入式硬件·学习
是誰萆微了承諾7 小时前
【golang学习笔记 gin 】1.2 redis 的使用
笔记·学习·golang
DKPT8 小时前
Java内存区域与内存溢出
java·开发语言·jvm·笔记·学习
aaaweiaaaaaa8 小时前
HTML和CSS学习
前端·css·学习·html
看海天一色听风起雨落9 小时前
Python学习之装饰器
开发语言·python·学习
2301_781668619 小时前
Elasticsearch 02
大数据·elasticsearch·搜索引擎
speop10 小时前
llm的一点学习笔记
笔记·学习