HBase 相關API操練(二):Java API
一、HBase Java編程
(1)HBase是用Java語言編寫的,它支持Java編程;
(2)HBase支持CRUD操作:Create,Read,Update和Delete;
(3)Java API包含HBase Shell支持的所有功能,甚至更多;
(4)Java API是訪問HBase最快的一種方式。
二、HBase Java編程——程序設計步驟
第一步:創建一個Configuration對象
Configuration conf = HBaseConfiguration.create();
1)Configuration對象包含各種配置信息
第二步:構建一個HTable句柄
HTable table = new HTable(conf, tableName);
1)提供Configuration對象;
2)提供待訪問Table的名稱。
第三步:執行操作
table.getTableName();
1)執行put、get、delete、scan等操作
第四步:關閉HTable句柄
table.close();
1)將內存數據刷新到磁盤上去
2)釋放各種資源
三、HBase交互
與 HBase 集群進行交互,有很多種不同的方式可以選擇,如 Java API、REST、Thrift 等。下面我們以Java API為例介紹它們的用法。
Java API 交互
HBase、 與 Hadoop 一樣,都是用 java 編寫的,所以 HBase 對 java 支持是必需的,下面看看怎麽使用java 語言對 HBase 進行操作。Java API 核心類介紹如下。
1、 HBaseConfiguration 類
HBaseConfiguration 是每一個 HBase Client 都會使用到的對象,它代表 HBase 配置信息。有兩種構造方式。
public HBaseConfiguration() public HBaseConfiguration(final Configuration c)
默認構造方式會嘗試從 hbase-default.xml 和 HBase-site.xml 文件中讀取配置。如果CLASSPATH 沒有這兩個文件,就需要自己配置。
Configuration HBASE_CONFIG = new Configuration(); HBASE_CONFIG.set("hbase.ZooKeeper.quorum","zkServer"); //hbase 服務地址 HBASE_CONFIG.set("hbase.ZooKeeper.property.clientPort","2181"); //端口號 HBaseConfiguration cfg = new HBaseConfiguration(HBASE_CONFIG); //讀取配置文件
2、 創建表
創建表通過 HBaseAdmin 對象操作。HBaseAdmin 負責META 表信息的處理。HBaseAdmin 提供了 createTable 方法。
public void createTable(HTableDescriptor desc)
HTableDescriptor 表示表的 Schema,提供常用方法有以下兩個。
1)setMaxFileSize:指定最大 Region 的大小。
2)setMemStoreFlushSize:指定 MemStore Flush 到 HDFS 上的文件大小。
3、 增加 Family
使用 addFamily 方法實現 Family 的添加。
public void addFamily(final HColumnDescriptor family)
HColumnDescriptor 代表 Column 的 Schema,提供的常用方法有以下幾個。
1、setTimeToLive:指定最大的 TTL(單位是 ms),過期數據會被自動刪除。
2、setInMemory:指定是否放在內存中,對小表有用,可用於提高效率。默認關閉。
3、setBloomFilter:指定是否使用 BloomFilter,可提高隨機查詢效率。默認關閉。
4、setCompressionType:設定數據壓縮類型。默認無壓縮。
5、setMaxVersions:指定數據最大保存的版本個數。默認為3。
舉個簡單的例子,創建 4 個 Family 表,命令如下。
HBaseAdmin hAdmin = new HBaseAdmin(hbaseConfig); HTableDescriptor table = new HTableDescriptor(tableName); table.addFamily(new HColumnDescriptor("f1")); table.addFamily(new HColumnDescriptor("f2")); table.addFamily(new HColumnDescriptor("f3")); table.addFamily(new HColumnDescriptor("f4")); hAdmin.createTable(table);
4、 刪除表
刪除表也是通過 HBaseAdmin 來操作,刪除表之前首先要 disable 表。這是一個非常耗時的操作,所以不建議頻繁刪除表。
disableTable 和 deleteTable 分別用來執行 disable 和 delete 操作。使用方法如下。
HBaseAdmin hAdmin = new HBaseAdmin(hbaseConfig); if(hAdmin.tableExists(tableName)){ hAdmin.disableTable(tableName); hAdmin.deleteTable(tableName); }
5、查詢數據
查詢分為單條隨機查詢和批量查詢。單條查詢通過 Row Key 在Table 中查詢某一行的數據,HTable 提供了get 方法完成單條查詢。批量查詢通過制定一段 Row Key 的範圍來查詢,HTable 提供了 getScanner 方法完成批量查詢。
public Result get(final Get get) public ResultScanner getScanner(final Scan scan)
Get 對象包含一個 Get 查詢需要的信息,它的構造方法有兩種。
public Get(byte [] row) public Get(byte [] row,RowLock rowLock)
Row Lock 為了保證讀寫的原子性,可以傳遞一個已經存在 Row Lock,否則 HBase 會自動生成一個新的 Row Lock。
Scan 對象提供了默認構造函數,一般使用默認構造函數
1) Get 和 Scan 的常用方法有以下幾個。
addFamily/addColumn:指定需要的 Family 或者 Column,如果沒有調用任何 Family 或者 Column,會返回所有的 Column。
setMaxVersions:指定最大的版本個數。如果不帶任何參數調用 setMaxVersions,表示取所有的版本。如果不調用 setMaxVersions,只會取到最新的版本。
setTimeRange:指定最大的時間戳和最小的時間戳,只有在此範圍內的 Cell 才能被獲取。
setTimeStamp:指定時間戳。
setFilter:指定 Filter 過濾不需要的信息。
2) Scan 特有的方法如下。
setStartRow:指定開始的行。如果不調用,從表頭開始。
setStopRow:指定結束的行(不含此行)。
setBatch:指定最多返回的 Cell 數目。防止一行中有過多的數據,導致 OOM 錯誤。
3) Result 代表是一行的數據。常用方法有以下幾個。
getRow:返回 Row Key。
raw:返回所有的 KeyValue 數組。
getValue:按照 Column 來獲取 Cell 的值。
ResultScanner 是 Result 的一個容器,每次調用ResultScanner 的next 方法會返回Result。
public Result next() throws IOException; public Result [] next(int nbRows) throws IOException;
示例代碼如下。
Scan scan = new Scan(); scan.setMaxVersions(); ResultScanner ss = table.getScanner(scan); for(Result r:ss){ System.out.println(new String(r.getRow())); for(KeyValue kv:r.raw){ System.out.println(new String(kv.getColumn())); } }
6、 插入數據
HTable 通過 put 方法插入數據,可以傳遞單個 put 對象 或 List put 對象分別實現單條插入和批量插入。
public void put(final Put put) throws IOException public void put(final List< Put> puts) throws IOException
Put 提供3 種構造方式。
public Put(byte [] row) public Put(byte [] row) public Put(byte [] row,RowLock rowLock) public Put(Put putToCopy)
Put 常用的方法有以下幾個。
1)add:增加一個 Cell。
2)setTimeStamp:指定所有 Cell 默認的 timestamp,如果一個 Cell 沒有指定 timestamp,就會用到這個值。如果沒有調用,HBase 會將當前時間作為未指定 timestamp 的Cell 的 timestamp。
3)setWriteToWAL:WAL 是 Write Ahead Log 的縮寫,指的是 HBase 在插入操作前是否寫 Log。默認是打開,關掉會提高性能,但是如果系統出現故障(負責插入的Region Server 掛掉),數據可能會丟失。
另外 HTable 也有兩個方法會影響插入的性能。
1)setAutoFlash:AutoFlush 指的是在每次調用 HBase 的 Put 操作,是否提交到 HBase Server。默認是 true,每次會提交。如果此時是單條插入,就會有更多的I/O,從而降低其性能。
2)setWriteBufferSize:Write Buffer Size 在 AutoFlush 為false 的時候起作用,默認是 2MB,也就是插入數據超過 2MB,就會自動提交到 Server。
示例代碼如下。
HTable table = new HTable(hbaseConfig, tableName); table.setAutoFlush(autoFlush); List< Put> lp = new ArrayList< Put>(); int count = 10000; byte[] buffer = new byte[1024]; Random r = new Random(); for(int i = 1;i <= count;++i){ Put p = new Put(String.format("row%09d",i).getBytes()); r.nextBytes(buffer); p.add("f1".getBytes(), null, buffer); p.add("f2".getBytes(), null, buffer); p.add("f3".getBytes(), null, buffer); p.add("f4".getBytes(), null, buffer); p.setWriteToWAL(wal); lp.add(p); if(i%1000==0){ table.put(lp); lp.clear(); } }
7、 刪除數據
HTable 通過 delete 方法刪除數據。
public void delete(final Delete delete)
Delete 構造方法如下。
public Delete(byte [] row) public Delete(byte [] row, long timestamp, RowLock rowLock) public Delete(final Delete d)
Delete 常用方法有 deleteFamily/deleteColumn,用來指定要刪除的 Family 或者 Column 的數據。 如果不調用任何這樣的方法,將會刪除整行。
註意: 如果某個 Cell 的 timestamp 高於當前時間,這個 Cell 將不會被刪除,仍然可以查出來。
示例代碼如下。
HTable table = new HTable(hbaseConfig,"mytest"); Delete d = new Delete("row1".getBytes()); table.delete(d)
8、 切分表
HBaseAdmin 提供 split 方法將 table 進行切分。
public void split(final String tableNameOrRegionName)
如果提供的是 tableName,會將 table 所有 Region 進行切分;如果提供的是 RegionName,只會切分這個Region。Split 是一個異步操作,因此它並不能確切控制 Region 的個數。
示例代碼如下。
public void split(String tableName,int number,int timeout) throws Exception{ Configuration HBASE_CONFIG = new Configuration(); HBASE_CONFIG.set("hbase.ZooKeeper.quorum",GlobalConf.ZOOKEEPER_QUORUM); HBaseConfiguration cfg = new HBaseConfiguration(HBASE_CONFIG); HBaseAdmin hAdmin = new HBaseAdmin(cfg); HTable hTable = new HTable(cfg,tableName); int oldsize = 0; long time = System.currentTimeMillis(); while(true){ int size = hTable.getRegionsInfo().size(); logger.info("the region number="+size); if(size>=number) break; if(size !=oldsize){ hAdmin.split(hTable.getTableName()); oldsize = size; }else if(System.currentTimeMillis()-time>timeout){ break; } Thread.sleep(1000*10); } }
以上就是博主為大家介紹的這一板塊的主要內容,這都是博主自己的學習過程,希望能給大家帶來一定的指導作用,有用的還望大家點個支持,如果對你沒用也望包涵,有錯誤煩請指出。如有期待可關註博主以第一時間獲取更新哦,謝謝!
HBase 相關API操練(二):Java API