0


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

第1关:创建表

题目

任务描述

本关任务:使用

  1. Java

代码在

  1. HBase

中创建表。

相关知识

为了完成本关任务,你需要掌握:1.如何使用

  1. Java

连接

  1. HBase

数据库,2.如何使用

  1. Java

代码在

  1. HBase

中创建表。

如何使用Java连接HBase数据库
  1. Java

连接

  1. HBase

需要两个类:

  • HBaseConfiguration
  • ConnectionFactory
HBaseConfiguration

要连接

  1. HBase

我们首先需要创建

  1. Configuration

对象,这个对象我们需要通过

  1. HBaseConfiguration

  1. HBase

配置)对象来进行创建,

  1. HBaseConfiguration

看名字我们就能猜到它的用途:**读取指定路径下

  1. hbase-site.xml

  1. hbase-default.xml

的配置信息**。

具体用法:

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

获取到连接对象

  1. Connextion

我们就算连接上了

  1. HBase

了,怎么获取呢?

通过

  1. ConnectionFactory

(连接工厂)的方法我们就能获取到

  1. Connection

(连接对象)了。

具体用法:

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

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

  1. HBase

了。

注意:在1.0之前的版本

  1. HBase

是使用

  1. HBaseAdmin

  1. HTable

等来操作

  1. HBase

的,但是在

  1. 1.0

之后的版本中这些被弃用了,新的客户端

  1. API

更加干净简洁,本文使用的

  1. HBase

  1. 2.1.1

版本(18年10月发布)的,

创建表

要创建表我们需要首先创建一个

  1. Admin

对象,然后让它来创建一张表:

  1. 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创建表

上述创建表的方法是

  1. HBase1.X

版本的方式,而在

  1. HBase2.X

的版本中创建表使用了新的

  1. API

,创建表关键代码如下:

  1. 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());//创建表

  1. 2.X

版本中主要是

  1. HTableDescriptor

对象被弃用,取而代之的是

  1. TableDescriptor

对象,

  1. TableDescriptor

对象通过

  1. TableDescriptorBuilder

构建;

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

然后添加列簇方法变更:

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

最后由

  1. Admin

对象进行创建表操作:

  1. admin.createTable(tableDescriptor.build());

值得咱们注意的是,如果你的

  1. HBase

环境是

  1. 1.X

的那么你只能使用第一种方式来创建表,如果是

  1. 2.X

的版本,那么两种方式你都可以使用(本实训使用的

  1. HBase

  1. 2.1.1

版本,所以两种都可用)。

编程要求

好了,到你啦,使用本关知识,在右侧编辑器

  1. begin-end

处补充代码,请你编写一个

  1. Java

程序,在

  1. HBase

中创建表

  1. dept

,

  1. emp

,列都为:

  1. data

测试说明

注意:

点击测评之前,请先开启

  1. Hadoop

  1. start-dfs.sh

)和

  1. HBase

  1. start-hbase.sh

),并且需要等待

  1. HBase

初始化完成(

  1. 20

秒左右),否则无法在

  1. HBase

中创建表。

怎么查看

  1. HBase

初始化成功了呢?

输入

  1. hadoop fs -ls /hbase

有如下结果即可:

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

如果启动过程中出现:

  1. datanode running as process 214. Stop it first.

说明

  1. Hadoop

的进程还没有被杀死。

需要我们重新

  1. stop-dfs.sh

  1. stop-hbase.sh

,然后在重启。

代码

命令行

  1. start-dfs.sh
  2. start-hbase.sh
  1. packagestep1;importjava.io.IOException;importorg.apache.hadoop.conf.Configuration;importorg.apache.hadoop.hbase.HBaseConfiguration;importorg.apache.hadoop.hbase.HColumnDescriptor;importorg.apache.hadoop.hbase.HTableDescriptor;importorg.apache.hadoop.hbase.TableName;importorg.apache.hadoop.hbase.client.Admin;importorg.apache.hadoop.hbase.client.ColumnFamilyDescriptor;importorg.apache.hadoop.hbase.client.ColumnFamilyDescriptorBuilder;importorg.apache.hadoop.hbase.client.Connection;importorg.apache.hadoop.hbase.client.ConnectionFactory;importorg.apache.hadoop.hbase.client.Get;importorg.apache.hadoop.hbase.client.Put;importorg.apache.hadoop.hbase.client.Result;importorg.apache.hadoop.hbase.client.ResultScanner;importorg.apache.hadoop.hbase.client.Scan;importorg.apache.hadoop.hbase.client.Table;importorg.apache.hadoop.hbase.client.TableDescriptor;importorg.apache.hadoop.hbase.client.TableDescriptorBuilder;importorg.apache.hadoop.hbase.util.Bytes;publicclassTask{publicvoidcreateTable()throwsException{/********* 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();//构建列族对象
  2. tableDescriptor.setColumnFamily(family);//设置列族
  3. admin.createTable(tableDescriptor.build());//创建表
  4. tableName =TableName.valueOf("emp");//定义表名//TableDescriptor对象通过TableDescriptorBuilder构建;
  5. tableDescriptor =TableDescriptorBuilder.newBuilder(tableName);
  6. family =ColumnFamilyDescriptorBuilder.newBuilder(Bytes.toBytes("data")).build();//构建列族对象
  7. tableDescriptor.setColumnFamily(family);//设置列族
  8. admin.createTable(tableDescriptor.build());//创建表/********* End *********/}}

第2关:添加数据

题目

任务描述

本关任务:使用

  1. Java

代码向

  1. HBase

集群中创建表并添加数据。

相关知识

为了完成本关任务,你需要掌握:

  1. Put

  1. Table

对象如何使用。

添加数据

要对一个表添加数据,我们需要一个

  1. Put

对象,在定义

  1. Put

对象之前我们需要获取到

  1. Table

对象,这样才能对指定的表进行操作:

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

编程要求

好了,到你啦,使用本关知识,在右侧编辑器

  1. begin-end

处补充代码,请你编写一个

  1. Java

程序,在

  1. HBase

中创建表

  1. tb_step2

,列簇都为:

  1. data

,添加数据:

  • 行号分别为:row1row2
  • 列名分别为:12
  • 值分别为:张三丰张无忌

测试说明

注意事项与上一关相同;

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

预期输出:

  1. row1:张三丰
  2. row2:张无忌

代码

命令行

  1. start-dfs.sh
  2. start-hbase.sh
  1. packagestep2;importjava.io.IOException;importorg.apache.hadoop.conf.Configuration;importorg.apache.hadoop.hbase.HBaseConfiguration;importorg.apache.hadoop.hbase.HColumnDescriptor;importorg.apache.hadoop.hbase.HTableDescriptor;importorg.apache.hadoop.hbase.TableName;importorg.apache.hadoop.hbase.client.Admin;importorg.apache.hadoop.hbase.client.ColumnFamilyDescriptor;importorg.apache.hadoop.hbase.client.ColumnFamilyDescriptorBuilder;importorg.apache.hadoop.hbase.client.Connection;importorg.apache.hadoop.hbase.client.ConnectionFactory;importorg.apache.hadoop.hbase.client.Get;importorg.apache.hadoop.hbase.client.Put;importorg.apache.hadoop.hbase.client.Result;importorg.apache.hadoop.hbase.client.ResultScanner;importorg.apache.hadoop.hbase.client.Scan;importorg.apache.hadoop.hbase.client.Table;importorg.apache.hadoop.hbase.client.TableDescriptor;importorg.apache.hadoop.hbase.client.TableDescriptorBuilder;importorg.apache.hadoop.hbase.util.Bytes;publicclassTask{publicvoidinsertInfo()throwsException{/********* 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();//构建列族对象
  2. tableDescriptor.setColumnFamily(family);//设置列族
  3. admin.createTable(tableDescriptor.build());//创建表Table table = connection.getTable(tableName);//获取Table对象try{byte[] row =Bytes.toBytes("row1");//定义行Put put =newPut(row);//创建Put对象byte[] columnFamily =Bytes.toBytes("data");//列簇byte[] qualifier =Bytes.toBytes(String.valueOf(1));//列byte[] value =Bytes.toBytes("张三丰");//值
  4. put.addColumn(columnFamily, qualifier, value);
  5. table.put(put);//向表中添加数据
  6. row =Bytes.toBytes("row2");//定义行
  7. put =newPut(row);//创建Put对象
  8. columnFamily =Bytes.toBytes("data");//列簇
  9. qualifier =Bytes.toBytes(String.valueOf(2));//列
  10. value =Bytes.toBytes("张无忌");//值
  11. put.addColumn(columnFamily, qualifier, value);
  12. table.put(put);//向表中添加数据}finally{//使用完了要释放资源
  13. table.close();}/********* End *********/}}

第3关:获取数据

题目

任务描述

本关任务:获取

  1. HBase

中已存在表的数据并输出。

相关知识

为了完成本关任务,你需要掌握:1.如何使用

  1. Get

对象获取数据,2.如何使用

  1. Scan

批量输出表中的数据。

获取指定行的数据

我们使用

  1. Get

对象与

  1. Table

对象就可以获取到表中的数据了。

  1. //获取数据Get get =newGet(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 =newString(valueBytes,"utf-8");System.out.println("value:"+ valueStr);

上述代码就可以查到

  1. table

对象中行

  1. row1

的数据了,亲自试试验证一下结果吧。

扫描表中的数据

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

  1. Scan

  1. ResultScanner

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

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

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

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

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

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

编程要求

使用本关知识,在右侧编辑器

  1. begin-end

处补充代码,输出

  1. t_step3

表中行号为

  1. row1

,列族为

  1. data:1

的值(以

  1. utf-8

编码),输出

  1. table_step3

表中所有行的行名称(因为直接输出

  1. scannerResult

会带有时间戳,所以输出行名方便测评)。

测试说明

预期输出:

  1. value:Educoder
  2. rowName:row1
  3. rowName:row2
  4. rowName:row3
  5. rowName:row4

代码

命令行

  1. start-dfs.sh
  2. start-hbase.sh
  1. packagestep3;importjava.io.IOException;importorg.apache.hadoop.conf.Configuration;importorg.apache.hadoop.hbase.HBaseConfiguration;importorg.apache.hadoop.hbase.HColumnDescriptor;importorg.apache.hadoop.hbase.HTableDescriptor;importorg.apache.hadoop.hbase.TableName;importorg.apache.hadoop.hbase.client.Admin;importorg.apache.hadoop.hbase.client.ColumnFamilyDescriptor;importorg.apache.hadoop.hbase.client.ColumnFamilyDescriptorBuilder;importorg.apache.hadoop.hbase.client.Connection;importorg.apache.hadoop.hbase.client.ConnectionFactory;importorg.apache.hadoop.hbase.client.Get;importorg.apache.hadoop.hbase.client.Put;importorg.apache.hadoop.hbase.client.Result;importorg.apache.hadoop.hbase.client.ResultScanner;importorg.apache.hadoop.hbase.client.Scan;importorg.apache.hadoop.hbase.client.Table;importorg.apache.hadoop.hbase.client.TableDescriptor;importorg.apache.hadoop.hbase.client.TableDescriptorBuilder;importorg.apache.hadoop.hbase.util.Bytes;publicclassTask{publicvoidqueryTableInfo()throwsException{/********* 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 =newGet(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 =newString(valueBytes,"utf-8");System.out.println("value:"+ valueStr);/**
  2. 这里是批量显示,换表了
  3. */
  4. tableName =TableName.valueOf("table_step3");//定义表名
  5. table = connection.getTable(tableName);//获取Table对象Scan scan =newScan();ResultScanner scanner = table.getScanner(scan);try{for(Result scannerResult: scanner){// System.out.println("Scan: " + scannerResult);byte[] row = scannerResult.getRow();System.out.println("rowName:"+newString(row,"utf-8"));}}finally{
  6. scanner.close();}/********* End *********/}}

第4关:删除表

题目

任务描述

本关任务:删除表。

相关知识

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

  1. HBase shell

的操作一样,在

  1. Java

中我们要删除表,需要先禁用他,然后在删除它。

代码很简单:

  1. TableName tableName =TableName.valueOf("test");
  2. admin.disableTable(tableName);//禁用表
  3. admin.deleteTable(tableName);//删除表
编程要求

好了,到你啦,使用本关知识,在右侧编辑器

  1. begin-end

处补充代码,编写代码删除

  1. t_step4

表。

代码

命令行

  1. start-dfs.sh
  2. start-hbase.sh
  1. packagestep4;importjava.io.IOException;importorg.apache.hadoop.conf.Configuration;importorg.apache.hadoop.hbase.HBaseConfiguration;importorg.apache.hadoop.hbase.HColumnDescriptor;importorg.apache.hadoop.hbase.HTableDescriptor;importorg.apache.hadoop.hbase.TableName;importorg.apache.hadoop.hbase.client.Admin;importorg.apache.hadoop.hbase.client.ColumnFamilyDescriptor;importorg.apache.hadoop.hbase.client.ColumnFamilyDescriptorBuilder;importorg.apache.hadoop.hbase.client.Connection;importorg.apache.hadoop.hbase.client.ConnectionFactory;importorg.apache.hadoop.hbase.client.Get;importorg.apache.hadoop.hbase.client.Put;importorg.apache.hadoop.hbase.client.Result;importorg.apache.hadoop.hbase.client.ResultScanner;importorg.apache.hadoop.hbase.client.Scan;importorg.apache.hadoop.hbase.client.Table;importorg.apache.hadoop.hbase.client.TableDescriptor;importorg.apache.hadoop.hbase.client.TableDescriptorBuilder;importorg.apache.hadoop.hbase.util.Bytes;publicclassTask{publicvoiddeleteTable()throwsException{/********* Begin *********/Configuration config =HBaseConfiguration.create();//使用create()静态方法就可以得到Configuration对象Connection connection =ConnectionFactory.createConnection(config);//config为前文的配置对象Admin admin = connection.getAdmin();//使用连接对象获取Admin对象TableName tableName =TableName.valueOf("t_step4");
  2. admin.disableTable(tableName);//禁用表
  3. admin.deleteTable(tableName);//删除表/********* End *********/}}
标签: hbase java python

本文转载自: https://blog.csdn.net/Changersh/article/details/134961393
版权归原作者 Changersh 所有, 如有侵权,请联系我们删除。

“头歌——HBase 开发:使用Java操作HBase”的评论:

还没有评论