HBase的基本操作
HBase获取connection和其他API获取连接的步骤一样,通过连接工场获取,HBase比较老的API中还有连接池的概念,有的介绍文献中说连接池并没有起到实际作用,HBase新的API中也将连接池标记为已过时,不过像如下通过获取连接-操作-关闭的方式,在有的业务中并不适合,因为HBase或取连接时比较耗时,在实际使用时还是依据业务,尽量避免HBase connection 频繁的关闭和开启。
public class HBaseHelper {
private static final Logger LOGGER = LoggerFactory.getLogger(HBaseHelper.class);
private static final String NULL_STRING=new String();
public static Connection getConnection(){
Connection conn=null;
try {
/**
* 在创建的时候回去class文件的根目录先去找 hbase-site.xml文件。
*/
Configuration conf=HBaseConfiguration.create();
conn=ConnectionFactory.createConnection(conf);
} catch (IOException e) {
LOGGER.error("Hbase connection error please check the configuration");
}
return conn;
}
/**
* 创建数据表
*/
public static void createTable(String table, byte[][] splitKeys,String... familys) {
Connection connection=getConnection();
Admin admin=null;
try {
admin = connection.getAdmin();
if (admin.tableExists(TableName.valueOf(table))) {
LOGGER.error("table : " + table + " is exist");
return;
}
HTableDescriptor tableDescriptor = new HTableDescriptor(
TableName.valueOf(table));
for (String family : familys) {
HColumnDescriptor familyDescriptor = new HColumnDescriptor(family);
tableDescriptor.addFamily(familyDescriptor);
}
if (splitKeys != null) {
admin.createTable(tableDescriptor, splitKeys);
} else {
admin.createTable(tableDescriptor);
}
} catch (MasterNotRunningException e) {
LOGGER.error("HBase Master not running ", e);
} catch (ZooKeeperConnectionException e) {
LOGGER.error("ZooKeeper Connection error ", e);
e.printStackTrace();
} catch (IOException e) {
LOGGER.error("Hbase IO Exception ", e);
e.printStackTrace();
} finally{
close(admin);
close(connection);
}
}
public static void createTable(String table, String... familys) {
HBaseHelper.createTable(table, null, familys);
}
/**
* 删除数据表
*/
public static void deleteTable(String table) {
Connection connection=getConnection();
Admin admin=null;
try {
admin = connection.getAdmin();
if (!admin.tableExists(TableName.valueOf(table))) {
LOGGER.error("table : " + table + " doesn't exist");
return;
}
admin.disableTable(TableName.valueOf(table));
admin.deleteTable(TableName.valueOf(table));
} catch (MasterNotRunningException e) {
LOGGER.error("HBase Master not running ", e);
} catch (ZooKeeperConnectionException e) {
LOGGER.error("ZooKeeper Connection error ", e);
e.printStackTrace();
} catch (IOException e) {
LOGGER.error("Hbase IO Exception ", e);
e.printStackTrace();
} finally{
close(connection);
}
}
/**
* 添加
*/
public static void add(String tableName, String rowKey, String family, Map<String,byte[]> data){
Connection connection=getConnection();
Table table = null;
try {
table = connection.getTable(TableName.valueOf(tableName));
List<Put> puts=new ArrayList<Put>();
for(Map.Entry<String, byte[]> entry:data.entrySet()){
Put put = new Put(Bytes.toBytes(rowKey));
put.addColumn(family.getBytes(), entry.getKey().getBytes(), entry.getValue());
puts.add(put);
}
table.put(puts);
} catch (IOException e) {
e.printStackTrace();
} finally{
close(connection);
}
}
/**
* 删除
*/
public static void delete(String tableName, String rowKey){
Connection connection=getConnection();
Table table=null;
try {
table = connection.getTable(TableName.valueOf(tableName));
Delete delete = new Delete(Bytes.toBytes(rowKey));
table.delete(delete);
} catch (IOException e) {
e.printStackTrace();
}finally{
close(table);
close(connection);
}
}
/**
* 查找 返回 Map对象
*/
public static Map<String,byte[]> find(String tableName, String rowKey, String family){
Map<String,byte[]> data=null;
Connection connection=getConnection();
Table table=null;
try {
table = connection.getTable(TableName.valueOf(tableName));
Get get = new Get(Bytes.toBytes(rowKey));
Result result = table.get(get);
data=HBaseConvetorUtil.toMap(result, family);
} catch (IOException e) {
e.printStackTrace();
}finally{
close(table);
close(connection);
}
return data;
}
public static <T> T find(Class<T> clazz,String tableName,String id,String family) throws Exception{
T data=null;
Connection connection=getConnection();
Table table=null;
try {
table = connection.getTable(TableName.valueOf(tableName));
Get get = new Get(Bytes.toBytes(id));
Result result = table.get(get);
data=HBaseConvetorUtil.toObject(clazz, result, family);
} catch (IOException e) {
e.printStackTrace();
}finally{
close(table);
close(connection);
}
return data;
}
private static ResultScanner getList(Table table, Filter filter) throws IOException{
Scan scan = new Scan();
if(filter!=null){
scan.setFilter(filter);
}
ResultScanner resultScanner = table.getScanner(scan);
return resultScanner;
}
public static List<Map<String,byte[]>> find(String tableName, Filter filter,String family){
List<Map<String,byte[]>> data= null;
Connection connection=getConnection();
Table table=null;
ResultScanner resultScanner=null;
try {
table = connection.getTable(TableName.valueOf(tableName));
resultScanner=getList(table,filter);
data = HBaseConvetorUtil.toMap(resultScanner, family);
} catch (IOException e) {
e.printStackTrace();
}finally{
close(table);
close(connection);
resultScanner.close();
}
return data;
}
public static <T> List<T> find(Class<T> clazz,String tableName,Filter filter,String family) throws Exception{
Connection connection=getConnection();
Table table=null;
ResultScanner resultScanner=null;
List<T> data=null;
try {
table = connection.getTable(TableName.valueOf(tableName));
resultScanner=getList(table,filter);
data = HBaseConvetorUtil.toObject(clazz,resultScanner, family);
} catch (IOException e) {
e.printStackTrace();
}finally{
close(table);
close(connection);
close(resultScanner);
}
return data;
}
public static String getString(Result result,String family,String qualifier){
byte[] rs=result.getValue(family.getBytes(), qualifier.getBytes());
if(rs==null){
return NULL_STRING; //此处不能设置为空,如果设置为空,在hadoop序列化的时候会出现空指针异常
}
return new String(rs);
}
public static int getInt(Result result,String family,String qualifier){
byte[] rs=result.getValue(family.getBytes(), qualifier.getBytes());
if(rs==null){
return 0;
}
return Bytes.toInt(rs);
}
public static long getLong(Result result,String family,String qualifier){
byte[] rs=result.getValue(family.getBytes(), qualifier.getBytes());
if(rs==null){
return 0L;
}
return Bytes.toLong(rs); //该方法给出lang值时为固定长度
}
public static void close(Table table){
if(table!=null){
try {
table.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
public static void close(Admin admin){
if(admin!=null){
try {
admin.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
public static void close(Connection conn){
if(conn!=null){
try {
conn.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
public static void close(ResultScanner resultScanner){
if(resultScanner!=null){
resultScanner.close();
}
}
}