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() 获取下一行的值
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
HBase默认配置说明收藏版hbaserootdir这个目录是regionserver的共享目录用来持久化HbaseURL需要是3…
第1章集群的搭建11集群的结构实验环境中共有6台服务器搭建完全分布式HDFS与HBase环境采用的Hadoop与HBase版本为h…
Hbase分布式详细安装步骤Hbase版本0206安装注自0205以后版本集成了zookeeper可匹配Hadoop0202准备工…
hadoop端口20xx年8月6日954端口作用9000fsdefaultFS如hdfs172254017190009001dfs…
Hadoop应用各端口具体用途Hadoop集群的各部分一般都会使用到多个端口有些是daemon之间进行交互之用有些是用于RPC访问…