Hbase採用Java實現,其中 Java API 是原生支持的,其它編程語言接口需要通過 Thrift 協議支持。在HBase 官方代碼包里含有Java實現的原生訪問客戶端,相關的類在 org.apache.hadoop.hbase.client 包中,都是與 Hbase 數據存儲管理相關的 API。
基本操作有:HBase 的配置、HBase 表的管理、列族的管理、列的管理、數據操作等。
相關依賴
官方的Jar包在HBase 安裝目錄下的 lib 子目錄。但是一般還是使用Maven管理Jar依賴。主要用到hbase-client-x.x.x.jar和hbase-common-x.x.x.jar。
maven管理依賴,在項目的pom.xml加:
<dependency>
<groupId>org.apache.hbase</groupId>
<artifactId>hbase-client</artifactId>
<version>2.4.1</version>
</dependency>
<dependency>
<groupId>org.apache.hbase</groupId>
<artifactId>hbase-common</artifactId>
<version>2.4.1</version>
</dependency>導入的基本類有:
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hbase.*;
import org.apache.hadoop.hbase.client.*;
import org.apache.hadoop.hbase.util.Bytes;API的類
管理 Hbase,則用 Admin 接口來創建、刪除、更改表。數據的CRUD,則使用 Table 接口等。主要是Admin 和 Table 接 口以及 HBaseConfiguration、HTableDescriptor、HClounmDescriptor、Put、Get、Result、Scan 這些類。
- Admin、管理HBase數據庫的表信息的接口。
- HBaseConfiguration、Hbase的配置類。
- HTableDescriptor、表的描述類,包含了表的名字及其對應表的列族。
- HClounmDescriptor、列族描述類,維護着關於列族的信息,例如版本號,壓縮設置等。
- HTable、表的管理類,和HBase表直接通信。
- Put、數據新增修改管理類,對單個行執行添加操作。
- Get、數據獲取管理類,對單個行執行查詢操作。
- Result、結果類,存儲Get或者Scan操作後獲取表的單行值。
- Scan、限定查找類,對多個行執行查詢操作。
- ResultScanner、獲取scan值的接口類。
Java客戶端程序
- 建立連接,在分布式環境下,客戶端訪問 HBase 需要通過 ZooKeeper 的地址和端口來獲取當前活躍的 Master 和所需的 RegionServer 地址。在Hbase3.0+中,可以直接使用Master地址。
Configuration cf = HBaseConfiguration.create();
//默認也是2181
// configuration.set("hbase.zookeeper.property.clientPort", "2181");
cf.set("hbase.zookeeper.quorum", "10.0.3.71");
// v3.0可只配置master地址。
// cf.set("hbase.master", "10.0.3.71:16000");
Connection conn = ConnectionFactory.createConnection(cf);
//使用完後,需要關閉連接
void close();- 表操作,都是使用 Admin 接口,必須調用 Connection.getAdmin() 方法返回一個子對象。
String tablename = "TableName";
TableName tableName = TableName.valueOf(tablename);
Admin admin = conn.getAdmin();
//Admin常用的接口如下:
//表是否存在
boolean tableExists(TableName tableName);
//列出所有表
List<TableDescriptor> listTableDescriptors();
//刪除表,先禁用表,再刪除
void disableTable(TableName tableName);
void deleteTable(TableName tableName);
//啟用已禁用的表
void enableTable(TableName tableName);
//給表加字段
void addColumnFamily(TableName tableName, ColumnFamilyDescriptor columnFamily);
//創建表,需要指定列族
String columnname = "cf";
List<ColumnFamilyDescriptor> families = new ArrayList<>();
ColumnFamilyDescriptor cfDesc = ColumnFamilyDescriptorBuilder.newBuilder(columnname.getBytes()).build();
families.add(cfDesc);
TableDescriptor tabDesc = TableDescriptorBuilder.newBuilder(tableName).setColumnFamilies(families).build();
admin.createTable(tabDesc);
admin.getConnection().close();- 數據訪問,通過Table對象連接到Hbase進行操作。新增數據如下:
//需要先有Table與TableName實例
Table table = conn.getTable(tableName);
//一行,參數是rowKey
Put put = new Put ("rowKeyName".getBytes());
//加字段值:參數分別是列族,列,值
put.add("cfName".getBytes(),"colName".getBytes(),"value001".getBytes());
table.put(put);獲取單行數據如下:
Get get = new Get("rowKeyName".getBytes());
Result result = table.get(get);
//從結果中拿到單元值
for (Cell cell : result.rawCells()) {
//列族名 cell.getFamilyArray()
//列名 cell.getQualifierArray()
//值 cell.getValueArray()
s
}限定查找,可指定版本號、起始行號、終止行號、列族、列限定符、返回值的數量的上限等:
Scan scan = new Scan();
//可以指定scan參數:addColumn、setTimeRange、setBatch
ResultScanner resutScanner = table.getScanner(scan);
//拿到結果集
for(Result result: resutScanner){
//對結果進行列值提取 result.rawCells()
}客戶端連接時可能的報錯
- NoNode for /hbase/master master沒有正常啟動,將hbase的master節點重啟一下。
- Master is initializing master在zookeeper中的數據不正常,刪除後,重啟一下hbase。hdfs中的文件也要刪除一下。
原創文章,作者:投稿專員,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/250174.html
微信掃一掃
支付寶掃一掃