版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_22830285/article/details/84570538
尝试使用HBASE shell 和HBase java API 两种方式来演示对业务表的操作。
一、Hbase Shell
1、启动控制台,启用hbaseshell 控制台对Hbase 进行操作具体命令如下:
[hadoop@nna hbase]$ bin/hbase shell
2、创建业务临时表: zh_table
hbase(main):005:0> create 'zh_table','name'
0 row(s) in 1.4820 seconds
=> Hbase::Table - zh_table
2、添加数据
hbase(main):001:0> put 'zh_table','rowkey1','name','v1'
3、查询数据
3.1用scan 扫描全表
hbase(main):002:0> scan 'zh_table'
ROW COLUMN+CELL
rowkey1 column=name:, timestamp=1543310894919, value=v1
1 row(s) in 0.0340 seconds
3.2 用get 根据rowkey 进行查询
hbase(main):001:0> get 'zh_table','rowkey1'
COLUMN CELL
name: timestamp=1543310894919, value=v1
1 row(s) in 0.2600 seconds
4、删除业务表
4.1 先禁止Hbase 业务表
hbase(main):002:0> disable 'zh_table'
0 row(s) in 2.7030 seconds
4.2 在执行删除操作
hbase(main):001:0> drop 'zh_table'
0 row(s) in 1.6430 seconds
二、HBase java api 应用接口
代码:
package hadoop;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Map;
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.KeyValue;
import org.apache.hadoop.hbase.TableName;
import org.apache.hadoop.hbase.client.Admin;
import org.apache.hadoop.hbase.client.Connection;
import org.apache.hadoop.hbase.client.ConnectionFactory;
import org.apache.hadoop.hbase.client.Delete;
import org.apache.hadoop.hbase.client.Get;
import org.apache.hadoop.hbase.client.HBaseAdmin;
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.util.Bytes;
public class HbaseUtil {
private static Configuration conf;
private static HBaseAdmin admin;
//初始化配置信息
static {
conf=HBaseConfiguration.create();
//设置zookeeper的地址
conf.set("hbase.zookeeper.quorum","dn1,dn2,dn3");
}
//创建表
public static void create(String tableName,String [] columns) throws IOException {
//建立连接
Connection connection=ConnectionFactory.createConnection(conf);
//表管理类
Admin admin=connection.getAdmin();
//定义表名
HTableDescriptor tableDescriptor=new HTableDescriptor(TableName.valueOf(tableName));
//列族名
for(String col:columns) {
HColumnDescriptor hColdesc=new HColumnDescriptor(col);
//将列加入表中,
tableDescriptor.addFamily(hColdesc);
}
admin.createTable(tableDescriptor);
admin.close();
connection.close();
System.out.println("创建表成功!");
}
//插入
public static void insert(String tableName,ArrayList<Put> alists) throws IOException{
//通过连接工厂创建连接对象
Connection conn = ConnectionFactory.createConnection(conf);
//通过连接查询tableName对象
TableName tname = TableName.valueOf(tableName);
//获得table
Table table = conn.getTable(tname);
//执行插入
table.put(alists);
table.close();
conn.close();
System.out.println("插入成功!");
}
/* 根据key 取值
clonum 可为空,若为null ,则只根据列族名查询
*/
public static void get(String tableName,String rowkey,String clonumFamily,String clonum ) throws Exception {
//建立连接
Connection connection=ConnectionFactory.createConnection(conf);
//建立表连接
Table table=connection.getTable(TableName.valueOf(tableName));
//用行键实例化Get
Get get=new Get(rowkey.getBytes());
if(null==clonum) {
//只列族名查询
get.addFamily(clonumFamily.getBytes());
}else {
//增加列族名和列名条件
get.addColumn(clonumFamily.getBytes(), clonum.getBytes());
}
//执行Get返回结果
Result result=table.get(get);
//取出结果
//如果只有rowkey 查询,那应该是一个结果集
if(null==clonum) {
Map<byte[], byte[]> map=result.getFamilyMap(clonumFamily.getBytes());
System.out.println("多结果集-"+clonumFamily+"遍历map"+"\n");
for(Map.Entry<byte[], byte[]> entry:map.entrySet()) {
String clonumName=new String(entry.getKey());
String value=new String(entry.getValue());
System.out.println(clonumName+"-----"+value+"\n");
}
}else {
String valueStr=Bytes.toString(result.getValue(clonumFamily.getBytes(), clonum.getBytes()));
System.out.println(clonumFamily+"---"+clonum+"--"+valueStr);
}
//关闭表
table.close();
//关闭连接
connection.close();
System.out.println("查询结束--------!");
}
//删除单元
public static void deleteCol(String tableName,String rowkey,String colnumFamily,String clonum) throws IOException {
//建立连接
Connection connection=ConnectionFactory.createConnection(conf);
//建立表连接
Table table=connection.getTable(TableName.valueOf(tableName));
//用行键来实例化Delete实例
Delete delete=new Delete(rowkey.getBytes());
//增加删除条件
if(colnumFamily!=null&&clonum!=null)
delete.addColumn(colnumFamily.getBytes(), clonum.getBytes());
//执行删除
table.delete(delete);
//关闭表
table.close();
//关闭连接
connection.close();
System.out.println("删除成功!");
}
//删除表
public static void deleteTable(String tableName) throws IOException {
//建立连接
Connection connection=ConnectionFactory.createConnection(conf);
//表管理类
Admin admin=connection.getAdmin();
//首先禁用表
admin.disableTable(TableName.valueOf(tableName));
//最后删除表
admin.deleteTable(TableName.valueOf(tableName));
//关闭表管理
admin.close();
//关闭连接
connection.close();
System.out.println("执行成功");
}
//扫描全表数据
public static void scanAll(String tableName) throws IOException {
//建立连接
Connection connection=ConnectionFactory.createConnection(conf);
//建立表连接
Table table=connection.getTable(TableName.valueOf(tableName));
//初始化Scan实例
Scan scan=new Scan();
//返回结果
ResultScanner rs=table.getScanner(scan);
for (Result r : rs) {// 按行去遍历
for (KeyValue kv : r.raw()) {// 遍历每一行的各列
StringBuffer sb = new StringBuffer()
.append(Bytes.toString(kv.getRow())).append("\t")
.append(Bytes.toString(kv.getFamily()))
.append("\t")
.append(Bytes.toString(kv.getQualifier()))
.append("\t").append(Bytes.toString(kv.getValue()));
System.out.println(sb.toString());
}
}
}
public static void main(String [] args) throws Exception {
//创建表
System.out.println("-----------开始创建表 ---------------");
//表名
String tableName="java_Table";
String[] clofamily= {"function","parameter","return"};
create(tableName,clofamily);
System.out.println("-----------开始插入数据 ---------------");
//用行键实例化Put
Put put=new Put("num1".getBytes());
//指定列族名、列名和值
put.addColumn("function".getBytes(), "get".getBytes(), "getApi".getBytes());
put.addColumn("function".getBytes(), "put".getBytes(), "putApi".getBytes());
put.addColumn("parameter".getBytes(), "intp".getBytes(), "intpv".getBytes());
put.addColumn("parameter".getBytes(), "strp".getBytes(), "intpv".getBytes());
put.addColumn("return".getBytes(), "intr".getBytes(), "intrv".getBytes());
put.addColumn("return".getBytes(), "strr".getBytes(), "intrv".getBytes());
ArrayList<Put> putlist=new ArrayList<Put>();
putlist.add(put);
insert(tableName,putlist);
System.out.println("-----------开始查询数据 ----num1-----------");
get(tableName,"num1","function",null);
System.out.println("-----------开始删除数据 ----num1-----------");
deleteCol(tableName,"num1","parameter","intp");
System.out.println("-----------开始全表扫描 ---------------");
scanAll(tableName);
}
}
执行结果:
三、报错问题
1、执行hbase java api 一直没响应,做创建表操作是可以的,但插入,查询操作报如下错误。
Call exception, tries=11, retries=35, started=89030 ms ago, cancelled=false, msg=row '001' on table 'java_apie' at region=java_apie,,1543369803131.74130bf36a579d79096cacc4d018f45a., hostname=dn3,16020,1543373681623, seqNum=17
看 hostname=dn3,这一句估计是hostname dn3 链接有问题,查看C:\Windows\System32\drivers\etc\hosts 文件,发现,dn2 和dn3 映射一样的ip 了,故将dn3的ip改正,改成192.168.80.134,重新执行。
遇到上述错误,百分之八十都是ip映射问题。