HBase 开发:使用Java操作HBase

这篇具有很好参考价值的文章主要介绍了HBase 开发:使用Java操作HBase。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

第1关:创建表

题目

任务描述

本关任务:使用Java代码在HBase中创建表。

相关知识

为了完成本关任务,你需要掌握:1.如何使用Java连接HBase数据库,2.如何使用Java代码在HBase中创建表。

如何使用Java连接HBase数据库

Java连接HBase需要两个类:

  • HBaseConfiguration

  • ConnectionFactory

HBaseConfiguration

要连接HBase我们首先需要创建Configuration对象,这个对象我们需要通过HBaseConfigurationHBase配置)对象来进行创建,HBaseConfiguration看名字我们就能猜到它的用途:读取指定路径下hbase-site.xmlhbase-default.xml的配置信息

具体用法:

 Configuration config = HBaseConfiguration.create(); //使用create()静态方法就可以得到Configuration对象


ConnectionFactory

获取到连接对象Connextion我们就算连接上了HBase了,怎么获取呢?

通过ConnectionFactory(连接工厂)的方法我们就能获取到Connection(连接对象)了。

具体用法:

Connection connection = ConnectionFactory.createConnection(config); //config为前文的配置对象


使用这两个步骤就能完成连接HBase了。

注意:在1.0之前的版本HBase是使用HBaseAdminHTable等来操作HBase的,但是在1.0之后的版本中这些被弃用了,新的客户端API更加干净简洁,本文使用的HBase2.1.1版本(18年10月发布)的,

创建表

要创建表我们需要首先创建一个Admin对象,然后让它来创建一张表:

Admin admin = connection.getAdmin(); //使用连接对象获取Admin对象TableName tableName = TableName.valueOf("test");//定义表名HTableDescriptor htd = new HTableDescriptor(tableName);//定义表对象HColumnDescriptor hcd = new HColumnDescriptor("data");//定义列族对象htd.addFamily(hcd); //添加admin.createTable(htd);//创建表


HBase2.X创建表

上述创建表的方法是HBase1.X版本的方式,而在HBase2.X的版本中创建表使用了新的API,创建表关键代码如下:

TableName tableName = TableName.valueOf("test");//定义表名//TableDescriptor对象通过TableDescriptorBuilder构建;TableDescriptorBuilder tableDescriptor = TableDescriptorBuilder.newBuilder(tableName);ColumnFamilyDescriptor family = ColumnFamilyDescriptorBuilder.newBuilder(Bytes.toBytes("data")).build();//构建列族对象tableDescriptor.setColumnFamily(family);//设置列族admin.createTable(tableDescriptor.build());//创建表


2.X版本中主要是HTableDescriptor对象被弃用,取而代之的是TableDescriptor对象,TableDescriptor对象通过TableDescriptorBuilder构建;

TableName tableName = TableName.valueOf("test");TableDescriptorBuilder tableDescriptor = TableDescriptorBuilder.newBuilder(tableName);


然后添加列簇方法变更:

ColumnFamilyDescriptor family = ColumnFamilyDescriptorBuilder.newBuilder(Bytes.toBytes("data")).build();//构建列族对象tableDescriptor.setColumnFamily(family);        //设置列族


最后由Admin对象进行创建表操作:

admin.createTable(tableDescriptor.build());


值得咱们注意的是,如果你的HBase环境是1.X的那么你只能使用第一种方式来创建表,如果是2.X的版本,那么两种方式你都可以使用(本实训使用的 HBase2.1.1版本,所以两种都可用)。

编程要求

好了,到你啦,使用本关知识,在右侧编辑器begin-end处补充代码,请你编写一个Java程序,在HBase中创建表dept,emp,列都为:data

测试说明

注意:

点击测评之前,请先开启Hadoopstart-dfs.sh)和HBasestart-hbase.sh),并且需要等待HBase初始化完成(20秒左右),否则无法在HBase中创建表。

怎么查看HBase初始化成功了呢?

输入hadoop fs -ls /hbase有如下结果即可:

如果启动过程中出现: datanode running as process 214. Stop it first.说明Hadoop的进程还没有被杀死。

需要我们重新stop-dfs.shstop-hbase.sh,然后在重启。

代码

命令行

start-dfs.sh
start-hbase.sh


文章来源地址https://www.toymoban.com/news/detail-792002.html

package step1;import java.io.IOException;import org.apache.hadoop.conf.Configuration;import org.apache.hadoop.hbase.HBaseConfiguration;import org.apache.hadoop.hbase.HColumnDescriptor;import org.apache.hadoop.hbase.HTableDescriptor;import org.apache.hadoop.hbase.TableName;import org.apache.hadoop.hbase.client.Admin;import org.apache.hadoop.hbase.client.ColumnFamilyDescriptor;import org.apache.hadoop.hbase.client.ColumnFamilyDescriptorBuilder;import org.apache.hadoop.hbase.client.Connection;import org.apache.hadoop.hbase.client.ConnectionFactory;import org.apache.hadoop.hbase.client.Get;import org.apache.hadoop.hbase.client.Put;import org.apache.hadoop.hbase.client.Result;import org.apache.hadoop.hbase.client.ResultScanner;import org.apache.hadoop.hbase.client.Scan;import org.apache.hadoop.hbase.client.Table;import org.apache.hadoop.hbase.client.TableDescriptor;import org.apache.hadoop.hbase.client.TableDescriptorBuilder;import org.apache.hadoop.hbase.util.Bytes;public class Task{
	
	public void createTable()throws Exception{
		/********* Begin *********/
         Configuration config = HBaseConfiguration.create(); //使用create()静态方法就可以得到Configuration对象
        Connection connection = ConnectionFactory.createConnection(config); //config为前文的配置对象

		Admin admin = connection.getAdmin(); //使用连接对象获取Admin对象
        TableName tableName = TableName.valueOf("dept");//定义表名//TableDescriptor对象通过TableDescriptorBuilder构建;
        TableDescriptorBuilder tableDescriptor = TableDescriptorBuilder.newBuilder(tableName);
        ColumnFamilyDescriptor family = ColumnFamilyDescriptorBuilder.newBuilder(Bytes.toBytes("data")).build();//构建列族对象
        tableDescriptor.setColumnFamily(family);//设置列族
        admin.createTable(tableDescriptor.build());//创建表


        tableName = TableName.valueOf("emp");//定义表名//TableDescriptor对象通过TableDescriptorBuilder构建;
        tableDescriptor = TableDescriptorBuilder.newBuilder(tableName);
        family = ColumnFamilyDescriptorBuilder.newBuilder(Bytes.toBytes("data")).build();//构建列族对象
        tableDescriptor.setColumnFamily(family);//设置列族
        admin.createTable(tableDescriptor.build());//创建表

		/********* End *********/
	}}


第2关:添加数据

题目

任务描述

本关任务:使用Java代码向HBase集群中创建表并添加数据。

相关知识

为了完成本关任务,你需要掌握:PutTable对象如何使用。

添加数据

要对一个表添加数据,我们需要一个Put对象,在定义Put对象之前我们需要获取到Table对象,这样才能对指定的表进行操作:

Table table = connection.getTable(tableName);//获取Table对象try {
    byte[] row = Bytes.toBytes("row1");    //定义行
    Put put = new Put(row);                //创建Put对象
    byte[] columnFamily = Bytes.toBytes("data");    //列簇
    byte[] qualifier = Bytes.toBytes(String.valueOf(1)); //列
    byte[] value = Bytes.toBytes("张三丰");    //值
    put.addColumn(columnFamily, qualifier, value);
    table.put(put);        //向表中添加数据} finally {
    //使用完了要释放资源
    table.close();}


编程要求

好了,到你啦,使用本关知识,在右侧编辑器begin-end处补充代码,请你编写一个Java程序,在HBase中创建表tb_step2,列簇都为:data,添加数据:

  • 行号分别为:row1row2

  • 列名分别为:12

  • 值分别为:张三丰张无忌

测试说明

注意事项与上一关相同;

平台会执行你的代码,获取你向表中添加的数据;

预期输出:

row1:张三丰
row2:张无忌


代码

命令行

start-dfs.sh
start-hbase.sh


package step2;import java.io.IOException;import org.apache.hadoop.conf.Configuration;import org.apache.hadoop.hbase.HBaseConfiguration;import org.apache.hadoop.hbase.HColumnDescriptor;import org.apache.hadoop.hbase.HTableDescriptor;import org.apache.hadoop.hbase.TableName;import org.apache.hadoop.hbase.client.Admin;import org.apache.hadoop.hbase.client.ColumnFamilyDescriptor;import org.apache.hadoop.hbase.client.ColumnFamilyDescriptorBuilder;import org.apache.hadoop.hbase.client.Connection;import org.apache.hadoop.hbase.client.ConnectionFactory;import org.apache.hadoop.hbase.client.Get;import org.apache.hadoop.hbase.client.Put;import org.apache.hadoop.hbase.client.Result;import org.apache.hadoop.hbase.client.ResultScanner;import org.apache.hadoop.hbase.client.Scan;import org.apache.hadoop.hbase.client.Table;import org.apache.hadoop.hbase.client.TableDescriptor;import org.apache.hadoop.hbase.client.TableDescriptorBuilder;import org.apache.hadoop.hbase.util.Bytes;public class Task {

	public void insertInfo()throws Exception{
		/********* Begin *********/
        Configuration config = HBaseConfiguration.create(); //使用create()静态方法就可以得到Configuration对象
        Connection connection = ConnectionFactory.createConnection(config); //config为前文的配置对象

		Admin admin = connection.getAdmin(); //使用连接对象获取Admin对象
        TableName tableName = TableName.valueOf("tb_step2");//定义表名//TableDescriptor对象通过TableDescriptorBuilder构建;
        TableDescriptorBuilder tableDescriptor = TableDescriptorBuilder.newBuilder(tableName);
        ColumnFamilyDescriptor family = ColumnFamilyDescriptorBuilder.newBuilder(Bytes.toBytes("data")).build();//构建列族对象
        tableDescriptor.setColumnFamily(family);//设置列族
        admin.createTable(tableDescriptor.build());//创建表


        Table table = connection.getTable(tableName);//获取Table对象
        try {
            byte[] row = Bytes.toBytes("row1");    //定义行
            Put put = new Put(row);                //创建Put对象
            byte[] columnFamily = Bytes.toBytes("data");    //列簇
            byte[] qualifier = Bytes.toBytes(String.valueOf(1)); //列
            byte[] value = Bytes.toBytes("张三丰");    //值
            put.addColumn(columnFamily, qualifier, value);
            table.put(put);        //向表中添加数据

            row = Bytes.toBytes("row2");    //定义行
            put = new Put(row);                //创建Put对象
            columnFamily = Bytes.toBytes("data");    //列簇
            qualifier = Bytes.toBytes(String.valueOf(2)); //列
            value = Bytes.toBytes("张无忌");    //值
            put.addColumn(columnFamily, qualifier, value);
            table.put(put);        //向表中添加数据
        } finally {
            //使用完了要释放资源
            table.close();
        }

		/********* End *********/
	}}


第3关:获取数据

题目

任务描述

本关任务:获取HBase中已存在表的数据并输出。

相关知识

为了完成本关任务,你需要掌握:1.如何使用Get对象获取数据,2.如何使用Scan批量输出表中的数据。

获取指定行的数据

我们使用Get对象与Table对象就可以获取到表中的数据了。

//获取数据Get get = new Get(Bytes.toBytes("row1"));    //定义get对象Result result = table.get(get);            //通过table对象获取数据System.out.println("Result: " + result);//很多时候我们只需要获取“值” 这里表示获取 data:1 列族的值byte[] valueBytes = result.getValue(Bytes.toBytes("data"), Bytes.toBytes("1")); //获取到的是字节数组//将字节转成字符串String valueStr = new String(valueBytes,"utf-8");System.out.println("value:" + valueStr);


上述代码就可以查到table对象中行row1的数据了,亲自试试验证一下结果吧。

扫描表中的数据

只获取一行数据显然不能满足我们全部的需求,我们想要获取表中所有的数据应该怎么操作呢?

ScanResultScanner对象就派上用场了,接下来我们看个示例你应该就明白这两个对象的用法了:

Scan scan = new Scan();ResultScanner scanner = table.getScanner(scan);try {
    for (Result scannerResult: scanner) {
        System.out.println("Scan: " + scannerResult);
         byte[] row = scannerResult.getRow();
         System.out.println("rowName:" + new String(row,"utf-8"));
    }} finally {
    scanner.close();}


这样就能将指定表中的数据全部输出到控制台了。

运行上述代码你会看到类似这样的结果:

Scan: keyvalues={row1/data:1/1542657887632/Put/vlen=6/seqid=0}
rowName:row1
Scan: keyvalues={row2/data:2/1542657887634/Put/vlen=6/seqid=0}
rowName:row2


将表的数据和行以及列都展示了。

编程要求

使用本关知识,在右侧编辑器begin-end处补充代码,输出t_step3表中行号为row1,列族为data:1的值(以utf-8编码),输出table_step3表中所有行的行名称(因为直接输出scannerResult会带有时间戳,所以输出行名方便测评)。

测试说明

预期输出:

value:Educoder
rowName:row1
rowName:row2
rowName:row3
rowName:row4


代码

命令行

start-dfs.sh
start-hbase.sh


package step3;import java.io.IOException;import org.apache.hadoop.conf.Configuration;import org.apache.hadoop.hbase.HBaseConfiguration;import org.apache.hadoop.hbase.HColumnDescriptor;import org.apache.hadoop.hbase.HTableDescriptor;import org.apache.hadoop.hbase.TableName;import org.apache.hadoop.hbase.client.Admin;import org.apache.hadoop.hbase.client.ColumnFamilyDescriptor;import org.apache.hadoop.hbase.client.ColumnFamilyDescriptorBuilder;import org.apache.hadoop.hbase.client.Connection;import org.apache.hadoop.hbase.client.ConnectionFactory;import org.apache.hadoop.hbase.client.Get;import org.apache.hadoop.hbase.client.Put;import org.apache.hadoop.hbase.client.Result;import org.apache.hadoop.hbase.client.ResultScanner;import org.apache.hadoop.hbase.client.Scan;import org.apache.hadoop.hbase.client.Table;import org.apache.hadoop.hbase.client.TableDescriptor;import org.apache.hadoop.hbase.client.TableDescriptorBuilder;import org.apache.hadoop.hbase.util.Bytes;public class Task {

	public void queryTableInfo()throws Exception{
		/********* Begin *********/
        Configuration config = HBaseConfiguration.create(); //使用create()静态方法就可以得到Configuration对象
        Connection connection = ConnectionFactory.createConnection(config); //config为前文的配置对象

		Admin admin = connection.getAdmin(); //使用连接对象获取Admin对象
        TableName tableName = TableName.valueOf("t_step3");//定义表名


        Table table = connection.getTable(tableName);//获取Table对象

        //获取数据
        Get get = new Get(Bytes.toBytes("row1"));    //定义get对象
        Result result = table.get(get);            //通过table对象获取数据
        // System.out.println("Result: " + result);
        //很多时候我们只需要获取“值” 这里表示获取 data:1 列族的值
        byte[] valueBytes = result.getValue(Bytes.toBytes("data"), Bytes.toBytes("1")); //获取到的是字节数组
        //将字节转成字符串
        String valueStr = new String(valueBytes,"utf-8");
        System.out.println("value:" + valueStr);




        /**
            这里是批量显示,换表了
        */
        tableName = TableName.valueOf("table_step3");//定义表名
        table = connection.getTable(tableName);//获取Table对象

        Scan scan = new Scan();
        ResultScanner scanner = table.getScanner(scan);
        try {
            for (Result scannerResult: scanner) {
                // System.out.println("Scan: " + scannerResult);
                byte[] row = scannerResult.getRow();
                System.out.println("rowName:" + new String(row,"utf-8"));
            }
        } finally {
            scanner.close();
        }		
		
		
		
		/********* End *********/
	}
	}


第4关:删除表

题目

任务描述

本关任务:删除表。

相关知识

本次关卡我们来学习本次实训最后一个内容,删除表。

HBase shell的操作一样,在Java中我们要删除表,需要先禁用他,然后在删除它。

代码很简单:

TableName tableName = TableName.valueOf("test");admin.disableTable(tableName);    //禁用表admin.deleteTable(tableName);    //删除表


编程要求

好了,到你啦,使用本关知识,在右侧编辑器begin-end处补充代码,编写代码删除t_step4表。

代码

命令行

start-dfs.sh
start-hbase.sh


package step4;import java.io.IOException;import org.apache.hadoop.conf.Configuration;import org.apache.hadoop.hbase.HBaseConfiguration;import org.apache.hadoop.hbase.HColumnDescriptor;import org.apache.hadoop.hbase.HTableDescriptor;import org.apache.hadoop.hbase.TableName;import org.apache.hadoop.hbase.client.Admin;import org.apache.hadoop.hbase.client.ColumnFamilyDescriptor;import org.apache.hadoop.hbase.client.ColumnFamilyDescriptorBuilder;import org.apache.hadoop.hbase.client.Connection;import org.apache.hadoop.hbase.client.ConnectionFactory;import org.apache.hadoop.hbase.client.Get;import org.apache.hadoop.hbase.client.Put;import org.apache.hadoop.hbase.client.Result;import org.apache.hadoop.hbase.client.ResultScanner;import org.apache.hadoop.hbase.client.Scan;import org.apache.hadoop.hbase.client.Table;import org.apache.hadoop.hbase.client.TableDescriptor;import org.apache.hadoop.hbase.client.TableDescriptorBuilder;import org.apache.hadoop.hbase.util.Bytes;public class Task {
	
	
	public void deleteTable()throws Exception{
		/********* Begin *********/
        Configuration config = HBaseConfiguration.create(); //使用create()静态方法就可以得到Configuration对象
        Connection connection = ConnectionFactory.createConnection(config); //config为前文的配置对象
		Admin admin = connection.getAdmin(); //使用连接对象获取Admin对象
        

		TableName tableName = TableName.valueOf("t_step4");
        admin.disableTable(tableName);    //禁用表
        admin.deleteTable(tableName);    //删除表
		
		/********* End *********/
	}}

到了这里,关于HBase 开发:使用Java操作HBase的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • HBase Java API 开发:批量操作 第2关:批量删除数据

    删除单行数据 删除一行数据很简单,我们来看个示例: 这段代码就可以删除行键为 row1 的行。 删除多行数据 如何删除多行数据呢? 相信你已经猜到了,既然 get() 方法有重载方法,那应该 delete() 方法也有,确实: 这样就可以删除多行数据啦。 编程要求 还等啥,亲自试一试

    2024年02月05日
    浏览(55)
  • 在HBase中执行查询操作通常使用HBase Shell或编程语言API(如Java或Python)来执行

    在HBase中执行查询操作通常使用HBase Shell或编程语言API(如Java或Python)来执行。以下是使用HBase Shell进行查询的一些示例: 单行查询:获取指定行键的数据。 扫描表:按行范围获取表中的多个行的数据。 过滤器查询:使用过滤器指定查询条件来获取数据。 列族查询:获取指

    2024年01月21日
    浏览(46)
  • 【Hbase】hbase的java api操作(3)

    目录 这篇文章的源码比较多,需要的私信我 需求与数据集 准备工作 下载安装maven 下载安装idea 配置国内的maven镜像库 创建一个maven工程 修改pom文件,导入相关的依赖 复制Hadoop的配置文件core-site.xml和HBase的配置文件hbase-site.xml到resources目录中 创建包结构 创建hbase连接类及管理

    2023年04月12日
    浏览(36)
  • 【服务器】Java连接redis及使用Java操作redis、使用场景

    在你的项目里面导入redis的pom依赖 连接redis 以下数据类型基本上涵盖了各种常见的数据存储需求,而且 Redis 的数据类型支持多种高级操作,因此特别适用于 快速、可靠、实时 的数据访问场景。 字符串(String) :最基本的数据类型,可以包含 任何数据 ,包括 二进制数据 。

    2024年02月06日
    浏览(58)
  • Hbase数据库完全分布式搭建以及java中操作Hbase

    基础的环境准备不在赘述,包括jdk安装,防火墙关闭,网络配置,环境变量的配置,各个节点之间进行免密等操作等。使用的版本2.0.5. 参考官方文档 分布式的部署,都是在单节点服务的基础配置好配置,直接分发到其他节点即可。 jdk路径的配置,以及不适用内部自带的zk. 配

    2024年02月03日
    浏览(48)
  • 使用IDEA连接hbase数据库

     Hbase是安装在另一台LINUX服务器上的,需要本地通过JAVA连接HBase数据库进行操作。由于是第一次接触HBase,过程当中百度了很多资料,也遇到了很多的问题。耗费了不少时间才成功连接上。特记录下过程当中遇到的问题。 JAVA连接HBase代码如下: 首先通过POM将需要的JAR包导入。

    2024年02月03日
    浏览(92)
  • java serverlets使用数据源连接oracle数据库,并执行查询操作代码

    package chap03; import java.io.IOException; import java.io.PrintWriter; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.PreparedStatement; import java.sql.Statement; import java.util.*; import javax.naming.Context; import javax.naming.InitialContext; import javax.naming.Namin

    2024年02月08日
    浏览(55)
  • java使用elasticsearchClient调用es7.17-生成连接、查询系统参数、索引相关操作

    java调用elasticsearch有几种不同的方式,考虑到以后维护方便,使用elasticSearchClient进行数据交互 首先要进行maven引入,后面两个是与json转化有关的,刚开始测试可以无需引入 1、ModelTestCase 此实体整合了与es系统有关的相关参数 2、Person 此实体主要为测试索引中的数据结构 1、生

    2024年02月15日
    浏览(49)
  • 【项目实战】Dbeaver使用Apache Phoenix来实现连接Hbase的详细指引

    DBeaver是一款开源的数据库管理工具,可以连接多种类型的数据库,包括Apache Phoenix和Hbase。通过DBeaver连接Hbase表,可以更方便地进行数据管理和查询。 注意:该教程适用于:远程连接Linux上的Hadoop集群,因此本步骤是不需要在本地再下载hadoop的环境,所以,很多内容都可以直

    2024年02月05日
    浏览(43)
  • Flink连接Hbase时的kafka报错:java.lang.NoClassDefFoundError: org/apache/kafka/common/utils/ThreadUtils

    书接上文 【Flink实时数仓】需求一:用户属性维表处理-Flink CDC 连接 MySQL 至 Hbase 实验及报错分析http://t.csdn.cn/bk96r 我隔了一天跑Hbase中的数据,发现kafka报错,但是kafka在这个代码段中并没有使用,原因就是我在今天的其他项目中添加的kafka依赖导致了冲突。 注释掉kafka依赖,

    2024年02月04日
    浏览(49)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包