环境
jdk1.8:Linux环境和Windows环境均需要
Linux环境先安装好hbase1.x,如果还没安装hbase,可点击这里安装hbase
Windows环境下安装好Maven3.3 +
Windows环境下安装好IDEA或Eclipse,本文使用IDEA2018
准备工作
设置idea支持lambda格式
File-->Project Structure-->Modules-->Language level选8 - Lambdas, type annotations etc.
File-->Settings-->Build-->Compiler-->Java Compiler, largest bytecode version选择8
maven工程
1.用IDEA新建maven工程
2.修改pom.xml添加hbase客户端依赖,版本需要与服务器安装的hbase版本一致。
<dependencies>
<dependency>
<groupId>org.apache.hbase</groupId>
<artifactId>hbase-client</artifactId>
<version>1.3.1</version>
</dependency>
</dependencies>
3.配置log4j: 在resources目录下新建log4j.properties文件
### set log levels ###
log4j.rootLogger = INFO,Console
### 输出到控制台 ###
log4j.appender.Console=org.apache.log4j.ConsoleAppender
log4j.appender.Console.Target=System.out
log4j.appender.Console.layout=org.apache.log4j.PatternLayout
log4j.appender.Console.layout.ConversionPattern=[%d{yy/MM/dd HH:mm:ss:SSS}]-%l:%m%n
API操作
服务端先打开hadoop和hbase服务
start-all.sh
start-hbase.sh
IDEA项目目录结构:
创建表
HBaseUtils.java
package top.jipson;
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.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.HBaseAdmin;
import java.io.IOException;
import java.util.List;
/**
* HBASE工具类
*/
public class HBaseUtils {
private static Connection connection;
static {
Configuration configuration = HBaseConfiguration.create();
configuration.set("hbase.zookeeper.property.clientPort","2181");
configuration.set("hbase.zookeeper.quorum","192.168.134.128");//注意修改ip为hbase所在机器的ip或主机名
try {
connection = ConnectionFactory.createConnection(configuration);
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 创建表
* @param tableName
* @param columnFamilies
* @return
*/
public static boolean createTable(String tableName, List<String> columnFamilies){
try {
HBaseAdmin admin = (HBaseAdmin)connection.getAdmin();
if(admin.tableExists(tableName)){
return false;
}
HTableDescriptor hTableDescriptor = new HTableDescriptor(TableName.valueOf(tableName));
// 注意设置ide支持lambda格式
columnFamilies.forEach(columnFamily -> {
HColumnDescriptor hColumnDescriptor = new HColumnDescriptor(columnFamily);
hColumnDescriptor.setMaxVersions(1);
hTableDescriptor.addFamily(hColumnDescriptor);
});
admin.createTable(hTableDescriptor);
} catch (IOException e) {
e.printStackTrace();
}
return true;
}
}
提示:configuration.set("hbase.zookeeper.quorum","192.168.134.128");//注意修改ip为hbase所在机器的ip或主机名
测试:
HBaseUtilsTest.java
package top.jipson;
import org.junit.Test;
import java.util.Arrays;
import java.util.List;
/**
* HBASE测试类
*/
public class HBaseUtilsTest {
private static final String TABLE_NAME = "class1";
private static final String TEACHER = "teacher1";
private static final String STUDENT = "student1";
@Test
public void createTable(){
List<String> columnFamilies = Arrays.asList(TEACHER, STUDENT);
boolean table = HBaseUtils.createTable(TABLE_NAME, columnFamilies);
System.out.println("表创建结果:"+ table);
}
}
运行createTable方法,看到控制台数据表创建结果为true
进入hbase shell命令查看
能看到class1表,说明API创建表成功了。
插入表数据
HBaseUtils.java
/**
* 插入数据
* @param tableName
* @param rowKey
* @param columnFamilyName
* @param pairList
* @return
*/
public static boolean putRow(String tableName, String rowKey, String columnFamilyName, List<Pair<String, String>> pairList){
try {
Table table = connection.getTable(TableName.valueOf(tableName));
Put put = new Put(Bytes.toBytes(rowKey));
pairList.forEach(pair -> put.addColumn(Bytes.toBytes(columnFamilyName), Bytes.toBytes(pair.getFirst()), Bytes.toBytes(pair.getSecond())));
table.put(put);
table.close();
} catch (IOException e) {
e.printStackTrace();
}
return true;
}
HBaseUtilsTest.java
/**
* 测试插入数据
*/
@Test
public void insData(){
List<Pair<String, String>> pairs1 = Arrays.asList(
new Pair<>("name", "Jack"),
new Pair<>("age", "19"),
new Pair<>("gender","2"));
HBaseUtils.putRow(TABLE_NAME, "rowkey1", STUDENT, pairs1);
}
这里如果需要更多测试数据,可以修改测试数据,多次执行得到多条数据,例如
HBaseUtilsTest.java
/**
* 测试插入数据
*/
@Test
public void insData(){
List<Pair<String, String>> pairs1 = Arrays.asList(
new Pair<>("name", "Rose"),
new Pair<>("age", "18"),
new Pair<>("gender","1"));
HBaseUtils.putRow(TABLE_NAME, "rowkey2", STUDENT, pairs1);
}
获取一行数据
HBaseUtils.java
/**
* 获取表的一行数据
* @param tableName
* @param rowKey
* @return
*/
public static Result getRow(String tableName, String rowKey){
try {
Table table = connection.getTable(TableName.valueOf(tableName));
Get get = new Get(Bytes.toBytes(rowKey));
return table.get(get);
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
HBaseUtilsTest.java
@Test
public void getRow(){
Result rowkey1 = HBaseUtils.getRow(TABLE_NAME, "rowkey1");
if(rowkey1 != null){
System.out.println(Bytes.toString(
rowkey1.getValue(
Bytes.toBytes(STUDENT),
Bytes.toBytes("name")
)));
}
}
获取某行某列族某列的值
HBaseUtils.java
/**
* 获取指定行指定列 (cell) 的最新版本的数据
* @param tableName
* @param rowKey
* @param columnFamily
* @param qualifier 列标识,实际就是column(具体某列)
* @return
*/
public static String getCell(String tableName, String rowKey, String columnFamily, String qualifier){
try {
Table table = connection.getTable(TableName.valueOf(tableName));
Get get = new Get(Bytes.toBytes(rowKey));
if(!get.isCheckExistenceOnly()){
get.addColumn(Bytes.toBytes(columnFamily), Bytes.toBytes(qualifier));
Result result = table.get(get);
byte[] resultValue = result.getValue(Bytes.toBytes(columnFamily), Bytes.toBytes(qualifier));
return Bytes.toString(resultValue);
}else {
return null;
}
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
HBaseUtilsTest.java
@Test
public void getCell(){
String cell = HBaseUtils.getCell(TABLE_NAME, "rowkey2", STUDENT, "age");
System.out.println("cell age:" + cell);
}
查看表内容
HBaseUtils.java
/**
* 检索全表
* @param tableName
* @return
*/
public static ResultScanner getScanner(String tableName){
try {
Table table = connection.getTable(TableName.valueOf(tableName));
Scan scan = new Scan();
return table.getScanner(scan);
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
HBaseUtilsTest.java
@Test
public void getScanner(){
ResultScanner scanner = HBaseUtils.getScanner(TABLE_NAME);
if(scanner != null){
scanner.forEach(result -> System.out.println(Bytes.toString(result.getRow())+"->"+Bytes.toString(result.getValue(Bytes.toBytes(STUDENT),Bytes.toBytes("name")))));
scanner.close();
}
}
按条件过滤器检索表
HBaseUtils.java
/**
* 按条件过滤器检索表
* @param tableName
* @param filterList
* @return
*/
public static ResultScanner getScanner(String tableName, FilterList filterList){
try {
Table table = connection.getTable(TableName.valueOf(tableName));
Scan scan = new Scan();
scan.setFilter(filterList);
return table.getScanner(scan);
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
HBaseUtilsTest.java
@Test
public void getScannerWithFilter(){
FilterList filterList = new FilterList(FilterList.Operator.MUST_PASS_ALL);
SingleColumnValueFilter nameFilter = new SingleColumnValueFilter(Bytes.toBytes(STUDENT),
Bytes.toBytes("name"), CompareFilter.CompareOp.EQUAL, Bytes.toBytes("Jack"));
filterList.addFilter(nameFilter);
ResultScanner scanner = HBaseUtils.getScanner(TABLE_NAME, filterList);
if(scanner != null){
scanner.forEach(result -> System.out.println(Bytes.toString(result.getRow())+"->"+Bytes.toString(result.getValue(Bytes.toBytes(STUDENT),Bytes.toBytes("name")))));
scanner.close();
}
}
包含起始行和结束行的查询
HBaseUtils.java
/**
* 条件查询
* @param tableName
* @param startRowKey 起始RowKey
* @param endRowKey 终止RowKey
* @param filterList
* @return
*/
public static ResultScanner getScanner(String tableName, String startRowKey, String endRowKey,FilterList filterList){
try {
Table table = connection.getTable(TableName.valueOf(tableName));
Scan scan = new Scan();
scan.setStartRow(Bytes.toBytes(startRowKey));
scan.setStopRow(Bytes.toBytes(endRowKey));
scan.setFilter(filterList);
return table.getScanner(scan);
} catch (IOException e) {
e.printStackTrace();
}
return null;
}
HBaseUtilsTest.java
@Test
public void getScannerWithStartEndRowFilter(){
FilterList filterList = new FilterList(FilterList.Operator.MUST_PASS_ALL);
SingleColumnValueFilter nameFilter = new SingleColumnValueFilter(Bytes.toBytes(STUDENT),
Bytes.toBytes("name"), CompareFilter.CompareOp.EQUAL, Bytes.toBytes("Tom"));
filterList.addFilter(nameFilter);
// 包含起始行,不包含结束行
ResultScanner scanner = HBaseUtils.getScanner(TABLE_NAME, "rowkey1", "rowkey2",filterList);
if(scanner != null){
scanner.forEach(result -> System.out.println(Bytes.toString(result.getRow())+"->"+Bytes.toString(result.getValue(Bytes.toBytes(STUDENT),Bytes.toBytes("name")))));
scanner.close();
}
}
按rowkey来删除行数据
HBaseUtils.java
/**
* 按rowKey来删除行数据
* @param tableName
* @param rowKey
* @return
*/
public static boolean deleteRow(String tableName, String rowKey){
try {
Table table = connection.getTable(TableName.valueOf(tableName));
Delete delete = new Delete(Bytes.toBytes(rowKey));
table.delete(delete);
} catch (IOException e) {
e.printStackTrace();
}
return true;
}
HBaseUtilsTest.java
@Test
public void deleteRow(){
boolean res = HBaseUtils.deleteRow(TABLE_NAME, "rowkey2");
System.out.println("删除结果:"+ res);
}
删除某行某列族某列的数据
HBaseUtils.java
/**
* 删除某行某列族某列的数据
* @param tableName
* @param rowKey
* @param familyName
* @param qualifier
* @return
*/
public static boolean deleteColumn(String tableName, String rowKey, String familyName, String qualifier){
try {
Table table = connection.getTable(TableName.valueOf(tableName));
Delete delete = new Delete(Bytes.toBytes(rowKey));
delete.addColumn(Bytes.toBytes(familyName), Bytes.toBytes(qualifier));
table.delete(delete);
table.close();
} catch (IOException e) {
e.printStackTrace();
}
return true;
}
HBaseUtilsTest.java
@Test
public void deleteColumn(){
boolean b = HBaseUtils.deleteColumn(TABLE_NAME, "rowkey1", STUDENT, "age");
System.out.println("删除结果:"+ b);
}
删除表
HBaseUtils.java
/**
* 删除表
* @param tableName
* @return
*/
public static boolean deleteTable(String tableName){
try {
HBaseAdmin admin = (HBaseAdmin) connection.getAdmin();
admin.disableTable(tableName);//禁用表
admin.deleteTable(tableName);//删除表
} catch (IOException e) {
e.printStackTrace();
}
return true;
}
HBaseUtilsTest.java
/**
* 测试删除表
*/
@Test
public void deleteTable(){
boolean res = HBaseUtils.deleteTable(TABLE_NAME);
System.out.println("删除结果:"+res);
}
参考:https://github.com/heibaiying/BigData-Notes/blob/master/notes/Hbase_Java_API.md
完成!enjoy it!