HBase的JAVA API操作詳解

Thinkgamer_gyt發表於2015-08-18

其中用到的eclipse快捷鍵:
Alt+/   程式碼助手完成一些程式碼的插入,自動顯示提示資訊 
Alt+↓   當前行和下面一行互動位置(特別實用,可以省去先剪下,再貼上了)
Alt+↑   當前行和上面一行互動位置(同上)
Alt+←   前一個編輯的頁面 
Alt+→   下一個編輯的頁面(當然是針對上面那條來說了)
Alt+Shift+M   抽取方法
Alt+Shift+L   抽取本地變數 
Ctrl+1        快速修復 
一: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, boolean defaultValue) 獲取為boolean型別的屬性值,如果其屬性值型別部位boolean,則返回預設屬性值
void set(String name, String value) 通過屬性名來設定值
void setBoolean(String name, boolean value) 設定boolean型別的屬性值
用法示例:

  1. HBaseConfiguration hconfig = new HBaseConfiguration();
  2. 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(HBaseConfiguration conf) 靜態函式,檢視HBase是否處於執行狀態
createTable(HTableDescriptor desc) 建立一個表,同步操作
deleteTable(byte[] tableName) 刪除一個已經存在的表
enableTable(byte[] tableName) 使表處於有效狀態
disableTable(byte[] tableName) 使表處於無效狀態
HTableDescriptor[] listTables() 列出所有使用者控制元件表項
void modifyTable(byte[] tableName, HTableDescriptor htd) 修改表的模式,是非同步的操作,可能需要花費一定的時間
boolean tableExists(String tableName) 檢查表是否存在
用法示例:

  1. HBaseAdmin admin = new HBaseAdmin(config);
  2. admin.disableTable("tablename")
複製程式碼


三、HTableDescriptor
關係:org.apache.hadoop.hbase.HTableDescriptor
作用:包含了表的名字極其對應表的列族
返回值 函式 描述
void addFamily(HColumnDescriptor) 新增一個列族
HColumnDescriptor removeFamily(byte[] column) 移除一個列族
byte[] getName() 獲取表的名字
byte[] getValue(byte[] key) 獲取屬性的值
void setValue(String key, String value) 設定屬性的值
用法示例:

  1. HTableDescriptor htd = new HTableDescriptor(table);
  2. 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) 設定對應屬性的值
用法示例:

  1. HTableDescriptor htd = new HTableDescriptor(tablename);
  2. HColumnDescriptor col = new HColumnDescriptor("content:");
  3. 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() 獲取當前一開啟的表每個區域的結束鍵值
ResultScanner getScanner(byte[] family) 獲取當前給定列族的scanner例項
HTableDescriptor getTableDescriptor() 獲取當前表的HTableDescriptor例項
byte[] getTableName() 獲取表名
static boolean isTableEnabled(HBaseConfiguration conf, String tableName) 檢查表是否有效
void put(Put put) 向表中新增值
用法示例:

  1. HTable table = new HTable(conf, Bytes.toBytes(tablename));
  2. 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例項的行
RowLock getRowLock() 獲取Put例項的行鎖
long getTimeStamp() 獲取Put例項的時間戳
boolean isEmpty() 檢查familyMap是否為空
Put setTimeStamp(long timeStamp) 設定Put例項的時間戳
用法示例:

  1. HTable table = new HTable(conf,Bytes.toBytes(tablename));
  2. Put p = new Put(brow);//為指定行建立一個Put操作
  3. p.add(family,qualifier,value);
  4. table.put(p);
複製程式碼


七、Get
關係:org.apache.hadoop.hbase.client.Get
作用:用來獲取單個行的相關資訊
返回值 函式 描述
Get addColumn(byte[] family, byte[] qualifier) 獲取指定列族和列修飾符對應的列
Get addFamily(byte[] family) 通過指定的列族獲取其對應列的所有列
Get setTimeRange(long minStamp,long maxStamp) 獲取指定取件的列的版本號
Get setFilter(Filter filter) 當執行Get操作時設定伺服器端的過濾器
用法示例:

  1. HTable table = new HTable(conf, Bytes.toBytes(tablename));
  2. Get g = new Get(Bytes.toBytes(row));
複製程式碼


八、Result
關係:org.apache.hadoop.hbase.client.Result
作用:儲存Get或者Scan操作後獲取表的單行值。使用此類提供的方法可以直接獲取值或者各種Map結構(key-value對)
返回值 函式 描述
boolean containsColumn(byte[] family, byte[] qualifier) 檢查指定的列是否存在
NavigableMap<byte[],byte[]> getFamilyMap(byte[] family) 獲取對應列族所包含的修飾符與值的鍵值對
byte[] getValue(byte[] family, byte[] qualifier) 獲取對應列的最新值


九、ResultScanner
關係:Interface
作用:客戶端獲取值的介面
返回值 函式 描述
void close() 關閉scanner並釋放分配給它的資源
Result next() 獲取下一行的值

二:程式碼草操作例項
package Hbase;

import java.io.IOException;
import java.io.InterruptedIOException;
import java.util.List;

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.Get;
import org.apache.hadoop.hbase.client.HBaseAdmin;
import org.apache.hadoop.hbase.client.HTable;
import org.apache.hadoop.hbase.client.Put;
import org.apache.hadoop.hbase.client.Result;
import org.apache.hadoop.hbase.client.ResultScanner;
import org.apache.hadoop.hbase.client.RetriesExhaustedWithDetailsException;
import org.apache.hadoop.hbase.client.Scan;

public class test {
	private static final String Table_NAME =  "table1";         //表名稱
	private static final String FAMILY_NAME =  "family1"; //列族名稱
	private static final String ROW_KEY = "rowkey1";     //建立行健

	//建立,插入,查詢記錄,遍歷表,刪除表
	public static void main(String[] args) throws Exception {
            Configuration conf=  HBaseConfiguration.create();
            conf.set("hbase.rootdir","hdfs://localhost:9000/hbase");  //設定hbase再hdfs中的目錄
            conf.set("hbase.zookeeper.quorum", "localhost");        //使用zookeeper來進行定位
            //建立刪除表使用HBaseAdmin
            HBaseAdmin hBaseAdmin = new HBaseAdmin(conf);
            createTable(hBaseAdmin);            //建立表
            
            //插入記錄,查詢一條記錄,遍歷所有的記錄Table
             final HTable hTable = new HTable(conf, Table_NAME);
			 putRecord(hTable);         //插入一條記錄
             getRecord(hTable);         //查詢一條記錄
             scanTable(hTable);             //遍歷所有的表的記錄
             hTable.close();          //關閉表
            //deleteTable(hBaseAdmin);              //刪除表
            }

	private static void scanTable(final HTable hTable) throws IOException {
		Scan scan = new Scan();
		 final ResultScanner scanner = hTable.getScanner(scan);
		 for (Result result : scanner) {
			 final byte[] value = result.getValue(FAMILY_NAME.getBytes()	, "age".getBytes());
			 System.out.println(result+"\t" + new String(value));
		}
	}

	private static void getRecord(final HTable hTable) throws IOException {
		Get get = new Get(ROW_KEY.getBytes());
		 final Result result = hTable.get(get );
		 final byte[] value = result.getValue(FAMILY_NAME.getBytes()	, "age".getBytes());
		 System.out.println(result+"\t" + new String(value));
	}

	private static void putRecord(HTable hTable) throws InterruptedIOException,
			RetriesExhaustedWithDetailsException {
		Put put = new Put(ROW_KEY.getBytes());        //宣告物件
		 put.add(FAMILY_NAME .getBytes(), "age".getBytes(),"	12".getBytes());   //新增記錄
		 hTable.put(put );    //插入
	}

	private static void deleteTable(HBaseAdmin hBaseAdmin) throws IOException {
		hBaseAdmin.disableTable(Table_NAME);        //關閉表
		hBaseAdmin.deleteTable(Table_NAME);       //刪除表
	}

	private static void createTable(HBaseAdmin hBaseAdmin) throws IOException {
		if (!hBaseAdmin.tableExists(Table_NAME)){
			HTableDescriptor tableDescriptor = new HTableDescriptor(Table_NAME);    //宣告一個表
			HColumnDescriptor family = new HColumnDescriptor(FAMILY_NAME);       //宣告一個列族
			tableDescriptor.addFamily(family );                                      //新增列族
			hBaseAdmin.createTable(tableDescriptor );                                 //建立表
		}
	}

}

相關文章