HBase第二章:API操作(一)

系列文章目录

HBase第一章:集群搭建
HBase第二章:APT操作(一)



前言

这次博客我们记录一些api的常用操作,因为shell的方式在hbase之中并不常用,所以我们选择跳过。


一、创建项目

1.新建项目

在这里插入图片描述
项目名称随意写,因为我已经创建过了,所以这里就不再次创建了。

2.创建需要的类

在这里插入图片描述

3.添加依赖

在这里插入图片描述

<dependencies>
        <dependency>
            <groupId>org.apache.hbase</groupId>
            <artifactId>hbase-client</artifactId>
            <version>2.4.13</version>
        </dependency>
    </dependencies>

在这里插入图片描述

4.设置log4j

log4j.properties
在这里插入图片描述

log4j.rootLogger=WARN, stdout
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - %m%n

二、编写代码

1.数据库连接

HBaseConnection.java

package com.atguigu;

import org.apache.hadoop.hbase.client.Connection;
import org.apache.hadoop.hbase.client.ConnectionFactory;

import java.io.IOException;

public class HBaseConnection {

    //设置静态熟悉hbase连接
    public static Connection connection;
    static {
        try {
            //配置参数留空,使用配置文件
            connection = ConnectionFactory.createConnection();
        } catch (IOException e) {
            System.out.println("连接失败");
            throw new RuntimeException(e);
        }
    }

    //关闭连接
    public static void closeConnection() throws IOException {
        if (connection != null) {
            connection.close();
        }
    }

    //测试连接
    public static void main(String[] args) throws IOException {
        System.out.println(HBaseConnection.connection);
        HBaseConnection.closeConnection();
    }
}

在resource目录中添加配置文件。
在这里插入图片描述

建议从hbase的配置文件中复制,然后删除不需要的,留下hbase.zookeeper.quorum即可。

<?xml version="1.0"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>

<configuration>
    <property>
        <name>hbase.zookeeper.quorum</name>
        <value>hadoop102,hadoop103,hadoop104</value>
        <description>The directory shared by RegionServers.
        </description>
    </property>
</configuration>

当打印出连接对象时,说明连接成功。
在这里插入图片描述

2.api操作

HBaseDDL.java

package com.atguigu;

import org.apache.hadoop.hbase.NamespaceDescriptor;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.*;
import org.apache.hadoop.hbase.util.Bytes;

import java.io.IOException;


public class HBaseDDL {
    // 添加静态属性connection指向单例连接
    public static Connection connection = HBaseConnection.connection;

    /**
     * 创建命名空间
     * @param namespace 命名空间名称
     */
    public static void creatNamespace(String namespace) throws IOException {
        //1.获取admin
        Admin admin = connection.getAdmin();

        //2.调用方法创建空间
        //2.1创建命令空间描述建造者
        NamespaceDescriptor.Builder builder = NamespaceDescriptor.create(namespace);

        //2.2给命令空间添加需求
        builder.addConfiguration("user","atguigu");

        //2.3使用 builder 构造出对应的添加完参数的对象 完成创建
        try {
            admin.createNamespace(builder.build());
        } catch (IOException e) {
            System.out.println("命名空间已存在");
            throw new RuntimeException(e);
        }

        //3.关闭连接
        admin.close();
    }

    /**
     * 判断表格是否存在
     * @param namespace 命名空间名称
     * @param tableName 表格名称
     * @return true 表格存在
     */
    public static boolean isTableExists(String namespace , String tableName) throws IOException {
        //1.获取admin
        Admin admin = connection.getAdmin();

        //2.判断结果参数
        boolean b;

        try {
            b = admin.tableExists(TableName.valueOf(namespace, tableName));
        } catch (IOException e) {
            throw new RuntimeException(e);
        }

        //3.关闭admin
        admin.close();

        //4.返回结果
        return b;
    }

    /**
     * 创建表格
     * @param namespace 命名空间名称
     * @param tableName 表格名称
     * @param columnFamilies 列族名称 可以有多个
     */
    public static void createTable(String namespace ,String tableName ,String... columnFamilies) throws IOException {
        //判断至少一个列族
        if (columnFamilies.length==0){
            System.out.println("创建表格至少有一个列族");
            return;
        }
        //判断表格是否存在
        if (isTableExists(namespace,tableName)){
            System.out.println("表格已经存在");
            return;
        }

        //1.获取admin
        Admin admin = connection.getAdmin();

        //2.调用方法创建表格
        //2.1创建表格描述的建造者
        TableDescriptorBuilder tableDescriptorBuilder = TableDescriptorBuilder.newBuilder(TableName.valueOf(namespace ,tableName));

        //2.2添加参数
        for (String columnFamily : columnFamilies) {
            //2.3创建列族描述的建造者
            ColumnFamilyDescriptorBuilder columnFamilyDescriptorBuilder = ColumnFamilyDescriptorBuilder.newBuilder(Bytes.toBytes(columnFamily));

            //2.4对应当前的列族添加参数
            columnFamilyDescriptorBuilder.setMaxVersions(5);

            //2.5创建添加完参数的列族描述
            tableDescriptorBuilder.setColumnFamily(columnFamilyDescriptorBuilder.build());
        }

        //2.6创建对应的表格描述
        try {
            admin.createTable(tableDescriptorBuilder.build());
        } catch (IOException e) {
            throw new RuntimeException(e);
        }

        //3.关闭admin
        admin.close();

    }

    /**
     * 修改表格中一个列族的版本
     * @param namespace 命名空间名称
     * @param tableName 表格名称
     * @param columFamily 列族名称
     * @param version 版本
     */
    public static void modifyTable(String namespace , String tableName ,String columFamily , int version) throws IOException {
        //判断表格是否存在
        if (!isTableExists(namespace,tableName)){
            System.out.println("表格不存在无法修改");
            return;
        }

        //1.获取admin
        Admin admin = connection.getAdmin();

        try {
            //2.调用方法修改表格
            //2.0获取之前的表格描述
            TableDescriptor descriptor = admin.getDescriptor(TableName.valueOf(namespace, tableName));

            //2.1创建一个表格描述建造者
            TableDescriptorBuilder tableDescriptorBuilder = TableDescriptorBuilder.newBuilder(descriptor);

            //2.2对应建造者进行表格数据的修改
            ColumnFamilyDescriptor columnFamily = descriptor.getColumnFamily(Bytes.toBytes(columFamily));

            //创建列族描述建造者
            //需要填写旧的列族描述
            ColumnFamilyDescriptorBuilder columnFamilyDescriptorBuilder = ColumnFamilyDescriptorBuilder.newBuilder(columnFamily);

            //修改对应的版本
            columnFamilyDescriptorBuilder.setMaxVersions(version);

            tableDescriptorBuilder.modifyColumnFamily(columnFamilyDescriptorBuilder.build());

            admin.modifyTable(tableDescriptorBuilder.build());
        } catch (IOException e) {
            throw new RuntimeException(e);
        }

        //3.关闭连接
        admin.close();
    }

    /**
     * 删除表格
     * @param namespace 命名空间名称
     * @param tableName 表格名称
     * @return true 删除成功
     */
    public static boolean deleTable(String namespace ,String tableName) throws IOException {
        //1.判断表格是否存在
         if (!isTableExists(namespace,tableName)){
             System.out.println("表格不存在");
             return false;
         }
        //2.获取admin
        Admin admin = connection.getAdmin();

        //3.调用相关方法
        try {
            //HBase 删除表格之前 一定要先标记表格为不可用
            TableName tableName1 = TableName.valueOf(namespace, tableName);
            admin.disableTable(tableName1);
            admin.deleteTable(tableName1);
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
        
        //4.关闭admin
        admin.close();

        return true;
    }

    public static void main(String[] args) throws IOException {
        //创建命名空间
//        creatNamespace("atguigu");

        //创建表
//        createTable("atguigu","student","info");
//        System.out.println(isTableExists("atguigu", "student"));

        //修改表
//        modifyTable("atguigu","student","info",6);

        //删除表
//        deleTable("atguigu","student");

        System.out.println("其它代码");

        HBaseConnection.closeConnection();
    }
}

这里创建了几个参数,包括测试函数也已经创建好啦,挨个测试即可。
提一下异常处理,这里有一部分将异常抛给了上一层,有一些则用try/catch捕捉,简单说一下区别放下,上一层的错误就抛出,比如创建表之前的连接,自身错误就捕捉,比如创建表时发生的异常。

  • 创建命名空间
    不报错误代表成功
    在这里插入图片描述
    在这里插入图片描述

  • 创建表
    在这里插入图片描述
    在这里插入图片描述

  • 修改表
    我们修改其版本信息(其它也可以)
    在这里插入图片描述在这里插入图片描述
    在这里插入图片描述

  • 删除表
    删除刚刚创建的(不常用)
    在这里插入图片描述
    在这里插入图片描述


总结

这次完成了hbase的增删改功能,下次再完成查询功能。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Sqoop 是一个用于在 Hadoop 生态系统中导入和导出数据的工具。在本关中,我们将学习如何使用 Sqoop 将数据从关系型数据库导入到 HBase 中。 首先,我们需要确保已经在 Hadoop 集群中安装了 Sqoop 和 HBase。然后,我们需要创建一个目标表来存储从关系型数据库中导入的数据。 在 HBase 中创建表: ``` create 'employees', 'personal', 'professional' ``` 现在,我们可以使用 Sqoop 将数据从关系型数据库中导入到 HBase 中。假设我们要从 MySQL 数据库中导入一个名为 employees 的表,该表含以下列和数据: | id | name | age | salary | |----|------|-----|--------| | 1 | John | 25 | 50000 | | 2 | Mary | 30 | 60000 | | 3 | Jack | 40 | 70000 | 我们可以使用以下命令将该表导入到 HBase 中: ``` sqoop import --connect jdbc:mysql://localhost/employees --username root --password password --table employees --hbase-table employees --column-family personal --hbase-row-key id --hbase-create-table ``` 该命令将从 MySQL 数据库中选择所有列,并将它们插入到 HBase 表中。我们指定了 HBase 表的名称和列族名称,以及用于 HBase 行键的列。 如果 HBase 表不存在,Sqoop 将自动创建它。我们还指定了一个选项 hbase-create-table,以确保表已经存在,如果表不存在则会创建。如果不使用此选项,则需要手动创建 HBase 表。 我们可以使用以下命令查看导入的数据: ``` hbase shell scan 'employees' ``` 输出应如下所示: ``` ROW COLUMN+CELL 1 column=personal:age, timestamp=1576289403403, value=25 1 column=personal:name, timestamp=1576289403403, value=John 1 column=personal:salary, timestamp=1576289403403, value=50000 2 column=personal:age, timestamp=1576289403403, value=30 2 column=personal:name, timestamp=1576289403403, value=Mary 2 column=personal:salary, timestamp=1576289403403, value=60000 3 column=personal:age, timestamp=1576289403403, value=40 3 column=personal:name, timestamp=1576289403403, value=Jack 3 column=personal:salary, timestamp=1576289403403, value=70000 ``` 我们可以看到,导入的数据已经存储在 HBase 表中。现在,我们可以在 Hadoop 生态系统中使用这些数据进行分析和处理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值