【大数据技术基础 | 实验八】HBase实验:新建HBase表

在这里插入图片描述

文章目录

    • 一、实验目的
    • 二、实验要求
    • 三、实验原理
    • 四、实验环境
    • 五、实验内容和步骤
      • (一)启动HBase集群
      • (二)编写项目java代码
      • (三)将代码导出jar包
    • 六、实验结果
    • 七、实验心得


一、实验目的

  1. 掌握HBase数据模型(逻辑模型及物理模型);
  2. 掌握如何使用Java代码获得HBase连接,并熟练Java对HBase数据库的基本操作,进一步加深对HBase表概念的理解。

二、实验要求

通过Java代码实现与HBase数据库连接,然后用Java API创建HBase表,向创建的表中写数据,最后将表中数据读取出来并展示。

三、实验原理

逻辑模型:HBase以表的形式存储数据,每个表由行和列组成,每个列属于一个特定的列族(Column Family)。表中的行和列确定的存储单元称为一个元素(Cell),每个元素保存了同一份数据的多个版本,由时间戳(Time Stamp)来标识。行健是数据行在表中的唯一标识,并作为检索记录的主键。在HBase中访问表中的行只有三种方式:通过单个行健访问、给定行键的范围扫描、全表扫描。行健可以是任意字符串,默认按字段顺序存储。表中的列定义为( <列族>: <限定符>),通过列族和限定符两部分可以唯一指定一个数据的存储列。元素由行健、列( <列族>: <限定符>)和时间戳唯一确定,元素中的数据以字节码的形式存储,没有类型之分。

物理模型:HBase是按照列存储的稀疏行/列矩阵,其物理模型实际上就是把概念模型中的一个行进行分割,并按照列族存储。

四、实验环境

  • 云创大数据实验平台:
    在这里插入图片描述
  • Java 版本:jdk1.7.0_79
  • Hadoop 版本:hadoop-2.7.1
  • ZooKeeper 版本:zookeeper-3.4.6
  • HBase 版本:hbase-1.1.2

五、实验内容和步骤

本实验主要演示HBase Java API的一些基本操作,包括取得链接,创建表,写数据,查询等几个步骤,具体内容如下:

(一)启动HBase集群

首先,使用一键搭建启动Hbase集群。详细步骤参考:【大数据技术基础 | 实验七】HBase实验:部署HBase。

cd /usr/cstor/hbase/bin
./start-hbase.sh

在这里插入图片描述

使用jps命令查看Java进程:

在这里插入图片描述 在这里插入图片描述 在这里插入图片描述

可以看到HBase集群启动成功。

(二)编写项目java代码

首先,在Eclipse中新建一个名为HbaseTest的Java Project。

其次,从HBase安装包的lib目录导入如下jar包到开发工具(jar包的版本号以实际的安装中的版本号为主):

commons-codec-1.4.jar
commons-collections-3.2.2.jar
commons-configuration-1.6.jar
commons-lang-2.6.jar
commons-logging-1.2.jar
guava-12.0.1.jar
hadoop-auth-2.7.2.jar
hadoop-common-2.7.2.jar
hadoop-hdfs-2.7.2.jar
hbase-client-1.1.2.jar
hbase-common-1.1.2.jar
hbase-protocol-1.1.2.jar
htrace-core-3.1.0-incubating.jar
httpclient-4.4.jar
httpcore-4.4.jar
libfb303-0.9.2.jar
log4j-1.2.17.jar
metrics-core-2.2.0.jar
netty-all-4.0.23.Final.jar
protobuf-java-2.5.0.jar
slf4j-api-1.7.7.jar
slf4j-log4j12-1.6.4.jar
zookeeper-3.4.6.jar

找到虚拟机内的HBase安装包的lib目录/usr/cstor/hbase/lib,然后将lib下的这些jar包导入到我们本地的项目lib目录内:

在这里插入图片描述
然后我们需要将这些jar包导入到我们的项目中,我们右键每一个jar包 -> Build Path -> Add to Build Path 即可导入成功:

在这里插入图片描述
导入成功后显示如下:

在这里插入图片描述
然后,获得HBase连接,代码实现:

Configuration configuration = HBaseConfiguration.create();
Connection connection;
configuration.set("hbase.zookeeper.quorum", "slave1:2181,slave2:2181,master:2181");
configuration.set("zookeeper.znode.parent", "/hbase");
connection = ConnectionFactory.createConnection(configuration);

然后,通过连接实现对HBase数据库的一些基本操作,如下:

新建HBase表,代码实现:

//获得HBaseAdmin对象
Admin admin = connection.getAdmin();
//表名称
String tn = "mytable";
TableName tableName = TableName.valueOf(tn);
//表不存在时创建表
if(!admin.tableExists(tableName))
{//创建表描述对象HTableDescriptor tableDescriptor = new HTableDescriptor(tableName);//列簇1HColumnDescriptor columnDescriptor1 = new HColumnDescriptor("c1".getBytes());tableDescriptor.addFamily(columnDescriptor1);//列簇2HColumnDescriptor columnDescriptor2 = new HColumnDescriptor("c2".getBytes());tableDescriptor.addFamily(columnDescriptor2);//用HBaseAdmin对象创建表admin.createTable(tableDescriptor);
}
//关闭HBaseAdmin对象
admin.close();

向表put数据,代码实现:

//获得table接口
Table table = connection.getTable(TableName.valueOf("mytable"));
//添加的数据对象集合
List<Put> putList = new ArrayList<Put>();
//添加10行数据
for(int i=0; i<10; i++)
{//put对象(rowkey)String rowkey = "mykey" + i;Put put = new Put(rowkey.getBytes());//列簇 , 列名, 值put.addColumn("c1".getBytes(), "c1tofamily1".getBytes(), ("aaa"+i).getBytes());put.addColumn("c1".getBytes(), "c2tofamily1".getBytes(), ("bbb"+i).getBytes());put.addColumn("c2".getBytes(), "c1tofamily2".getBytes(), ("ccc"+i).getBytes());putList.add(put);
}
table.put(putList);
table.close();

查询数据,代码实现:

//获得table接口(这行代码注意取舍,如果查询的代码和插入代码在同一个类中,则可以不要下面的这行)
Table table = connection.getTable(TableName.valueOf("mytable"));
//Scan 对象
Scan scan = new Scan();
//限定rowkey查询范围
scan.setStartRow("mykey0".getBytes());
scan.setStopRow("mykey9".getBytes());
//只查询c1:c1tofamily1列
scan.addColumn("c1".getBytes(), "c1tofamily1".getBytes());
//过滤器集合
FilterList filterList = new FilterList();
//查询符合条件c1:c1tofamily1==aaa7的记录
Filter filter1 = new SingleColumnValueFilter("c1".getBytes(), "c1tofamily1".getBytes(), 
CompareFilter.CompareOp.EQUAL, "aaa7".getBytes());
filterList.addFilter(filter1);
scan.setFilter(filterList);
ResultScanner results = table.getScanner(scan);
for (Result result : results) {  System.out.println("获得到rowkey:" + new String(result.getRow()));for (Cell cell : result.rawCells()) {System.out.println("列簇:" + Bytes.toString(cell.getFamilyArray(),cell.getFamilyOffset(),cell.getFamilyLength()) + "列:" + Bytes.toString(cell.getQualifierArray(),cell.getQualifierOffset(),cell.getQualifierLength()) + "值:" +Bytes.toString(cell.getValueArray(), cell.getValueOffset(), cell.getValueLength()));}
}
results.close();
table.close();

:完整代码如下:

import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.*;
import org.apache.hadoop.hbase.client.*;
import org.apache.hadoop.hbase.filter.CompareFilter;
import org.apache.hadoop.hbase.filter.Filter;
import org.apache.hadoop.hbase.filter.FilterList;
import org.apache.hadoop.hbase.filter.SingleColumnValueFilter;
import org.apache.hadoop.hbase.util.Bytes;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;public class Main {public static void main(String[] args) {Configuration configuration = HBaseConfiguration.create();Connection connection;configuration.set("hbase.zookeeper.quorum", "slave1:2181,slave2:2181,master:2181");configuration.set("zookeeper.znode.parent", "/hbase");try {connection = ConnectionFactory.createConnection(configuration);//获得HBaseAdmin对象Admin admin = connection.getAdmin();//表名称String tn = "mytable";TableName tableName = TableName.valueOf(tn);//表不存在时创建表if (!admin.tableExists(tableName)) {//创建表描述对象HTableDescriptor tableDescriptor = new HTableDescriptor(tableName);//列簇1HColumnDescriptor columnDescriptor1 = new HColumnDescriptor("c1".getBytes());tableDescriptor.addFamily(columnDescriptor1);//列簇2HColumnDescriptor columnDescriptor2 = new HColumnDescriptor("c2".getBytes());tableDescriptor.addFamily(columnDescriptor2);//用HBaseAdmin对象创建表admin.createTable(tableDescriptor);}//关闭HBaseAdmin对象admin.close();//向表put数据,代码实现://获得table接口Table table = connection.getTable(TableName.valueOf("mytable"));//添加的数据对象集合List<Put> putList = new ArrayList<Put>();//添加10行数据for (int i = 0; i < 10; i++) {//put对象(rowkey)String rowkey = "mykey" + i;Put put = new Put(rowkey.getBytes());//列簇 , 列名, 值put.addColumn("c1".getBytes(), "c1tofamily1".getBytes(), ("aaa" + i).getBytes());put.addColumn("c1".getBytes(), "c2tofamily1".getBytes(), ("bbb" + i).getBytes());put.addColumn("c2".getBytes(), "c1tofamily2".getBytes(), ("ccc" + i).getBytes());putList.add(put);}table.put(putList);table.close();//查询数据,代码实现://获得table接口//Scan 对象Scan scan = new Scan();//限定rowkey查询范围scan.setStartRow("mykey0".getBytes());scan.setStopRow("mykey9".getBytes());//只查询c1:c1tofamily1列scan.addColumn("c1".getBytes(), "c1tofamily1".getBytes());//过滤器集合FilterList filterList = new FilterList();//查询符合条件c1:c1tofamily1==aaa7的记录Filter filter1 = new SingleColumnValueFilter("c1".getBytes(), "c1tofamily1".getBytes(), CompareFilter.CompareOp.EQUAL, "aaa7".getBytes());filterList.addFilter(filter1);scan.setFilter(filterList);ResultScanner results = table.getScanner(scan);for (Result result : results) {System.out.println("获得到rowkey:" + new String(result.getRow()));for (Cell cell : result.rawCells()) {                    System.out.println("列簇:" +Bytes.toString(cell.getFamilyArray(), cell.getFamilyOffset(), cell.getFamilyLength()) + "列:" +Bytes.toString(cell.getQualifierArray(), cell.getQualifierOffset(), cell.getQualifierLength()) + "值:" +Bytes.toString(cell.getValueArray(), cell.getValueOffset(), cell.getValueLength()));}}results.close();table.close();} catch (IOException e) {e.printStackTrace();}}
}

最后,要点击菜单栏中的Run,选择Run As -> Java Application。这将自动创建一个默认的运行配置。

在这里插入图片描述

(三)将代码导出jar包

将上述代码打成jar包,注意要选择Runnable JAR file:

在这里插入图片描述
Launch configuration选择Main - HbaseTest:(注意:若上一步中,没有选择Run As -> Java Application创建运行配置,这里则没有Main - HbaseTest的选项)

在这里插入图片描述
用WinSCP工具上传到客户端节点:

在这里插入图片描述
最后,将Java代码打成jar包,并上传到客户端执行。

java -jar HbaseTest.jar

在这里插入图片描述

六、实验结果

表创建完,然后添加数据后,可以通过shell查看mytable表数据,共插入10条数据,数据内容如图所示。

cd /usr/cstor/hbase/bin
./hbase shell

在这里插入图片描述

scan 'mytable'

在这里插入图片描述

七、实验心得

  在本次实验中,我通过Java代码实现了与HBase数据库的连接,并进行了创建表、插入数据和查询数据的操作。这一过程中,我对HBase的逻辑模型和物理模型有了更深刻的理解。

  首先,HBase作为一个列式存储的数据库,以表的形式存储数据,每个表由行和列组成。通过实验,我了解到HBase中的行键是数据行的唯一标识,可以用于检索记录。在列的定义中,由列族和限定符组合唯一确定一个数据的存储位置。通过这些基础知识,我能够更好地理解HBase的数据组织方式,尤其是其多版本数据管理的独特优势。

  其次,实验中我学习了如何通过Java代码创建HBase表。通过连接HBase服务器,利用Java API获取HBase的管理对象,并在表不存在时创建表,定义列族。接下来,我使用了Put对象将数据插入表中。通过这种方式插入多行数据,验证了HBase在海量数据处理和存储上的效率与优势。

  最后,我完成了对数据的查询操作。在查询时,我使用了扫描和过滤器来限定查询条件。这种灵活的查询方式让我体验到了HBase对于复杂数据分析和处理的支持。

  此次实验强化了我对HBase数据库操作的掌握,使我认识到HBase在分布式环境下的应用潜力。通过Java代码与HBase的交互,我加深了对HBase表和列族概念的理解,掌握了其增删查改的基本操作。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/9202.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

密钥管理服务 (KMS) 故障排除指南

企业客户将密钥管理服务 (KMS) 设置为部署流程的一部分&#xff0c;因为通过该服务&#xff0c;他们可以使用简单、直接的过程在其环境中激活 Windows。 通常&#xff0c;一旦设置了 KMS 主机&#xff0c;KMS 客户端就会自动连接到主机并自行激活。 然而&#xff0c;有时该流程…

CSS的配色

目录 1 十六进制2 CSS中的十六进制2.1 十六进制颜色的基本结构2.2 十六进制颜色的范围2.3 简写形式2.4 透明度 3 CSS的命名颜色4 配色4.1 色轮4.2 互补色4.3 类似色4.4 配色工具 日常在开发小程序中&#xff0c;客户总是希望你的配色是美的&#xff0c;但是美如何定义&#xff…

基于 RNN 的语言模型

基于 RNN 的语言模型 循环神经网络&#xff08;Recurrent Neural Network, RNN&#xff09;是一类网络连接中包含环路的 神经网络的总称。 给定一个序列&#xff0c;RNN 的环路用于将历史状态叠加到当前状态上。沿着时间维度&#xff0c;历史状态被循环累积&#xff0c;并作为…

【软考网工笔记】网络基础理论——物理层

文章目录 贝尔系统 T1 载波光纤 - SFP接口差分&&曼彻斯特编码网桥MAC-in-MACQ-in-QIPv6的链路本地地址CRC校验与计算E1载波编码效率对称xDSL坚持算法-CSMAUDP头部字段万兆以太网标准 IEEE 802.3ae海明码-纠错码ARP帧中的目标MAC地址快速以太区网物理层标准 100BASE-TXM…

现代Web开发:TypeScript 深入解析与最佳实践

&#x1f493; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4dd; Gitee主页&#xff1a;瑕疵的gitee主页 ⏩ 文章专栏&#xff1a;《热点资讯》 现代Web开发&#xff1a;TypeScript 深入解析与最佳实践 现代Web开发&#xff1a;TypeScript 深入解析与最佳实践 现代Web开发&a…

HCIP MPLS基础

一、 实验拓扑 二、 实验需求及解法 本实验模拟BGP路由黑洞环境&#xff0c;使用MPLS LDP解决路由黑洞。 完成以下需求&#xff1a; 1.设备IP地址配置&#xff0c;请测试直连。 sysname R1 interface GigabitEthernet0/0/0ip address 12.1.1.1 255.255.255.0interface Loop…

Kubernetes架构及核心组件

一、基本架构 Kubernetes集群可以被看作是一个工厂,而各个组件则是这个工厂里的不同部门: Kubernetes API服务器:就像是这个工厂的总经理,负责接收所有的请求并将它们分配给相应的部门进行处理。 etcd:就像是这个工厂的记事本,负责记录所有的配置信息和状态信息,以便其…

移动开发(七):.NET MAUI使用RESTAPI实现查询天气笔记

目录 一、接口准备 二、实体部分 三、页面部分 四、后台代码逻辑 五、总结 在移动开发过程中,第三方对接是非常常见的。今天给大家分享.NET MAUI如何使用REST API实现输入城市名称查询天气的示例,希望对大家学习.NET MAUI可以提供一些帮助! 一、接口准备 首先我们需要…

聊聊基于BERT模型实现多标签分类任务的实践与思考

概述 以预训练大模型为基座神经网络模型&#xff0c;通过模型预训练后的泛化能力与微调后的领域能力&#xff0c;作为NLP任务的解决方案。 在github上找了一个简单的仓库——multi_label_classification&#xff0c;该仓库基于BERT预训练大模型实现了多分类任务。通过对该仓库…

C语言 【大白话讲指针(中)】

在之前的文章中我们已经知道了指针的概念&#xff0c;指针就是一个变量&#xff0c;用来存放地址&#xff0c;地址指向唯一一块内存空间。指针的大小是固定的4/8个字节&#xff08;32为机器/64位机器&#xff09;。指针是有类型的&#xff0c;指针的类型决定了指针加减整数的步…

大数据分析在市场营销中的应用

&#x1f493; 博客主页&#xff1a;瑕疵的CSDN主页 &#x1f4dd; Gitee主页&#xff1a;瑕疵的gitee主页 ⏩ 文章专栏&#xff1a;《热点资讯》 大数据分析在市场营销中的应用 大数据分析在市场营销中的应用 大数据分析在市场营销中的应用 引言 大数据分析概述 定义与原理 发…

启明云端触觉智能与您相约2024年慕尼黑国际电子元器件博览会,不见不散!

展会信息 展会日期: 2024年11月12-15日 展馆名称: 慕尼黑国际展览中心 MesseMnchen exhibition center 展馆地址: Messegelnde 81829 Mnchen Germany 启明云端&触觉智能展位号&#xff1a;B6-351 诚邀您莅临我司展位&#xff0c;让我们在慕尼黑不见不散&#xff01; …

OPPO开源Diffusion多语言适配器—— MultilingualSD3-adapter 和 ChineseFLUX.1-adapter

MultilingualSD3-adapter 是为 SD3 量身定制的多语言适配器。 它源自 ECCV 2024 的一篇题为 PEA-Diffusion 的论文。ChineseFLUX.1-adapter是为Flux.1系列机型量身定制的多语言适配器&#xff0c;理论上继承了ByT5&#xff0c;可支持100多种语言&#xff0c;但在中文方面做了额…

【JavaEE初阶】网络原理(4)

欢迎关注个人主页&#xff1a;逸狼 创造不易&#xff0c;可以点点赞吗~ 如有错误&#xff0c;欢迎指出~ 目录 网络层 > IP协议 IP协议报头结构 4位版本 4位首部长度 8位服务类型(TOS) 16位总长度(字节数), 16位标识 3位标志位 13位片偏移 8位生存时间(TTL) 8位协议 16位首部…

树莓派上安装与配置 Nginx Web 服务器教程

在树莓派上配置 Nginx 作为 Web 服务器的步骤如下&#xff1a; 1. 更新树莓派 首先&#xff0c;确保你的树莓派系统是最新的。打开终端并执行以下命令&#xff1a; sudo apt update sudo apt upgrade -y2. 安装 Nginx 在树莓派上安装 Nginx&#xff1a; sudo apt install …

Android Studio 中关于com.github.barteksc:android-pdf-viewer 无法正确加载的问题

Android Studio 的app 模块下&#xff0c;添加依赖&#xff1a; implementation com.github.barteksc:android-pdf-viewer:3.2.0-beta.1 运行程序报错&#xff1a; Caused by: org.gradle.api.internal.artifacts.ivyservice.DefaultLenientConfiguration$ArtifactResolveEx…

[JAVA]Maven项目标准结构介绍

什么是Maven&#xff1f; Maven 是一个强大的项目管理和构建自动化工具&#xff0c;在Java开发中&#xff0c;一个项目通常会依赖许多外部的库&#xff0c;比如开发一个Web应用可能需要依赖Servlet APL&#xff0c;Spring框架等&#xff0c;和需要引入大量的Jar包。往往一个Ja…

Ansys EMC Plus:MHARNESS 串扰演示

Ansys EMC Plus 是一款强大的工具&#xff0c;专门用于分析电磁场及其影响&#xff0c;涵盖电磁兼容性和雷电效应分析等领域。 在本演示中&#xff0c;我们将探讨建立 MHARNESS 仿真的基础知识。这包括构建基本电缆线束、创建 MHARNESS 源和设置 MHARNESS 探针的过程。 概述 …

星环大数据平台--TDH部署

1.1 准备一台虚拟机 正常安装一台新的虚拟机&#xff0c; 内存16G&#xff0c;cpu8核&#xff0c;硬盘50G 1.2 安装前系统配置改动 修改/etc/hosts文件&#xff0c;确保hostname该文件包含节点的hostname和IP地址的映射关系列表。 hostname由数字、小写字母或“-”组成&am…

B+树与聚簇索引以及非聚簇索引的关系

B树、聚簇索引和非聚簇索引是数据库系统中非常重要的概念&#xff0c;它们共同决定了数据的存储和查询效率。本文将详细解释B树的结构&#xff0c;以及聚簇索引和非聚簇索引的区别和联系&#xff0c;使读者能够更好地理解这些概念。 1.B树简介 B树是一种多路平衡树&#xff0c;…