HBase(2) Java 操作 HBase 教程

HBase2.4.8详细教程(三)Java操作HBase 在idea中建立Maven Java项目。 在pom.xml中引入对应版本的HBase依赖: <dependencies> <!-- https://mvnrepository.com/artifact/org.apache.hbase/hbase-client --> <dependency> <groupId>org.apache.hbase</groupId> 阅读详情

一、简介

在上一篇文章 HBase 基础入门 中,我们已经介绍了 HBase 的一些基本概念,以及如何安装使用的方法。
那么,作为一名 Javaer,自然是希望用 Java 的方式来与 HBase 进行对话了。
所幸的是,HBase 本身就是用 Java 编写的,天生自带了 Java 原生API。 我们可以通过 hbase-client 来实现 HBase 数据库的操作。
所以,这次主要介绍该组件的基本用法。

在使用 hbase-client 之前,有几个要点需要注意:

  • 客户端需要能访问 Zoopkeeper,再获得 HMaster、RegionServer 实例进行操作
  • 客户端需运行在HBase/Hadoop 集群内,HBase会使用 hostname 来定位节点,因此要求客户端能访问到对应的主机名(或子域名)
    如果是远程客户端则需要配置本地的hosts文件。

下面这个图,有助于理解 Client 与 HBase 集群的交互架构:

下面开始介绍 client 的使用。

二、hbase-client 引入

在 Maven 的 pom.xml 中添加依赖:

<dependency>
    <groupId>org.apache.hbase</groupId>
    <artifactId>hbase-client</artifactId>
    <version>2.1.5</version>
    <exclusions>
        <exclusion>
            <artifactId>slf4j-api</artifactId>
            <groupId>org.slf4j</groupId>
        </exclusion>
        <exclusion>
            <artifactId>slf4j-log4j12</artifactId>
            <groupId>org.slf4j</groupId>
        </exclusion>
    </exclusions>
</dependency>
<dependency>
    <groupId>org.apache.hbase</groupId>
    <artifactId>hbase</artifactId>
    <version>2.1.5</version>
</dependency>

 这里需要注意的是,客户端版本和 HBase 版本需要保持一致,否则可能会遇到不兼容的问题。

三、连接操作

示例代码:

/**
 * 建立连接
 *
 * @return
 */
public static Connection getConnection() {
    try {
        //获取配置
        Configuration configuration = getConfiguration();
        //检查配置
        HBaseAdmin.checkHBaseAvailable(configuration);
        return ConnectionFactory.createConnection(configuration);
    } catch (IOException | ServiceException e) {
        throw new RuntimeException(e);
    }
}

/**
 * 获取配置
 *
 * @return
 */
private static Configuration getConfiguration() {
    try {
        Properties props = PropertiesLoaderUtils.loadAllProperties("hbase.properties");
        String clientPort = props.getProperty("hbase.zookeeper.property.clientPort");
        String quorum = props.getProperty("hbase.zookeeper.quorum");

        logger.info("connect to zookeeper {}:{}", quorum, clientPort);

        Configuration config = HBaseConfiguration.create();
        config.set("hbase.zookeeper.property.clientPort", clientPort);
        config.set("hbase.zookeeper.quorum", quorum);
        return config;
    } catch (IOException e) {
        throw new RuntimeException(e);
    }
}

四、表操作

增删改查方法封装如下:

/**
 * 创建表
 * @param connection
 * @param tableName
 * @param columnFamilies
 * @throws IOException
 */
public static void createTable(Connection connection, TableName tableName, String... columnFamilies) throws IOException {
    Admin admin = null;
    try {
        admin = connection.getAdmin();
        if (admin.tableExists(tableName)) {
            logger.warn("table:{} exists!", tableName.getName());
        } else {
            TableDescriptorBuilder builder = TableDescriptorBuilder.newBuilder(tableName);
            for (String columnFamily : columnFamilies) {
                builder.setColumnFamily(ColumnFamilyDescriptorBuilder.of(columnFamily));
            }
            admin.createTable(builder.build());
            logger.info("create table:{} success!", tableName.getName());
        }
    } finally {
        if (admin != null) {
            admin.close();
        }
    }
}


/**
 * 插入数据
 *
 * @param connection
 * @param tableName
 * @param rowKey
 * @param columnFamily
 * @param column
 * @param data
 * @throws IOException
 */
public static void put(Connection connection, TableName tableName,
                       String rowKey, String columnFamily, String column, String data) throws IOException {

    Table table = null;
    try {
        table = connection.getTable(tableName);
        Put put = new Put(Bytes.toBytes(rowKey));
        put.addColumn(Bytes.toBytes(columnFamily), Bytes.toBytes(column), Bytes.toBytes(data));
        table.put(put);
    } finally {
        if (table != null) {
            table.close();
        }
    }
}

/**
 * 根据row key、column 读取
 *
 * @param connection
 * @param tableName
 * @param rowKey
 * @param columnFamily
 * @param column
 * @throws IOException
 */
public static String getCell(Connection connection, TableName tableName, String rowKey, String columnFamily, String column) throws IOException {
    Table table = null;
    try {
        table = connection.getTable(tableName);
        Get get = new Get(Bytes.toBytes(rowKey));
        get.addColumn(Bytes.toBytes(columnFamily), Bytes.toBytes(column));

        Result result = table.get(get);
        List<Cell> cells = result.listCells();

        if (CollectionUtils.isEmpty(cells)) {
            return null;
        }
        String value = new String(CellUtil.cloneValue(cells.get(0)), "UTF-8");
        return value;
    } finally {
        if (table != null) {
            table.close();
        }
    }
}

/**
 * 根据rowkey 获取一行
 *
 * @param connection
 * @param tableName
 * @param rowKey
 * @return
 * @throws IOException
 */
public static Map<String, String> getRow(Connection connection, TableName tableName, String rowKey) throws IOException {
    Table table = null;
    try {
        table = connection.getTable(tableName);
        Get get = new Get(Bytes.toBytes(rowKey));

        Result result = table.get(get);
        List<Cell> cells = result.listCells();

        if (CollectionUtils.isEmpty(cells)) {
            return Collections.emptyMap();
        }
        Map<String, String> objectMap = new HashMap<>();
        for (Cell cell : cells) {
            String qualifier = new String(CellUtil.cloneQualifier(cell));
            String value = new String(CellUtil.cloneValue(cell), "UTF-8");
            objectMap.put(qualifier, value);
        }
        return objectMap;
    } finally {
        if (table != null) {
            table.close();
        }
    }
}

/**
 * 扫描权标的内容
 *
 * @param connection
 * @param tableName
 * @param rowkeyStart
 * @param rowkeyEnd
 * @throws IOException
 */
public static List<Map<String, String>> scan(Connection connection, TableName tableName, String rowkeyStart, String rowkeyEnd) throws IOException {
    Table table = null;
    try {
        table = connection.getTable(tableName);
        ResultScanner rs = null;
        try {
            Scan scan = new Scan();
            if (!StringUtils.isEmpty(rowkeyStart)) {
                scan.withStartRow(Bytes.toBytes(rowkeyStart));
            }
            if (!StringUtils.isEmpty(rowkeyEnd)) {
                scan.withStopRow(Bytes.toBytes(rowkeyEnd));
            }
            rs = table.getScanner(scan);

            List<Map<String, String>> dataList = new ArrayList<>();
            for (Result r : rs) {
                Map<String, String> objectMap = new HashMap<>();
                for (Cell cell : r.listCells()) {
                    String qualifier = new String(CellUtil.cloneQualifier(cell));
                    String value = new String(CellUtil.cloneValue(cell), "UTF-8");
                    objectMap.put(qualifier, value);
                }
                dataList.add(objectMap);
            }
            return dataList;
        } finally {
            if (rs != null) {
                rs.close();
            }
        }
    } finally {
        if (table != null) {
            table.close();
        }
    }
}

/**
 * 删除表
 *
 * @param connection
 * @param tableName
 * @throws IOException
 */
public static void deleteTable(Connection connection, TableName tableName) throws IOException {
    Admin admin = null;
    try {
        admin = connection.getAdmin();
        if (admin.tableExists(tableName)) {
            //现执行disable
            admin.disableTable(tableName);
            admin.deleteTable(tableName);
        }
    } finally {
        if (admin != null) {
            admin.close();
        }
    }
}

五、运行测试

最后,我们仍然以上一篇文章中的设备数据作为例子:

  1. 建立 DeviceState 表;
  2. 定义 name/state 两个列簇;
  3. 写入列数据;
  4. 读取列、行,范围读取;
  5. 删除操作

最终实现的代码如下:

private static final Logger logger = LoggerFactory.getLogger(HBaseTest.class);

public static void main(String[] args) {

    Connection connection = null;
    try {
        connection = getConnection();
        TableName tableName = TableName.valueOf("DeviceState");

        //创建DeviceState表
        createTable(connection, tableName, "name", "state");

        logger.info("创建表 {}", tableName.getNameAsString());

        //写入数据
        put(connection, tableName, "row1", "name", "c1", "空调");
        put(connection, tableName, "row1", "state", "c2", "打开");
        put(connection, tableName, "row2", "name", "c1", "电视机");
        put(connection, tableName, "row2", "state", "c2", "关闭");

        logger.info("写入数据.");

        String value = getCell(connection, tableName, "row1", "state", "c2");
        logger.info("读取单元格-row1.state:{}", value);

        Map<String, String> row = getRow(connection, tableName, "row2");
        logger.info("读取单元格-row2:{}", JsonUtil.toJson(row));

        List<Map<String, String>> dataList = scan(connection, tableName, null, null);
        logger.info("扫描表结果-:\n{}", JsonUtil.toPrettyJson(dataList));

        //删除DeviceState表
        deleteTable(connection, tableName);
        logger.info("删除表 {}", tableName.getNameAsString());

        logger.info("操作完成.");
    } catch (Exception e) {
        logger.error("操作出错", e);
    } finally {
        if (connection != null) {
            try {
                connection.close();
            } catch (IOException e) {
                logger.error("error occurs", e);
            }
        }
    }

}

执行代码,控制台输出如下:

INFO -createTable(HBaseTest.java:89) - create table:[68, 101, 118, 105, 99, 101, 83, 116, 97, 116, 101] success!
INFO -main(HBaseTest.java:32) - 创建表 DeviceState
INFO -main(HBaseTest.java:40) - 写入数据.
INFO -main(HBaseTest.java:43) - 读取单元格-row1.state:打开
INFO -main(HBaseTest.java:46) - 读取单元格-row2:{"c1":"电视机","c2":"关闭"}
INFO -main(HBaseTest.java:49) - 扫描表结果-:
[ {
  "c1" : "空调",
  "c2" : "打开"
}, {
  "c1" : "电视机",
  "c2" : "关闭"
} ]
INFO -HBaseAdmin$9.call(HBaseAdmin.java:1380) - Started disable of DeviceState
INFO -HBaseAdmin$DisableTableFuture.postOperationResult(HBaseAdmin.java:1409) - Disabled DeviceState
INFO -HBaseAdmin$DeleteTableFuture.postOperationResult(HBaseAdmin.java:965) - Deleted DeviceState
INFO -main(HBaseTest.java:53) - 删除表 DeviceState
INFO -main(HBaseTest.java:55) - 操作完成.

此时Java Client已经完成制作。

FAQ

  • 提示报错 找不到winutils程序

Failed to locate the winutils binary in the hadoop binary path
原因是在Windows下依赖一个winutils.exe程序,该程序通过${HADOOP_HOME}/bin 来查找。
该报错不影响程序执行,但如果要规避问题,需要下载hadoop-commons-master,再配置变量HADOOP_HOME
可参考地址:https://blog.youkuaiyun.com/ycf921244819/article/details/81706119

  • 提示报错,UnknownHostException,无法找到节点..
    原因是客户端无法解析HMaster实例节点的主机名
    需要编辑 C:\Windows\System32\drivers\etc\hosts 文件,添加对应的映射,如下:
47.xx.8x.xx izwz925kr63w5jitjys6dtt

参考文档

官方文档
https://hbase.apache.org/book.html#quickstart
Java HBase客户端API
https://www.baeldung.com/hbase

作者: 美码师(zale)

HBase2.2.2安装和编程实践指南 承接上一篇:分布式文件系统HDFS上机实践 文章目录@[toc]分布式数据库HBase一、HBase介绍运行环境:二、安装并配置HBase2.2.22.1单机模式配置1. 配置/usr/local/hbase/conf/hbase-env.sh 。2. 配置/usr/local/hbase/conf/hbase-site.xml3. 测试运行。2.2 伪分布式模式配置1.配置/usr/local/hbase/conf/hbase-env.sh。命令如下:2.配置/usr/local/hbase/conf/ 阅读详情

相关推荐

HBase Java基础操作

Apache HBase 是一个开源的、分布式的、可扩展的大数据存储系统,它基于 Google 的 Bigtable 模型。使用 Java 操作 HBase 通常需要借助 HBase 提供的 Java API。以下是一个基本的示例,展示了如何在 Java 中连接到 HBase 并执行一些基本的操作,如创建表、插入数据、扫描表以及删除数据。

王小工小工历程 2325

Hbase2.2.2安装配置以及学习教程

1.Hbase2.2.2安装教程 HBase2.2.2安装和编程实践指南_厦大数据库实验室博客 (xmu.edu.cn)(单机,伪分布式) 分布式HBase-2.2.0安装_zhi_zixing的博客-优快云博客_hbase2 安装(分布式) 建议对比安装 2.出现的问题: 1)hbase安装配置及解决错误: 找不到或无法加载主类 HBase 2.2.2首次安装启动出现 Error: Could not find or load main class org.apache.hadoop.hba

weixin_51181574的博客 710

HBase安装配置以及Java操作hbase

Apache HBase Apache HBase™是Hadoop数据库,是一个分布式,可扩展的大数据存储。 当您需要对大数据进行随机,实时读/写访问时,请使用Apache HBase™。该项目的目标是托管非常大的表 - 数十亿行X百万列 - 在商品硬件集群上。Apache HBase是一个开源的,分布式的,版本化的非关系数据库 特征 线性和模块化可扩展性。 严格一致的读写操作。 ...

u010391342的博客 6662

hbase java_hbase 2.0.2 java api的简单使用

packagecom.hbase.test;importjava.io.IOException;importjava.util.ArrayList;importjava.util.List;importorg.apache.hadoop.conf.Configuration;importorg.apache.hadoop.hbase.Cell;importorg.apache.had...

weixin_32821533的博客 281

Hbase-1.1.2 Java API 操作

前期准备: Hbase-1.1.2 Java开发需要的最少Jar包 下面的代码是根据最新的Hbase-1.1.2 Java API 进行的基础操作。 import java.io.IOException; import java.util.ArrayList; import java.util.List; import org.apache.hadoop.conf.Configurat

大大大水牛 4128

JAVA API连接Hbase操作

新手小白,第一篇帖子是有关Hadoop下如何实现Java API连接Hbase,如有错误欢迎指正讨论。 一、安装jdk、eclipse并配置环境变量 (一)安装jdk 从Oracle官网下载对应版本JDK,下载后查看安装包。 根据教程将jdk解压到/usr/lib/jvm文件夹时发现,/hadoop/lib/jvm下为openjdk,大多数LINUX发行版本里,内置或者通过软件源安装JDK的话,都是安装的openjdk,openjdk是jdk的开放原始码版本,以GPL协议的形式放出。 因此openjdk只

m0_50983764的博客 2791

实验四 HBase开发:使用java操作HBase

一、实验目的 熟悉HBase数据库操作常用的Java API 二、实验平台 操作系统:CentOS 8 Hadoop版本:3.2.3 HBase版本:2.4.12 jdk版本:1.8 Java IDE:eclipse 三、实验过程 1. 创建表

Lilianach的博客 2万+

HBase操作(Shell与Java API)

下面代码在hadoop 2.6.4 + hbase 1.2.2 + centos 6.5 + jdk 1.8上运行通过。 Shell与Java API

梓纾的专栏 8382

头歌——HBase 开发:使用Java操作HBase

头歌——HBase 开发:使用Java操作HBase

Changersh 1万+

Java API操作HBase通用CRUD教程

本文还有配套的精品资源,点击获取 简介:Java环境下,本指南介绍如何通过Java API执行HBase数据库的通用CRUD操作。文章首先介绍了设置HBase依赖的步骤,然后详细讲解了创建表、插入数据、读取数据、更新数据、删除数据以及扫描查询的操作方法,并提供了相应的Java代码示例。 1. HBase数据库介绍与应用领域 HBase是一个开源的非关系型分布...

weixin_33628677的博客 1636

智能家居DIY:用51单片机实现三合一环境监测(温湿度+烟雾+自动灭火)

本文详细介绍了如何利用STC89C52单片机打造智能家居三合一环境监测系统,集成温湿度检测、烟雾报警和自动灭火功能。从硬件选型、电路设计到软件编程,提供完整的DIY方案,帮助读者构建高性价比的家庭安全防护系统,特别适合智能家居爱好者和电子DIY初学者。

yhn4567890的博客 689

HBase的Java API操作

HBase的Java API操作代码,实现增删改查,过滤功能

qq_40078490的博客 2763

计算机组成原理课程设计_微程序控制的简单模型机设计

微程序控制的简单模型机设计 要求 基本要求 完成一个简单主机的设计,模型机应具备如下能力:在自行设计的指令集基础上,运行自行编写的简单用户程序,实现特定运算功能。 弹性要求 在此基础上,完成必要的扩展,实现模型机的功能扩展设计,包括:实现多种运算功能(指令集的扩充)、支持更为丰富的寻址方式、有更为完善的微程序设计等。 实验软件和硬件环境 QuartusII, FPGA计算机组...

sailist的记录站 3万+

Java 操作HBase

1.创建一个学生信息表,用来存储学生的姓名(姓名作为行键,且假设姓名不会重复)以及考试成绩,其中考试成绩(score)是一个列族,存储了各个科目的考试成绩。HTableDescriptor包含了HBase中的表格的详细信息(例如表中的列族、表的类型、表是否只读、MemoStore的最大空间、Region分裂时机等)管理HBase数据库信息(包括创建、删除表、列出表项、使表有效/无效、添加/删除表的列族成员、检查HBase运行状态等)2.针对表的操作(创建表、删除表、判断表是否存在、使用/禁用表、列出表)

qq_42260493的博客 8480

大白话讲解Numpy中什么是一维、二维、三维数组,以及5种创建方式

NumPy中提供了多种创建数组的方式,其中最基本的方式就是通过array()函数创建数组在使用该函数时直接传入列表或元组即可。 通过array()函数分别创建一维数组、二维组和三维数组,那么什么是维度呢?一维、二维、三维有什么区别? 1、什么是维度? 维度可以理解为描述数据的一种 “方向” 或者 “层次”。在数组中,维度的数量决定了我们需要用多少个索引来访问一个元素 2、一维、二维、三维的区别? (1)一维:一维数组就像是一条直线上排列的一组数据,例如: a = np.array([1, 2

1361

MPU6050模块DIY翻车实录:ID能读但数据全为零?原来是这个10uF电容惹的祸

本文详细记录了MPU6050模块调试过程中遇到的ID能读但数据全为零的问题排查过程。通过对比不同参考设计,发现CPOUT引脚10uF电容选择不当是导致数据异常的根源,更换为官方推荐的2.2nF电容后问题解决。文章为硬件开发者提供了宝贵的电路设计经验。

weixin_29158047的博客 319

Java 操作 HBase 教程

Java 操作 HBase 教程一、简介二、hbase-client 引入三、连接操作四、表操作五、运行测试 相关博文原文地址: 博客园:美码师:HBase(2) Java 操作 HBase 教程 一、简介 HBase 本身就是用 Java 编写的,天生自带了 Java 原生API。 我们可以通过 hbase-client 来实现 HBase 数据库的操作。 所以,这次主要介绍该组件的基本用法...

爱是与世界平行 1278

OpenHarmony 显示Display驱动全栈解析:DisplayLayer + Gralloc + Gfx 三位一体,打造高性能图形底座

OpenHarmony Display显示驱动模块是系统图形渲染和显示功能的基础组件,负责管理显示设备、图层渲染、内存分配等核心功能。该模块采用HDI(Hardware Driver Interface)设计架构,为上层图形服务提供统一的显示能力接口,实现了显示设备的初始化、图层管理、内存分配与映射、硬件加速等关键功能。DisplayLayer:负责显示图层的管理, 包括图层创建、显示属性设置、图层填充及刷新等操作;

m0_67505153的博客 314

大数据从入门到实战 - HBase 开发:使用Java操作HBase

大数据从入门到实战 - HBase 开发:使用Java操作HBase 一、关于此次实践 1、实战简介 2、全部任务 二、实践详解 1、第1关:创建表 2、第2关:添加数据 3、第3关:获取数据 4、第4关:删除表 叮嘟!这里是小啊呜的学习课程资料整理。好记性不如烂笔头,今天也是努力进步的一天。一起加油进阶吧!

小啊呜的博客 1万+

R语言 Chow Test

Chow 测试用于测试不同数据集上的两个不同回归模型中的系数是否相等。 该测试通常用于计量经济学领域,使用时间序列数据来确定数据在某个时间点是否存在结构性中断。 本教程提供了如何在 R 中执行 Chow 测试的分步示例 首先,我们将创建一些假数据: #create data data <- data.frame(x = c(1, 1, 2, 3, 4, 4, 5, 5, 6, 7, 7, 8, 8, 9, 10, 10, 11, 12, 12, 13,

Mrrunsen的博客 1946

基于STM32设计的指纹考勤机_348

随着信息化管理需求的日益增长,传统的人工考勤方式已难以满足现代社会对高效、精准和安全的考勤管理要求。为解决这一问题,本项目设计并实现了一款基于STM32的指纹考勤机系统。该系统采用AS608指纹识别模块进行人员身份识别,ESP8266无线模块实现与上位机APP的通信,支持人员信息录入、考勤时间段设置、考勤记录保存与查询等功能。系统通过SQLite数据库存储考勤数据,并提供导出EXCEL表格功能,方便数据管理与统计分析。该系统具有高效的考勤管理能力和良好的用户交互体验,能够广泛应用于企业、学校等机构的考勤管理

525

【HBase】用Java操作HBase

先序 JAVA1.8 Hadoop 2.7.7 HBase 2.0.5 Gradle 5.3.1 依赖: compile group: 'org.apache.hbase', name: 'hbase-client', version: '2.0.5' 源码:https://github.com/Hayaking/HBaseOperator 创建连接 @Logger public...

HaYa 1317

数学建模学习(120):使用Python实现基于AHP的供应商选择分析

使用Python实现基于AHP的供应商选择分析

全栈川川 909

Hbase Java API操作

Hbase Java API操作,对于创建项目和操作表,表数据的方法

m0_72168501的博客 3222

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

头歌HBase 开发:使用Java操作HBase

第一关 packagestep1; importjava.io.IOException; importorg.apache.hadoop.conf.Configuration; importorg.apache.hadoop.hbase.HBaseConfiguration; importorg.apache.hadoop.hbase.HColumnDescriptor; importorg.apache.hadoop.hbase.HTableDescriptor; import...

qq_57063581的博客 3万+

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

上一篇: 【我的物联网成长记13】物联网卡能否携号转网?
下一篇: 超强性能,秒级存储,华为云GeminiDB for Cassandra 正式商用了
A_F_O
博客等级 码龄7年 52粉丝 1453原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值