Hbase Java API 介绍及使用示例

Hbase Java API 介绍及使用示例

几个相关类与HBase数据模型之间的对应关系

java类HBase数据模型

HBaseAdmin数据库(DataBase)

HBaseConfiguration

HTable表(Table)

HTableDescriptor列族(Column Family)

Put 列修饰符(Column Qualifier)

Get

Scanner

一、HBaseConfiguration

关系:org.apache.hadoop.hbase.HBaseConfiguration

作用:对HBase进行配置

返回值函数描述

void addResource(Path file) 通过给定的路径所指的文件来添加资源

void clear() 清空所有已设置的属性

string get(String name) 获取属性名对应的值

String getBoolean(String name, booleandefaultValue) 获取为boolean类型的属性值,如果其属性值类型部位boolean,则返回默认属性值

void set(String name, String value) 通过属性名来设置值

void setBoolean(String name, boolean value) 设置boolean类型的属性值用法示例: 01.HBaseConfigurationhconfig = new

HBaseConfiguration();02.hconfig.set("hbase.zookeeper.property.clientPort","2181");

该方法设置了"hbase.zookeeper.property.clientPort"的端口号为2181。一般情况下,HBaseConfiguration会使用构造函数进行初始化,然后在使用其他方法。

二、HBaseAdmin

关系:org.apache.hadoop.hbase.client.HBaseAdmin

作用:提供了一个接口来管理HBase数据库的表信息。它提供的方法包括:创建表,删除表,列出表项,使表有效或无效,以及添加或删除表列族成员等。

返回值函数描述

void addColumn(String tableName, HColumnDescriptor column) 向一个已经存在的表添加咧

checkHBaseAvailable(HBaseConfigurationconf) 静态函数,查看HBase是否处于运行状态

createTable(HTableDescriptordesc) 创建一个表,同步操作

deleteTable(byte[] tableName) 删除一个已经存在的表

enableTable(byte[] tableName) 使表处于有效状态

disableTable(byte[] tableName) 使表处于无效状态

HTableDescriptor[] listTables() 列出所有用户控件表项

void modifyTable(byte[] tableName, HTableDescriptorhtd) 修改表的模式,是异步的操作,可能需要花费一定的时间

booleantableExists(String tableName) 检查表是否存在用法示例:

01.HBaseAdmin admin = new

HBaseAdmin(config);02.admin.disableTable("tablename")

三、HTableDescriptor

关系:org.apache.hadoop.hbase.HTableDescriptor

作用:包含了表的名字极其对应表的列族

返回值函数描述

void addFamily(HColumnDescriptor) 添加一个列族

HColumnDescriptorremoveFamily(byte[] column) 移除一个列族

byte[] getName() 获取表的名字

byte[] getValue(byte[] key) 获取属性的值

void setValue(String key, String value) 设置属性的值用法示例:

01.HTableDescriptorhtd = new HTableDescriptor(table);02.htd.addFamily(new

HcolumnDescriptor("family"));

在上述例子中,通过一个HColumnDescriptor实例,为HTableDescriptor添加了一个列族:family

四、HColumnDescriptor

关系:org.apache.hadoop.hbase.HColumnDescriptor

作用:维护着关于列族的信息,例如版本号,压缩设置等。它通常在创建表或者为表添加列族的时候使用。列族被创建后不能直接修改,只能通过删除然后重新创建的方式。列族被删除的时候,列族里面的数据也会同时被删除。

返回值函数描述

byte[] getName() 获取列族的名字

byte[] getValue(byte[] key) 获取对应的属性的值

void setValue(String key, String value) 设置对应属性的值用法示例:

01.HTableDescriptorhtd = new HTableDescriptor(tablename);02.HColumnDescriptor col = new HColumnDescriptor("content:");03.htd.addFamily(col);

此例添加了一个content的列族

五、HTable

关系:org.apache.hadoop.hbase.client.HTable

作用:可以用来和HBase表直接通信。此方法对于更新操作来说是非线程安全的。 返回值函数描述

void checkAdnPut(byte[] row, byte[] family, byte[] qualifier, byte[] value, Put put 自动的检查row/family/qualifier是否与给定的值匹配

void close() 释放所有的资源或挂起内部缓冲区中的更新

Boolean exists(Get get) 检查Get实例所指定的值是否存在于HTable的列中 Result get(Get get) 获取指定行的某些单元格所对应的值

byte[][] getEndKeys() 获取当前一打开的表每个区域的结束键值

ResultScannergetScanner(byte[] family) 获取当前给定列族的scanner实例

HTableDescriptorgetTableDescriptor() 获取当前表的HTableDescriptor实例

byte[] getTableName() 获取表名

static booleanisTableEnabled(HBaseConfigurationconf, String tableName) 检查表是否有效

void put(Put put) 向表中添加值用法示例:

01.HTable table = new HTable(conf, Bytes.toBytes(tablename));02.ResultScanner scanner = table.getScanner(family);

六、Put

关系:org.apache.hadoop.hbase.client.Put

作用:用来对单个行执行添加操作

返回值函数描述

Put add(byte[] family, byte[] qualifier, byte[] value) 将指定的列和对应的值添加到Put实例中

Put add(byte[] family, byte[] qualifier, long ts, byte[] value) 将指定的列和对应的值及时间戳添加到Put实例中

byte[] getRow() 获取Put实例的行

RowLockgetRowLock() 获取Put实例的行锁

long getTimeStamp() 获取Put实例的时间戳

booleanisEmpty() 检查familyMap是否为空

Put setTimeStamp(long timeStamp) 设置Put实例的时间戳用法示例:

01.HTable table = new HTable(conf,Bytes.toBytes(tablename));02.Put p = new

Put(brow);//为指定行创建一个Put操作03.p.add(family,qualifier,value);04.table.put(p);

七、Get

关系:org.apache.hadoop.hbase.client.Get

作用:用来获取单个行的相关信息

返回值函数描述

Get addColumn(byte[] family, byte[] qualifier) 获取指定列族和列修饰符对应的列 Get addFamily(byte[] family) 通过指定的列族获取其对应列的所有列

Get setTimeRange(long minStamp,longmaxStamp) 获取指定取件的列的版本号 Get setFilter(Filter filter) 当执行Get操作时设置服务器端的过滤器用法示例: 01.HTable table = new HTable(conf, Bytes.toBytes(tablename));02.Get g = new Get(Bytes.toBytes(row));

八、Result

关系:org.apache.hadoop.hbase.client.Result

作用:存储Get或者Scan操作后获取表的单行值。使用此类提供的方法可以直接获取值或者各种Map结构(key-value对)

返回值函数描述

booleancontainsColumn(byte[] family, byte[] qualifier) 检查指定的列是否存在 NavigableMap<byte[],byte[]>getFamilyMap(byte[] family) 获取对应列族所包含的修饰符与值的键值对

byte[] getValue(byte[] family, byte[] qualifier) 获取对应列的最新值

九、ResultScanner

关系:Interface

作用:客户端获取值的接口

返回值函数描述

void close() 关闭scanner并释放分配给它的资源

Result next() 获取下一行的值

 

第二篇:07_Hbase Java API

HBase Java API

目 录

1.

2.

3.

开发环境准备 ............................................................................................................................. 1 程序功能实现 ............................................................................................................................. 2 常见问题 .3.1. HBase提供了Java API的访问接口。通过API可以更灵活的操作HBase。下面通过例子讲解如何使用Java程序创建、删除表,以及记录的增删改查等操作。

1. 开发环境准备

在开发程序前,需要做几个工作:

(1) 在Eclipse中创建新项目。

(2) 把访问HBase使用到的相关Jar包拷贝到项目中,并加入到Java

Build Path中。

这些包可以到HBase压缩包中找到分别是:

? hbase-0.94.27.jar 此包在HBase包的根目录下。

其他包在HBase的lib目录下。包括:

? hadoop-core-1.0.4.jar

? hadoop-core-1.0.4.jar

? log4j-1.2.16.jar

? protobuf-java-2.4.0a.jar

? slf4j-api-1.4.3.jar

? slf4j-log4j12-1.4.3.jar

? zookeeper-3.4.5.jar

? 以及所有名称以“commons-”开头的包。

1

2. 程序功能实现

接下来就可以编写访问HBase的Java程序了,可参考如下: package com.sjkxj.hbasetest;

import java.io.IOException;

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.client.Delete;

import org.apache.hadoop.hbase.client.Get;

importimportimportimportimportimportimport

public class HBaseTest {

// 声明静态配置 staticconfnull; static { confcreate(); conf"hbase.zookeeper.quorum", "192.168.1.201"); // Zookeeper的地址 conf"hbase.zookeeper.property.clientPort", "2181"); } public static void main(String[] args) throws Exception {

// 创建表

String tableName = "blog"; String[] family = { "article","author" }; creatTable(tableName,family);

// 为表添加数据

String tableName = "blog";

String rowkey = "row1";

String columnFamily = "article";

2 // //

{

String column = ""; String value = "123"; insertOneRow(tableName,rowkey,columnFamily,column,value); // 删除一列 // deleteColumn("blog", "rowkey1", "author", "nickname");// 删除所有列 // deleteAllColumn("blog", "rowkey1"); // 删除表 // deleteTable("blog"); // 查询 // getResult("blog", "rowkey1"); // 查询某一列的值 // getResultByColumn("blog", "rowkey1", "author", "name"); // updateTable("blog", "rowkey1", "author", "name","bin"); // getResultByColumn("blog", "rowkey1", "author", "name"); // 遍历查询 // getResultScann("blog"); // 查询某列的多版本 // getResultByVersion("blog", "rowkey1", "author", "name"); } /* * 创建表 * @tableName 表名 * @family 列族列表 */ public static void creatTable(String tableName, String[] family) throws HBaseAdmin admin = new HBaseAdmin(conf); HTableDescriptor desc = new HTableDescriptor(tableName); for (int i = 0; i < family.length; i++) { desc.addFamily(new HColumnDescriptor(family[i]));

3

} if (admin.tableExists(tableName)) { System.out.println("table Exists!"); System.exit(0); } else { admin.createTable(desc); System.out.println("create table Success!"); } } /**

* 插入一条数据

* @param tableName 表明

* @param columnFamily 列簇

* @param column 列

* @param value 值

* ***/

public static voidcolumnFamily,String column,String value)throws

HTable table=new HTable(conf Put put=new Put(Bytes. put.add(Bytes.toBytes(column),

Bytes.toBytes(value));

{

table.put(put);//放入表 table.close();//释放资源 } /* * 根据rwokey查询 * @rowKey rowKey * @tableName 表名 */ public static Result getResult(String tableName, String rowKey) throws Get get = new Get(Bytes.toBytes(rowKey)); HTable table = new HTable(conf, tableName); Result result = table.get(get); for (KeyValue kv : result.list()) { System.out.println("family:" + Bytes.toString(kv.getFamily())); System.out.println("qualifier:" + Bytes.toString(kv.getQualifier()));

4

} /* System.out.println("value:" + Bytes.toString(kv.getValue())); System.out.println("Timestamp:" + kv.getTimestamp()); System.out.println("-------------------------------------------"); } return result;

* 遍历查询hbase表

* @tableName 表名

*/

public static void getResultScann(String tableName) throws Scan scan = new Scan();

ResultScanner rs = null;

HTable table = new HTable(conf, tableName);

try {

rs = table.getScanner(scan);

for (Result r : rs) {

for (KeyValue kv : r.list()) {

System.out.println("family:"(kv.getFamily())); System.out.println("qualifier:"Bytes.toString System.out"value:"toString(kv.getValue())); System.out"timestamp:" + kv.getTimestamp());

System.out.println("-------------------------------------------");

}

}

} finally {

}

}

/*

* 查询表中的某一列

* @tableName 表名

* @rowKey rowKey

*/

public static void getResultByColumn(String tableName, String rowKey, String familyName,

String columnName) throws IOException {

HTable table = new HTable(conf, tableName);

Get get = new Get(Bytes.toBytes(rowKey));

get.addColumn(Bytes.toBytes(familyName), Bytes.toBytes(columnName)); // 获取

5

指定列族和列修饰符对应的列

// assertThat(Bytes.toString(table.get(get).list().get(0).getValue()),is("一叶渡江"));

Result result = table.get(get);

for (KeyValue kv : result.list()) {

System.out.println("family:" + Bytes.toString(kv.getFamily()));

System.out.println("qualifier:" + Bytes.toString(kv.getQualifier())); System.out.println("value:" + Bytes.toString(kv.getValue()));

System.out.println("Timestamp:" + kv.getTimestamp());

System.out.println("-------------------------------------------"); }

}

/*

* 更新表中的某一列 * @tableName 表名 * @rowKey rowKey

* @familyName 列族名

* @columnName 列名

* @value 更新后的值

*/

public static void String rowKey, String throws HTable table = newconf Put put = new put.add(Bytes.toBytes(columnName),

Bytes.toBytes System.out"update table Success!");

}

/*

* 查询某列数据的多个版本 * @tableName 表名 * @rowKey rowKey

* @familyName 列族名

* @columnName 列名

*/

public static void getResultByVersion(String tableName, String rowKey, String familyName,

String columnName) throws IOException {

HTable table = new HTable(conf, tableName);

Get get = new Get(Bytes.toBytes(rowKey));

get.addColumn(Bytes.toBytes(familyName), Bytes.toBytes(columnName));

6

} /* get.setMaxVersions(5); Result result = table.get(get); for (KeyValue kv : result.list()) { System.out.println("family:" + Bytes.toString(kv.getFamily())); System.out.println("qualifier:" + Bytes.toString(kv.getQualifier())); System.out.println("value:" + Bytes.toString(kv.getValue())); System.out.println("Timestamp:" + kv.getTimestamp()); System.out.println("-------------------------------------------"); } /* * List<?> results = table.get(get).list(); Iterator<?> it = * results.iterator(); while (it.hasNext()) { * System.out.println(it.next().toString()); } */ * 删除指定的列 * @tableName 表名 * @rowKey rowKey

* @familyName 列族名

* @columnName 列名

*/

public static void String rowKey, String String columnName) throws HTable table = newconf newtoBytes(rowKey));

toBytes(falilyName),

Bytes.toBytes out":" + columnName + "is deleted!");

}

/*

* 删除指定的列

* @tableName 表名

* @rowKey rowKey

*/

public static void deleteAllColumn(String tableName, String rowKey) throws IOException {

HTable table = new HTable(conf, tableName);

Delete deleteAll = new Delete(Bytes.toBytes(rowKey));

table.delete(deleteAll);

System.out.println("all columns are deleted!");

7

}

} /* * 删除表 * @tableName 表名 */ public static void deleteTable(String tableName) throws IOException { HBaseAdmin admin = new HBaseAdmin(conf); admin.disableTable(tableName); admin.deleteTable(tableName); System.out.println(tableName + "is deleted!"); }

3. 常见问题

3.1.

master

问题描述:

Windows下开发部署在linux环境中,在运行调试时可能会出现无法找到如下:

java.net.UnknownHostException: unknown host: hadoop0 unknown host:

解给主机hadoop0Master那台机器的IP地址。

在文件中添加如下信息:

192.168.1.200 hadoop0

8