【大数据技术Hadoop+Spark】HBase数据模型、Shell操作、Java API示例程序讲解(附源码 超详细)

本文涉及的产品
云原生大数据计算服务MaxCompute,500CU*H 100GB 3个月
云原生大数据计算服务 MaxCompute,5000CU*H 100GB 3个月
简介: 【大数据技术Hadoop+Spark】HBase数据模型、Shell操作、Java API示例程序讲解(附源码 超详细)

一、HBase数据模型

HBase分布式数据库的数据存储在行列式的表格中,它是一个多维度的映射模型,其数据模型如下所示。表的索引是行键,列族,列限定符和时间戳,表在水平方向由一个或者多个列族组成,一个列族中可以包含任意多个列,列族支持动态扩展,可以很轻松的添加一个列族或者列,无须预先定义列的数量及数据类型,所有列均以字符串形式存储

RowKey表示行键,每个HBase表中只能有一个行键,它在HBase中以字典序的方式存储。由于RowKey是HBase表的唯一标识,因此Row Key的设计非常重要。

HBase表的列是由列族名、限定符以及列名组成的,其中“:”为限定符。创建HBase表不需要指定列,因为列是可变的,非常灵活。

在HBase中,列族由很多列组成。在同一个表里,不同列族有完全不同的属性,但是同一个列族内的所有列都会有相同的属性,而属性都是定义在列族上的。

表示时间戳,记录每次操作数据的时间,通常记作数据的版本号。

二、HBase的Shell操作

HBase Shell提供大量操作HBase的命令,通过Shell命令很方便地操作HBase数据库,如创建、删除及修改表、向表中添加数据、列出表中的相关信息等操作。当使用Shell命令行操作HBase时,需要进入HBase Shell交互界面,执行“bin/hbase shell”命令进入到目录/hbase的界面。

在HBase Shell交互界面中,可通过一系列Shell命令操作HBase,下面通过一张表列举操作HBase表常见的Shell命令。

1)显示hbase中的表l ist

2)创建表user,包含info、data两个列族

3)向user表中插入数据

4)获取user表中row key为rk0001的所有信息

5)获取user表中row key为rk0001,列族为info,版本号最新3个的信息 HBase2.0默认VERSIONS为1,也就是说,默认情况只会存取一个版本的列数据。需要使用alter命令修改表的版本号。

清空表数据

添加列族

三、HBase的Java API操作

HBase是由Java语言开发的,它对外提供了Java API的接口。下面,通过一个表来列举HBase常见的Java API。

下面代码主要利用HBase常用的Java API进行表的创建,插入,删除等操作

package com.hadoop.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 org.junit.Before;
import org.junit.Test;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class HbaseApiDemo {
    //初始化Configuration对象
    private Configuration conf = null;
    //初始化连接
    private Connection conn = null;
    @Before
    public void init() throws Exception {
        //获取Configuration对象
        conf = HBaseConfiguration.create();
        //对于hbase的客户端来说,只需要知道hbase所经过的Zookeeper集群地址即可
          conf.set("hbase.zookeeper.quorum", "bigdata01:2181,bigdata02:2181,bigdata03:2181");
        //获取连接
        conn = ConnectionFactory.createConnection(conf);
    }
     @Test
    public void CreateTable() throws Exception {
        try {
            //获取操作对象
            Admin admin = conn.getAdmin();
            //构建一个user表
            TableDescriptorBuilder t_user = TableDescriptorBuilder.newBuilder(TableName.valueOf("t_user"));
             //创建列族  1
            ColumnFamilyDescriptor of = ColumnFamilyDescriptorBuilder.of("info");
            t_user.setColumnFamily(of);
            //创建列族  2
            ColumnFamilyDescriptor of1 = ColumnFamilyDescriptorBuilder.of("data");
            t_user.setColumnFamily(of1);
            //构建
            TableDescriptor build = t_user.build();
            //创建表
            admin.createTable(build);
            // 关闭连接
            admin.close();
            conn.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    @Test
    public void testPut() throws Exception {
        //创建table对象,通过table对象来添加数据
        Table table = conn.getTable(TableName.valueOf("t_user"));
        //创建一个集合,用于存放Put对象
        ArrayList<Put> puts = new ArrayList<Put>();
        //构建put对象(kv形式),并指定其行键
        Put put01 = new Put(Bytes.toBytes("rk002"));
        put01.addColumn(Bytes.toBytes("info"),
                Bytes.toBytes("username"), Bytes.toBytes("zhangsan"));
        put01.addColumn(Bytes.toBytes("info"),
                Bytes.toBytes("password"), Bytes.toBytes("345678"));
        Put put02 = new Put("rk003".getBytes());
        put02.addColumn(Bytes.toBytes("info"),
                Bytes.toBytes("username"), Bytes.toBytes("lisi"));
         //把所有的put对象添加到一个集合中
        puts.add(put01);
        puts.add(put02);
        //提交所有的插入数据的记录
        table.put(puts);
        //关闭
        table.close();
        conn.close();
    }
    @Test
    public void testGet() throws IOException {
        Table table = conn.getTable(TableName.valueOf("t_user"));
        //得到用于扫描region的对象
//        Scan scan = new Scan();
        Get get = new Get("rk002".getBytes());
        //使用HTable得到resultcanner实现类的对象
        Result result1 = table.get(get);
        List<Cell> cells = result1.listCells();
        for (Cell cell : cells) {
            //得到rowkey
            System.out.println("行键:" + Bytes.toString(CellUtil.cloneRow(cell)));
            //得到列族
            System.out.println("列族:" + Bytes.toString(CellUtil.cloneFamily(cell)));
            System.out.println("列:" + Bytes.toString(CellUtil.cloneQualifier(cell)));
            System.out.println("值:" + Bytes.toString(CellUtil.cloneValue(cell)));
        }
    }
    @Test
    public void testScan() throws Exception {
        //获取table对象
        Table table = conn.getTable(TableName.valueOf("t_user"));
        //获取scan对象
        Scan scan = new Scan();
        //获取查询的数据
        ResultScanner scanner = table.getScanner(scan);
        //获取ResultScanner所有数据,返回迭代器
        Iterator<Result> iter = scanner.iterator();
        //遍历迭代器
        while (iter.hasNext()) {
            //获取当前每一行结果数据
            Result result = iter.next();
            //获取当前每一行中所有的cell对象
            List<Cell> cells = result.listCells();
            //迭代所有的cell
            for(Cell c:cells){
                //获取行键
                byte[] rowArray = c.getRowArray();
                //获取列族
                byte[] familyArray = c.getFamilyArray();
                //获取列族下的列名称
                byte[] qualifierArray = c.getQualifierArray();
                //列字段的值
                byte[] valueArray = c.getValueArray();
                //打印rowArray、familyArray、qualifierArray、valueArray
                System.out.println("行键:"+new String(rowArray, c.getRowOffset(),
                        c.getRowLength()));
                System.out.print("列族:"+new String(familyArray,c.getFamilyOffset(),
                        c.getFamilyLength()));
                System.out.print(" "+"列:"+ new String(qualifierArray,
                        c.getQualifierOffset(), c.getQualifierLength()));
                System.out.println(" "+"值:"+ new String(valueArray,
                        c.getValueOffset(), c.getValueLength()));
            }
            System.out.println("-----------------------");
        }
        //关闭
        table.close();
        conn.close();
    }
    @Test
    public void testDel() throws Exception {
        //获取table对象
        Table table = conn.getTable(TableName.valueOf("t_user"));
        //获取delete对象,需要一个rowkey
        Delete delete = new Delete("rk002".getBytes());
        //在delete对象中指定要删除的列族-列名称
        delete.addColumn("info".getBytes(), "password".getBytes());
        //执行删除操作
        table.delete(delete);
        //关闭
        table.close();
        conn.close();
    }
    @Test
    public void testDrop() throws Exception {
        //获取一个表的管理器
        Admin admin = conn.getAdmin();
        //删除表时先需要禁用表
        admin.disableTable(TableName.valueOf("t_user"));
        admin.deleteTable(TableName.valueOf("t_user"));
        //关闭
        admin.close();
        conn.close();
    }
}

创作不易 觉得有帮助请点赞关注收藏~~~

相关实践学习
lindorm多模间数据无缝流转
展现了Lindorm多模融合能力——用kafka API写入,无缝流转在各引擎内进行数据存储和计算的实验。
云数据库HBase版使用教程
&nbsp; 相关的阿里云产品:云数据库 HBase 版 面向大数据领域的一站式NoSQL服务,100%兼容开源HBase并深度扩展,支持海量数据下的实时存储、高并发吞吐、轻SQL分析、全文检索、时序时空查询等能力,是风控、推荐、广告、物联网、车联网、Feeds流、数据大屏等场景首选数据库,是为淘宝、支付宝、菜鸟等众多阿里核心业务提供关键支撑的数据库。 了解产品详情:&nbsp;https://cn.aliyun.com/product/hbase &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
11天前
|
图形学 数据可视化 开发者
超实用Unity Shader Graph教程:从零开始打造令人惊叹的游戏视觉特效,让你的作品瞬间高大上,附带示例代码与详细步骤解析!
【8月更文挑战第31天】Unity Shader Graph 是 Unity 引擎中的强大工具,通过可视化编程帮助开发者轻松创建复杂且炫酷的视觉效果。本文将指导你使用 Shader Graph 实现三种效果:彩虹色渐变着色器、动态光效和水波纹效果。首先确保安装最新版 Unity 并启用 Shader Graph。创建新材质和着色器图谱后,利用节点库中的预定义节点,在编辑区连接节点定义着色器行为。
42 0
|
16天前
|
分布式计算 资源调度 Hadoop
Hadoop入门基础(五):Hadoop 常用 Shell 命令一网打尽,提升你的大数据技能!
Hadoop入门基础(五):Hadoop 常用 Shell 命令一网打尽,提升你的大数据技能!
|
17天前
|
存储 SQL 分布式计算
Hadoop生态系统概述:构建大数据处理与分析的基石
【8月更文挑战第25天】Hadoop生态系统为大数据处理和分析提供了强大的基础设施和工具集。通过不断扩展和优化其组件和功能,Hadoop将继续在大数据时代发挥重要作用。
|
19天前
|
资源调度 分布式计算 Hadoop
揭秘Hadoop Yarn背后的秘密!它是如何化身‘资源大师’,让大数据处理秒变高效大戏的?
【8月更文挑战第24天】在大数据领域,Hadoop Yarn(另一种资源协调者)作为Hadoop生态的核心组件,扮演着关键角色。Yarn通过其ResourceManager、NodeManager、ApplicationMaster及Container等组件,实现了集群资源的有效管理和作业调度。当MapReduce任务提交时,Yarn不仅高效分配所需资源,还能确保任务按序执行。无论是处理Map阶段还是Reduce阶段的数据,Yarn都能优化资源配置,保障任务流畅运行。此外,Yarn还在Spark等框架中展现出灵活性,支持不同模式下的作业执行。未来,Yarn将持续助力大数据技术的发展与创新。
27 2
|
25天前
|
缓存 监控 Java
"Java垃圾回收太耗时?阿里HBase GC优化秘籍大公开,让你的应用性能飙升90%!"
【8月更文挑战第17天】阿里巴巴在HBase实践中成功将Java垃圾回收(GC)时间降低90%。通过选用G1垃圾回收器、精细调整JVM参数(如设置堆大小、目标停顿时间等)、优化代码减少内存分配(如使用对象池和缓存),并利用监控工具分析GC行为,有效缓解了高并发大数据场景下的性能瓶颈,极大提升了系统运行效率。
38 4
|
14天前
|
SQL 分布式计算 数据可视化
基于Hadoop的大数据可视化方法
【8月更文第28天】在大数据时代,有效地处理和分析海量数据对于企业来说至关重要。Hadoop作为一个强大的分布式数据处理框架,能够处理PB级别的数据量。然而,仅仅完成数据处理还不够,还需要将这些数据转化为易于理解的信息,这就是数据可视化的重要性所在。本文将详细介绍如何使用Hadoop处理后的数据进行有效的可视化分析,并会涉及一些流行的可视化工具如Tableau、Qlik等。
43 0
|
22天前
|
分布式计算 Hadoop 大数据
大数据处理框架在零售业的应用:Apache Hadoop与Apache Spark
【8月更文挑战第20天】Apache Hadoop和Apache Spark为处理海量零售户数据提供了强大的支持
32 0
|
JSON 物联网 API
阿里云API芝士堂[物模型管理][模型]
将近一年没有关注阿里云物联网的api,最近看了下官网的文档,api列表中赫然多出了物模型的管理和使用两大类.这也难怪,物模型被誉为物联网世界的原子. 通过物模型可以有效的使用属性,服务和事件就可以表示出纷繁复杂和多姿多彩的物联网世界中的各种类型的设备;目前物模型并没有统一的规范,所以阿里,小米, 京东和中移动等大厂,都是各自制定一套自己的规范;阿里云这面主要是在自家的ICA联盟定义了一套物模型的规范.本文也从实践角度分享一下物模型相关api的使用.
475 0
|
28天前
|
机器人 API Python
智能对话机器人(通义版)会话接口API使用Quick Start
本文主要演示了如何使用python脚本快速调用智能对话机器人API接口,在参数获取的部分给出了具体的获取位置截图,这部分容易出错,第一次使用务必仔细参考接入参数获取的位置。
|
13天前
|
存储 JSON API
淘系API接口(解析返回的json数据)商品详情数据解析助力开发者
——在成长的路上,我们都是同行者。这篇关于商品详情API接口的文章,希望能帮助到您。期待与您继续分享更多API接口的知识,请记得关注Anzexi58哦! 淘宝API接口(如淘宝开放平台提供的API)允许开发者获取淘宝商品的各种信息,包括商品详情。然而,需要注意的是,直接访问淘宝的商品数据API通常需要商家身份或开发者权限,并且需要遵循淘宝的API使用协议。
淘系API接口(解析返回的json数据)商品详情数据解析助力开发者