--创建命名空间exam
create_namespace 'exam'
--显示命名空间
list_namespace
--显示exam命名空间的表
list_namespace_tables 'exam'
--删除命名空间exam
drop_namespace 'exam'
[hadoop@hadoop00 hbase]$ $HBASE_HOME/bin/hbase shell
hbase(main):001:0> help
hbase(main):002:0> list
create '[命名空间]:表名','列簇名1','列簇名2'
hbase(main):003:0>create 'customer',{NAME=>'addr'},{NAME=>'ordeer'}
NAME=>‘xxx’,xxx为列族的名字。HBase中创建一个表,必须指定至少一个列族。
列族对应HDFS上一个文件夹
put '[命名空间]:表名','rowkey','列簇名1:列名','数据'
hbase(main):004:0>put 'customer','jsmith','addr:city','monthreal'
hbase(main):005:0>put 'customer','jsmith','addr:state','ON'
hbase(main):006:0>put 'customer','jsmith','order:numb','123456'
hbase(main):007:0>put 'customer','jsmith','order:date','2015-12-19'
插入数据后,到对应的列族目录下,发现没有对应的文件生成
就证明HBase 写入数据是没有直接落磁盘的,是先在缓冲中的。为了方便演示,可以手动刷出缓存,命令为 flush,在命令行输入 flush,会提示使用方法。
hbase(main):008:0> flush 'customer'
flush 完成后,可以看到对应的列族目录下,有数据文件了,该文件就是 HFile。
列族目录下的文件,可以尝试使用 hdfs 命令查看其内容,会发现是二进制的内容。HBase 提供了查看该文件内容的方式。
下面命令在 Linux 命令行执行,不是在 hbase shell 中
[root@hadoop00 ~]$ hbase hfile -v -p -f /hbase/data/default/customer/e3ee2da14c8b5f82f2035fc9fc283481/addr/8e1050e1df9842f0b15dc8fb2a7b50e4
#输出
K: r001/addr:city/1608264247929/Put/vlen=7/seqid=5 V: beijing
K: r001/addr:country/1608264351168/Put/vlen=5/seqid=6 V: china
K: r002/addr:city/1608264394006/Put/vlen=7/seqid=7 V: nanjing
K: roo3/addr:city/1608264967129/Put/vlen=7/seqid=9 V: nanjing
前面是 K,后面是 V,从这里也能看出 HBase 是 KeyValue 数据库
put 'customer', 'jsmith', 'order:numb', '1235'
put 'customer', 'jsmith', 'order:numb', '1236'
put 'customer', 'jsmith', 'order:numb', '1237'
put 'customer', 'jsmith', 'order:numb', '1238'
put 'customer', 'njones', 'addr:city', 'miami'
put 'customer', 'njones', 'addr:state', 'FL'
put 'customer', 'njones', 'order:numb', '5555'
put 'customer', 'tsimmons', 'addr:city', 'dallas'
put 'customer', 'tsimmons', 'addr:state', 'TX'
put 'customer', 'jsmith', 'addr:city', 'denver'
put 'customer', 'jsmith', 'addr:state', 'CO'
put 'customer', 'jsmith', 'order:numb', '6666'
put 'customer', 'njones', 'addr:state', 'TX'
put 'customer', 'amiller', 'addr:state', 'TX'
scan '[命名空间]:表名' --查看所有数据
scan '[命名空间]:表名',{
COLUMNS =>'列簇'} --查看某一列簇的所有数据
scan 'customer'
scan 'exam:analysis',{
COLUMNS => 'question'}
scan 'customer', {
COLUMNS=>['order:numb'], VERSIONS => 2}
scan 'customer', {STARTROW => 'j', STOPROW => 't'}
desc 'customer'
put 'customer','jsmith','order:numb','654321'
--查看具体列的数据
get '表名','rowkey','列簇:列名'
get 'customer', 'jsmith'
get 'customer', 'jsmith','addr'
get 'customer', 'jsmith','addr:city'
count 'customer'
--删除某rowkey的全部数据
deleteall '表名','rowkey'
--删除某rowkey的某一列数据
delete '表名','rowkey','列簇:列名'
--删除某rowkey的全部数据
deleteall 'customer','jsmith'
--删除某rowkey的某一列数据
delete 'customer','njones','addr:city'
提示:清空表的操作顺序为先 disable,然后再 truncate。disable 的操作会自动完成。
truncate 'customer'
注意需要先 disable 表,不然直接删除会报错
提示:如果直接 drop 表,会报错:ERROR: Table customer is enabled. Disable it first
disable 'customer'
drop 'customer'
将 order 列族中的数据设置为可以存放 5 个版本:
alter 'customer',NAME=>'order',VERSIONS=>5
先更新一条数据
put 'customer', 'tsimmons', 'order:city', 'beijing'
put 'customer', 'tsimmons', 'order:city', 'beijing2'
--查看多版本数据
get 'customer','tsimmons',{
COLUMN=>'order:city',VERSIONS=>2}
项目部分会使用到从 Kafka 消费数据,然后存储到 HBase 数据库,使用的是HBase Java API。所以这部分代码需要学员掌握。
<dependencies>
<dependency>
<groupId>junitgroupId>
<artifactId>junitartifactId>
<version>4.12version>
<scope>testscope>
dependency>
<dependency>
<groupId>org.apache.hbasegroupId>
<artifactId>hbase-clientartifactId>
<version>1.2.0version>
dependency>
<dependency>
<groupId>org.apache.hbasegroupId>
<artifactId>hbase-commonartifactId>
<version>1.2.0version>
dependency>
<dependency>
<groupId>org.apache.hbasegroupId>
<artifactId>hbase-serverartifactId>
<version>1.2.0version>
dependency>
<dependency>
<groupId>org.apache.hadoopgroupId>
<artifactId>hadoop-commonartifactId>
<version>2.6.0version>
dependency>
<dependency>
<groupId>org.junit.jupitergroupId>
<artifactId>junit-jupiter-apiartifactId>
<version>RELEASEversion>
<scope>compilescope>
dependency>
dependencies>
使用javaAPI读取在HBase中创建表,插入数据,读取数据,删除表
package cn.kgc;
import org.apache.hadoop.hbase.*;
import org.apache.hadoop.hbase.client.*;
import org.apache.hadoop.hbase.util.Bytes;
import org.junit.jupiter.api.Test;
import org.apache.hadoop.conf.Configuration;
import java.io.IOException;
/**
* @author Oldhu
* @date @Date
* @des
*/
public class HBASEClientDemo {
//TODO:创建一个表
@Test
public void createTable() throws IOException {
//1.获取hbase连接,配置
Configuration conf = HBaseConfiguration.create();
conf.set("hbase.zookeeper.quorum", "192.168.36.38");
conf.set("hbase.zookeeper.property.clientPort", "2181");
//2.创建连接
Connection conn = ConnectionFactory.createConnection(conf);
//3.创建admin
Admin admin = conn.getAdmin();
//4.创建表的相关信息,表名
HTableDescriptor student = new HTableDescriptor(TableName.valueOf("student"));
//5.添加列族信息
student.addFamily(new HColumnDescriptor("info"));
student.addFamily(new HColumnDescriptor("score"));
//6.调用创建表的方法进行建表操作
admin.createTable(student);
//7.关闭连接
conn.close();
}
//TODO:向表中添加数据
@Test
public void putData2Table() throws IOException {
//1.获取hbase连接,配置
Configuration conf = HBaseConfiguration.create();
conf.set("hbase.zookeeper.quorum", "hadoop00");
conf.set("hbase.zookeeper.property.clientPort", "2181");
//2.创建连接
Connection conn = ConnectionFactory.createConnection(conf);
//3.获取table
Table student = conn.getTable(TableName.valueOf("student"));
//4.往表中添加数据rowkey
Put put = new Put(Bytes.toBytes("1001"));
//5.添加列info:name zhangsan
put.addColumn(Bytes.toBytes("info"), Bytes.toBytes("name"), Bytes.toBytes("zhangsan"));
put.addColumn(Bytes.toBytes("info"), Bytes.toBytes("gender"), Bytes.toBytes("man"));
put.addColumn(Bytes.toBytes("info"), Bytes.toBytes("age"), Bytes.toBytes(11));
//6.插入数据
student.put(put);
//7.关闭连接
conn.close();
}
//TODO:读取数据
@Test
public void getDataFromTable() throws IOException {
//1.获取hbase连接,配置
Configuration conf = HBaseConfiguration.create();
conf.set("hbase.zookeeper.quorum", "hadoop00");
conf.set("hbase.zookeeper.property.clientPort", "2181");
//2.创建连接
Connection conn = ConnectionFactory.createConnection(conf);
//3.获取table
Table student = conn.getTable(TableName.valueOf("student"));
//4.读取表中的数据,Get
Get get = new Get(Bytes.toBytes("1001"));
//5.获取结果
Result result = student.get(get);
//6.遍历结果
Cell[] cells = result.rawCells();
for (Cell cell : cells) {
//获取具体的值
System.out.println("rowkey:" + Bytes.toString(CellUtil.cloneRow(cell)));
System.out.println("列族:" + Bytes.toInt(CellUtil.cloneFamily(cell)));
System.out.println("列名:" + Bytes.toString(CellUtil.cloneQualifier(cell)));
System.out.println("value:" + Bytes.toString(CellUtil.cloneValue(cell)));
System.out.println("_______________");
}
//7.关闭连接
conn.close();
}
//TODO:删除
@Test
public void dropTable() throws IOException {
//1.获取hbase连接,配置
Configuration conf = HBaseConfiguration.create();
conf.set("hbase.zookeeper.quorum", "hadoop00");
conf.set("hbase.zookeeper.property.clientPort", "2181");
//2.创建连接
Connection conn = ConnectionFactory.createConnection(conf);
//3.get admin
Admin admin = conn.getAdmin();
//4.禁用表
admin.disableTable(TableName.valueOf("student"));
//5.删除表
admin.deleteTable(TableName.valueOf("student"));
//6.关闭连接
conn.close();
}
}