Java HBase Demo

下面是一个简单的Java HBase示例,展示如何连接HBase并进行基本的CRUD操作。

准备工作

  1. 确保HBase服务已启动
  2. 添加HBase客户端依赖到你的项目(Maven示例):
<dependency>
    groupId>org.apache.hbase</groupId>
    <artifactId>hbase-client</artifactId>
    <version>2.4.11</version> <!-- 使用适合你Base版本的客户端 -->
</dependency>

完整示例代码

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

import java.io.IOException;

public class HBaseDemo {

    private final String TABLE_NAME = "test_table";
    private static final String COLUMN_FAMILY = "cf";
    private static final String COLUMN_QUALIFIER = "data";

    public static void main(String[] args) throws IOException {
        // 1. 创建HBase配置
        Configuration config = HBaseConfiguration.create();
        
        // 如果HBase不是运行在本地默认配置,需要指定Zookeeper地址
        // config.set("hbase.zookeeper.quorum", "localhost");
        // config.set("hbase.zookeeper.property.clientPort", "2181");

        // 2. 创建连接
        try (Connection connection = ConnectionFactory.createConnection(config)) {
            // 3. 获取管理员对象
            try (Admin admin = connection.getAdmin()) {
                // 4. 创建表(如果不存在)
                createTableIfNotExists(admin);
                
                // 5. 获取表对象
                try (Table table = connection.getTable(TableName.(TABLE_NAME))) {
                    // 6. 插入数据
                    putData(table, "row1", "Hello HBase!");
                    putData(table, "row2", "Another row");
                    
                    // 7. 获取数据
                    getData(table, "row1");
                    getData(table, "row2");
                    
                    // 8. 扫描表
                    scanTable(table);
                    
                    // 9. 删除数据
                    deleteData(table, "row1");
                    
                    // 10. 再次获取验证删除
                    getData(table, "row1");
                }
            }
        }
    }

    private static void createTableIfNotExists(Admin admin) throws IOException {
        TableName tableName =.valueOf(TABLE_NAME);
        
        if (!admin.tableExists(tableName)) {
            // 创建表描述符
            TableDescriptorBuilder tableDescriptor = TableDescriptorBuilder.newBuilder(tableName);
            
            // 添加列族
            ColumnFamilyDescriptor columnFamily = ColumnFamilyDescriptorBuilder.of(COLUMN_FAMILY);
            tableDescriptor.setColumnFamily(columnFamily);
            
            // 创建表
            admin.createTable(tableDescriptor.build());
            System.out.println("表 " + TABLE_NAME + " 创建成功");
        } else {
            System.out.println("表 " + TABLE_NAME + " 已存在");
        }
    }

    private static void putData(Table table, String rowKey, String value) throws IOException {
        Put put = new Put(Bytes.toBytes(rowKey));
        put.addColumn(Bytes.toBytes(COLUMN_FAMILY), Bytes.toBytes(COLUMN_QUALIFIER), Bytes.toBytes(value));
        table.put(put);
        System.out.println("成功插入数据: rowKey=" + rowKey + ", value=" + value);
    }

    private static void getData(Table table, String rowKey) throws IOException {
        Get get = new Get(Bytes.toBytes(rowKey));
        Result result = table.get(get);
        
        if (!result.isEmpty()) {
            byte[] value = result.getValue(Bytes.toBytes(COLUMN_FAMILY), Bytes.toBytes(COLUMN_QUALIFIER));
            System.out.println("获取数据: rowKey=" + rowKey + ", value=" + Bytes.toString(value));
        } else {
            System.out.println("未找到 rowKey=" + rowKey + " 的数据");
        }
    }

    private static void scanTable(Table table) throws IOException {
        Scan scan = new Scan();
        scan.addColumn(Bytes.toBytes(COLUMN_FAMILY), Bytes.toBytes(COLUMN_QUALIFIER));
        
        System.out.println("开始扫描表...");
        try (ResultScanner scanner =.getScanner(scan)) {
            Result result : scanner) {
                String rowKey = BytestoString(result.getRow());
                String value = Bytes.toString(result.getValue(Bytes.toBytes(COLUMN_FAMILY), Bytes.toBytes(COLUMN_QUALIFIER)));
                System.out.println("扫描结果: rowKey=" + rowKey + ", value=" + value);
            }
        }
    }

    private static void deleteData(Table table, String rowKey) throws IOException {
        Delete delete = new Delete(Bytes.toBytes(rowKey));
        table.delete(delete);
        System.out.println("成功删除 rowKey=" + rowKey + " 的数据
    }
}

代码说明

  1. 配置连接:使用HBaseConfiguration.create()创建配置对象
  2. 创建连接:通过ConnectionFactorycreate()建立与HBase的连接
  3. 表操作
    • 检查表是否存在,不存在则创建
    • 表包含一个列族"cf"
  4. 数据操作
    • putData(): 插入或更新数据
    • getData(): 获取单行数据
    • scanTable(): 扫描全表数据
    • deleteData(): 删除指定行数据

运行注意事项

  1. 确保HBase服务正在运行
  2. 如果HBase不是运行在本地默认配置,需要修改Zookeeper连接配置
  3. 根据你的HBase版本调整客户端依赖版本
  4. 在生产环境中,应该重用Connection对象而不是频繁创建和关闭

扩展建议

  1. 添加异常处理
  2. 实现批量操作
  3. 添加过滤器使用示例
  4. 实现表结构修改(添加/删除列族等)
  5. 添加性能测试示例

希望这个示例能帮助你开始使用Java操作HBase!

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐