java连接hbase1.2.6

上周花了点时间去学习了hbase,在虚拟机linux环境下装了hbase熟悉一遍基本操作后,准备在Eclipse上实现java连接hbase并编写工具类,然后因为没有设置hadoop环境变量、jar包版本、服务器等问题,一直连接不上,后来更新了jar包版本,并让运维同时帮忙在测试机上装了hadoop和hbase(考虑本机没有装hadoop且hbase是按单机模式装的,可能有问题),这次直接连服务器上的hbase总算连上了,经验分享如下:

首先,本机也需要有配置hadoop环境变量,直接把hadoop安装包拉到本机,解压,然后把“.....\bin”配置到环境变量中去,但也可以通过另一种方式解决,即通过代码设置该变量,代码:System.setProperty("hadoop.home.dir", "D:\\hadoop-2.7.3"); 

其次,运维那边安装好hadopp和hbase,会返回一些信息,包括IP及hostname,我们需要将服务器zookeeper对应的IP和hostname录入到本机的host文件中,host文件的具体路径为:C:\Windows\System32\drivers\etc。如图:


这两点搞定了剩下的基本就是jar包的问题了,话不多说直接上图


java+hbase1.2.6的工具类代码如下:

import java.io.IOException;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.Cell;
import org.apache.hadoop.hbase.CellUtil;
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.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.HTable;
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.util.Bytes;


public class HbaseDataSourceUtil {
private static Configuration conf = null;
private static Admin admin = null;
private static Connection conn = null;

/**
* 初始化连接
* @throws IOException
*/
public static void init() throws IOException{
System.setProperty("hadoop.home.dir", "D:\\hadoop-2.7.3");   //必备条件之一
conf = HBaseConfiguration.create();
conf.set("hbase.zookeeper.quorum", "hadoop14,hadoop15,hadoop16");   //hadoop14,hadoop15,hadoop16为hostname
conf.set("hbase.zookeeper.property.clientPort", "2181");
conn = ConnectionFactory.createConnection(conf);
admin = conn.getAdmin();
}

/**
* 建表
* @param admin
* @param tableName
* @throws IOException
*/
public static void createTable(String tableName,String[] families) throws IOException{
init();
if(admin.tableExists(TableName.valueOf(tableName))){
System.out.println(tableName+"已存在");
}else{
HTableDescriptor tableDesc = new HTableDescriptor(TableName.valueOf(tableName));
for(String family : families){
tableDesc.addFamily(new HColumnDescriptor(family));
}
admin.createTable(tableDesc);
System.out.println("Table created");
}
}

/**
 * 新增列簇
 * @param tableName
 * @param family
 */
public static void addFamily(String tableName,String family){
try {
init();
HColumnDescriptor columnDesc = new HColumnDescriptor(family);
admin.addColumn(TableName.valueOf(tableName), columnDesc);
} catch (IOException e) {
e.printStackTrace();
} finally{
destroy();
}
}


/**
* 查询表信息
* @param conn
* @param tableName
*/
public static void query(String tableName){
HTable hTable = null;
ResultScanner scann = null;
try {
init();
hTable = (HTable) conn.getTable(TableName.valueOf(tableName));
scann = hTable.getScanner(new Scan());
for(Result rs : scann){
System.out.println("RowKey为:"+new String(rs.getRow()));
//按cell进行循环
for(Cell cell : rs.rawCells()){
System.out.println("列簇为:"+new String(CellUtil.cloneFamily(cell)));
System.out.println("列修饰符为:"+new String(CellUtil.cloneQualifier(cell)));
System.out.println("值为:"+new String(CellUtil.cloneValue(cell)));
}
System.out.println("=============================================");
}
} catch (IOException e) {
e.printStackTrace();
} finally{
if(scann!=null){
scann.close();
}
if(hTable!=null){
try {
hTable.close();
} catch (IOException e) {
e.printStackTrace();
}
}
destroy();
}
}

/**
* 根据rowkey查询单行
* @param conn
* @param key
* @param tableName
*/
public static void queryByRowKey(String key,String tableName){
HTable hTable = null;
try {
init();
hTable = (HTable) conn.getTable(TableName.valueOf(tableName));
Result rs = hTable.get(new Get(Bytes.toBytes(key)));
System.out.println(tableName+"表RowKey为"+key+"的行数据如下:");
for(Cell cell : rs.rawCells()){
System.out.println("列簇为:"+new String(CellUtil.cloneFamily(cell)));
System.out.println("值为:"+new String(CellUtil.cloneValue(cell)));
}
} catch (IOException e) {
e.printStackTrace();
} finally{
if(hTable!=null){
try {
hTable.close();
} catch (IOException e) {
e.printStackTrace();
}
}
destroy();
}
}

/**
* 插入单行单列簇单列修饰符数据
* @param conn
* @param tableName
* @param key
* @param family
* @param col
* @param val
*/
public static void addOneRecord(String tableName,String key,
String family,String col,String val){
HTable hTable = null;
try {
init();
hTable = (HTable) conn.getTable(TableName.valueOf(tableName));
Put p = new Put(Bytes.toBytes(key));
p.addColumn(Bytes.toBytes(family),Bytes.toBytes(col),Bytes.toBytes(val));
if(p.isEmpty()){  
System.out.println("数据插入异常,请确认数据完整性,稍候重试");
}else{
hTable.put(p);
}
} catch (IOException e) {
e.printStackTrace();
} finally{
if(hTable!=null){
try {
hTable.close();
} catch (IOException e) {
e.printStackTrace();
}
}
destroy();
}
}

/**
 * 插入单行单列簇多列修饰符数据
 * @param conn
 * @param tableName
 * @param key
 * @param family
 * @param cols
 * @param val
 */
public static void addMoreRecord(String tableName,String key,
String family,Map<String,String> colVal){
HTable hTable = null;
try {
init();
hTable = (HTable) conn.getTable(TableName.valueOf(tableName));
Put p = new Put(Bytes.toBytes(key));
for(String col : colVal.keySet()){
String val = colVal.get(col);
if(StringUtils.isNotBlank(val)){
p.addColumn(Bytes.toBytes(family),Bytes.toBytes(col),Bytes.toBytes(val));
}else{
System.out.println("列值为空,请确认数据完整性");
}
}
//当put对象没有成功插入数据时,此时调用hTable.put(p)方法会报错:java.lang.IllegalArgumentException:No columns to insert
if(p.isEmpty()){  
System.out.println("数据插入异常,请确认数据完整性,稍候重试");
}else{
hTable.put(p);
}
} catch (IOException e) {
e.printStackTrace();
} finally{
if(hTable!=null){
try {
hTable.close();
} catch (IOException e) {
e.printStackTrace();
}
}
destroy();
}
}


/**
* 删除指定名称的列簇
* @param admin
* @param family
* @param tableName
*/
public static void deleteFamily(String family,String tableName){
try {
init();
admin.deleteColumn(TableName.valueOf(tableName), Bytes.toBytes(family));
} catch (IOException e) {
e.printStackTrace();
} finally{
destroy();
}
}


/**
* 删除指定行
* @param conn
* @param key
* @param tableName
*/
public static void deleteRow(String key,String tableName){
HTable hTable = null;
try {
init();
hTable = (HTable) conn.getTable(TableName.valueOf(tableName));
hTable.delete(new Delete(Bytes.toBytes(key)));
} catch (IOException e) {
e.printStackTrace();
} finally{
if(hTable!=null){
try {
hTable.close();
} catch (IOException e) {
e.printStackTrace();
}
}
destroy();
}
}


/**
* 删除指定表名
* @param admin
* @param tableName
*/
public static void deleteTable(String tableName){
try {
init();
//在删除一张表前,必须先使其失效 
admin.disableTable(TableName.valueOf(tableName));
admin.deleteTable(TableName.valueOf(tableName));
} catch (IOException e) {
e.printStackTrace();
} finally{
destroy();
}
}

//关闭连接
private static void destroy(){
if(admin!=null){
try {
admin.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(conn!=null){
try {
conn.close();
} catch (IOException e) {
e.printStackTrace();
}
}
/*if(conf!=null){
conf.clear();
}*/
}
}

  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值