1. IDEA 连接 HBASE
1、
idea
创建一个
maven
项目
2、添加相关依赖(
HBASE
客户端(最主要)、服务端),
pom.xml
:
<dependencies><dependency><groupId>org.apache.hbase</groupId><artifactId>hbase-server</artifactId><version>1.2.6</version></dependency><dependency><groupId>org.apache.hbase</groupId><artifactId>hbase-client</artifactId><version>1.2.6</version></dependency></dependencies>
3、在
resources
中添加
core-site.xml、hbase-site.xml
4、修改本机的
hosts
文件(在
C:\Windows\System32\drivers\etc
下),添加集群的
IP
名称:
192.168.131.137 hadoop1
192.168.131.138 hadoop2
192.168.131.139 hadoop3
注意:此步骤不添加,有可能会导致
idea
执行不成功!
项目结构:
F:.
│ pom.xml
├─src
│ ├─main
│ │ ├─java
│ │ │ └─com
│ │ │ └─jun
│ │ │ └─test
│ │ │ TestApi.java
│ │ │
│ │ └─resources
│ │ core-site.xml
│ │ hbase-site.xml
│ │
│ └─test
│ └─java
└─target
│ test_one.jar
│
├─classes
│ │ core-site.xml
│ │ hbase-site.xml
│ │
│ └─com
│ └─jun
│ └─test
│ TestApi.class
参考文章:在本地用idea连接虚拟机上的hbase集群的实现代码
2. DDL 表操作
DDL
与表操作有关,比如:
- 判断表是否存在
- 创建、删除、修改表
- 创建命名空间
2.1 配置连接
packagecom.jun.test;importorg.apache.hadoop.conf.Configuration;importorg.apache.hadoop.hbase.*;importorg.apache.hadoop.hbase.client.Admin;importorg.apache.hadoop.hbase.client.Connection;importorg.apache.hadoop.hbase.client.ConnectionFactory;importjava.io.IOException;publicclassTestApi{publicstaticConnection connection =null;publicstaticAdmin admin =null;static{try{// 获取配置信息Configuration configuration =HBaseConfiguration.create();
configuration.set("hbase.zookeeper.quorum","hadoop1,hadoop2,hadoop3");// 创建连接对象
connection =ConnectionFactory.createConnection(configuration);// 创建 admin 对象
admin = connection.getAdmin();}catch(IOException e){
e.printStackTrace();}}// 关闭连接publicstaticvoidclose(){if(admin !=null){try{
admin.close();}catch(IOException e){
e.printStackTrace();}}if(connection !=null){try{
connection.close();}catch(IOException e){
e.printStackTrace();}}}publicstaticvoidmain(String[] args)throwsIOException{// 判断表是否存在// System.out.println(isTableExists("t1"));// 创建表// createTable("t2", "info");// 将表创建到命名空间中// createTable("0808:t2", "info");// 删除表// deleteTable("t2");// 创建命名空间// createNameSpace("0808");// 关闭资源close();}}
2.2 判断表是否存在
// 判断表是否存在publicstaticbooleanisTableExists(String tableName)throwsIOException{boolean exists = admin.tableExists(TableName.valueOf(tableName));return exists;}
2.3 创建表
创建表包括:添加列族信息、还可以将表添加到命名空间,创建之前可以先检查该表是否存在:
// 创建表publicstaticvoidcreateTable(String tableName,String... cfs)throwsIOException{// 判断列族信息if(cfs.length <=0){System.out.println("请设置列族信息!!!");return;}// 判断表是否存在if(isTableExists(tableName)){System.out.println(tableName +" 表已存在!!!");return;}// 创建表描述器对象HTableDescriptor descriptor =newHTableDescriptor(TableName.valueOf(tableName));// 循环添加列族for(String cf : cfs){
descriptor.addFamily(newHColumnDescriptor(cf));}// 创建表
admin.createTable(descriptor);System.out.println("表 "+ tableName +" 创建成功!!!");}
2.4 删除表
// 删除表publicstaticvoiddeleteTable(String tableName)throwsIOException{if(isTableExists(tableName)){
admin.disableTable(TableName.valueOf(tableName));// 先停用表,再删除
admin.deleteTable(TableName.valueOf(tableName));System.out.println("表 "+ tableName +" 删除成功!!!");}else{System.out.println("表 "+ tableName +" 不存在!!!");}}
2.5 创建命名空间
// 创建命名空间publicstaticvoidcreateNameSpace(String ns){// 创建命名空间描述器NamespaceDescriptor namespaceDescriptor =NamespaceDescriptor.create(ns).build();// 创建命名空间try{
admin.createNamespace(namespaceDescriptor);System.out.println(ns +"命名空间创建成功!!!");}catch(NamespaceExistException e){System.out.println("命名空间 "+ ns +" 已存在!!!");}catch(IOException e){
e.printStackTrace();}}
可以在
hbase shell
中使用
list_namespace
查看命名空间:
hbase(main):012:0> list_namespace
NAMESPACE0808default hbase
3row(s) in 0.0420 seconds
// t2 表在 0808 命名空间里hbase(main):014:0> list
TABLE0808:t2 t1
2row(s) in 0.0430 seconds
=>["0808:t2","t1"]
3. DML 表记录操作
DML
主要是针对表的记录的操作,如插入、删除记录、查询记录等
3.1 插入数据
插入单条数据
// 插入数据publicstaticvoidputData(String tableName,String rowKey,String cf,String cn,String value)throwsIOException{// 获取表对象Table table = connection.getTable(TableName.valueOf(tableName));// 获取 Put 对象Put put =newPut(Bytes.toBytes(rowKey));// 给 put 对象赋值
put.addColumn(Bytes.toBytes(cf),Bytes.toBytes(cn),Bytes.toBytes(value));// 插入数据
table.put(put);System.out.println("数据插入成功!!!");// 关闭表连接
table.close();}
测试:
// 插入数据putData("t2","10001","info","name","rose");
插入多条数据
使用集合:
publicstaticbyte[]getBytes(String value){returnBytes.toBytes(value);}// 插入多条数据publicstaticvoidputManyData(String tableName,String cf,String cn,String value)throwsIOException{Table table = connection.getTable(TableName.valueOf(tableName));// 定义一个集合List<Put> puts =newArrayList<>();int row_key =10001;for(int i =1; i <=5; i++){
row_key = row_key + i;Put put =newPut(getBytes(String.valueOf(row_key)));
put.addColumn(getBytes(cf),getBytes(cn + i),getBytes(value + i));
puts.add(put);}
table.put(puts);System.out.println("成功插入多行数据!");
table.close();}
测试:
// 插入多条数据putManyData("t2","info","alias","jun");// scan t2hbase(main):005:0> scan 't2'ROWCOLUMN+CELL10001 column=info:name, timestamp=1628369721705, value=rose 10002 column=info:alias1, timestamp=1628383262854, value=jun1 10004 column=info:alias2, timestamp=1628383262854, value=jun2 10007 column=info:alias3, timestamp=1628383262854, value=jun3 10011 column=info:alias4, timestamp=1628383262854, value=jun4 10016 column=info:alias5, timestamp=1628383262854, value=jun5
6row(s) in 0.0860 seconds
3.2 get 数据
获取某行数据
// get 单条数据publicstaticvoidgetData(String tableName,String rowKey)throwsIOException{Table table = connection.getTable(TableName.valueOf(tableName));Get get =newGet((Bytes.toBytes(rowKey)));// 获取最大版本数System.out.println(get.getMaxVersions());// System.out.println(get.setTimeStamp());// 获取整行数据Result result = table.get(get);for(Cell cell : result.rawCells()){System.out.println("行键: "+Bytes.toString(result.getRow()));System.out.println("列族: "+Bytes.toString(CellUtil.cloneFamily(cell)));System.out.println("列: "+Bytes.toString(CellUtil.cloneQualifier(cell)));System.out.println("值: "+Bytes.toString(CellUtil.cloneValue(cell)));System.out.println("时间戳: "+ cell.getTimestamp());}
table.close();}
测试数据:
// 获取数据getData("t2","10001");1
行键:10001
列族: info
列: name
值: rose
时间戳:1628369721705
指定列族、列名
// 指定列族
get.addFamily(Bytes.toBytes(cf));// 指定列名
get.addColumn(Bytes.toBytes(cn));
3.3 scan 数据
// scan 所有数据publicstaticvoidscanData(String tableName)throwsIOException{Table table = connection.getTable(TableName.valueOf(tableName));Scan scan =newScan();ResultScanner resultScanner = table.getScanner(scan);for(Result result : resultScanner){Cell[] cells = result.rawCells();for(Cell cell : cells){System.out.println("行键: "+Bytes.toString(result.getRow()));System.out.println("列族: "+Bytes.toString(CellUtil.cloneFamily(cell)));System.out.println("列: "+Bytes.toString(CellUtil.cloneQualifier(cell)));System.out.println("值: "+Bytes.toString(CellUtil.cloneValue(cell)));System.out.println("时间戳: "+ cell.getTimestamp());System.out.println("-------------------------------------------\n\n");}}
table.close();}
测试数据:
// 扫描所有数据scanData("t2");
行键:10001
列族: info
列: name
值: rose
时间戳:1628369721705-------------------------------------------
行键:10002
列族: info
列: alias1
值: jun1
时间戳:1628383262854-------------------------------------------
行键:10004
列族: info
列: alias2
值: jun2
时间戳:1628383262854-------------------------------------------
行键:10007
列族: info
列: alias3
值: jun3
时间戳:1628383262854-------------------------------------------
行键:10011
列族: info
列: alias4
值: jun4
时间戳:1628383262854-------------------------------------------
行键:10016
列族: info
列: alias5
值: jun5
时间戳:1628383262854-------------------------------------------
建议
使用
scan
扫描全表时,最好设置
startRow、endRow
,亦或者是带过滤条件的翻页,而非全表扫描:
// 设置 startRowScan(Bytes.toBytes("startRow"))// 设置 startRow、endRowScan(Bytes.toBytes("startRow"),Bytes.toBytes("endRow"))// 实际工作中一般不知道 endRow,而是带过滤条件的翻页Scan(Bytes.toBytes("startRow"),Filter filter)ResultScanner resultScanner = table.getScanner(scan);
3.4 删除数据
删除单行数据
// 删除单行数据publicstaticvoiddeleteData(String tableName,String rowKey)throwsIOException{Table table = connection.getTable(TableName.valueOf(tableName));// 获取 delete 对象Delete delete =newDelete(Bytes.toBytes(rowKey));// 删除指定的列族、列名// delete.addColumn(Bytes.toBytes(cf), Bytes.toBytes(cn));
table.delete(delete);System.out.println(rowKey +" 删除成功!!!");
table.close();}
测试:
// 删除单行数据deleteData("t2","10001");hbase(main):007:0> scan 't2'ROWCOLUMN+CELL10002 column=info:alias1, timestamp=1628383262854, value=jun1
10004 column=info:alias2, timestamp=1628383262854, value=jun2
10007 column=info:alias3, timestamp=1628383262854, value=jun3
10011 column=info:alias4, timestamp=1628383262854, value=jun4
10016 column=info:alias5, timestamp=1628383262854, value=jun5
5row(s) in 0.1290 seconds
删除多行数据
// 删除多行数据publicstaticvoiddeleteManyData(String tableName,String... rows)throwsIOException{Table table = connection.getTable(TableName.valueOf(tableName));List<Delete> deletes =newArrayList<>();for(String row : rows){Delete delete =newDelete(Bytes.toBytes(row));
deletes.add(delete);}
table.delete(deletes);System.out.println("删除成功!!!");
table.close();}
测试:
// 删除多行数据deleteManyData("t2","10002","10007");hbase(main):008:0> scan 't2'ROWCOLUMN+CELL10004 column=info:alias2, timestamp=1628383262854, value=jun2
10011 column=info:alias4, timestamp=1628383262854, value=jun4
10016 column=info:alias5, timestamp=1628383262854, value=jun5
3row(s) in 0.1140 seconds
4. 参考文章
- 第6章HBase API操作
- HBase Java API 批量操作
- hbase实战之javaAPI插入数据
- HBase- ddl(表操作)、dml(记录操作)的基本语法操作
- HBase学习之路 (六)过滤器
版权归原作者 风老魔 所有, 如有侵权,请联系我们删除。