HBase 相關API操練(二):Java API

來源:互聯網
上載者:User

標籤:IV   scan   default   oba   nbsp   copy   htable   隨機查詢   樣本   

一、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 IOExceptionpublic 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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.