HBase編程實例

jopen 10年前發布 | 24K 次閱讀 HBase NoSQL數據庫

在前文中安裝了Hbase,通過Hbase shell可以進行一些操作,但是和實際的編程實例聯系起來不方便,因此本文介紹有關Hbase編程的實例。

摘要:在前文中安裝了Hbase,通過Hbase shell可以進行一些操作,但是和實際的編程實例聯系起來不方便,因此本文介紹有關Hbase編程的實例。

 

一、使用Eclipse開發HBase應用程序

1,在Eclipse中新建一個Java Project,命名為HBaseTest,然后右鍵Properties中選擇Java Build Path,選擇Add External Jars,將HBase/lib目錄下的jar包導入進來。

2,在工程根目錄下創建Conf文件夾,將HBase/Conf下的hbase-site.xml文件復制到該文件夾中,通過右鍵選擇Properties->Java BuildPath->Libraries->Add Class Folder,然后選擇Conf文件夾即可。

 

二、簡要介紹HBaseJava API

1,  HbaseConfiguration

關系:org.apache.hadoop.hbase.HBaseConfiguration

作用:通過此類可以對HBase進行配置

      

2,  HBaseAdmin

         關系:org.apache.hadoop.hbase.client.HBaseAdmin

         作用:提供一個接口來管理HBase數據庫中的表信息。它提供創建表、刪除表等方法。

 

3,  HTableDescriptor

         關系:org.apache.hadoop.hbase.client.HTableDescriptor

          作用:包含了表的名字及其對應列族。 提供的方法有

        void          addFamily(HColumnDescriptor)          添加一個列族

        HColumnDescriptor   removeFamily(byte[] column)      移除一個列族

        byte[]              getName()                     獲取表的名字

        byte[]              getValue(byte[] key)              獲取屬性的值

        void                setValue(String key,Stringvalue)    設置屬性的值

 

4,  HColumnDescriptor

        關系:org.apache.hadoop.hbase.client.HColumnDescriptor

        作用:維護關于列的信息。提供的方法有

        byte[]              getName()                   獲取列族的名字

        byte[]              getValue()                獲取對應的屬性的值

        void              setValue(String key,String value)設置對應屬性的值

 

5,  HTable

        關系:org.apache.hadoop.hbase.client.HTable

作用:用戶與HBase表進行通信。此方法對于更新操作來說是非線程安全的,如果啟動多個線程嘗試與單個HTable實例進行通信,那么寫緩沖器可能會崩潰。

 

6,  Put

        關系:org.apache.hadoop.hbase.client.Put

        作用:用于對單個行執行添加操作

7,  Get

        關系:org.apache.hadoop.hbase.client.Get

        作用:用于獲取單個行的相關信息

8,  Result

        關系:org.apache.hadoop.hbase.client.Result

        作用:存儲Get或Scan操作后獲取的單行值。

9,  ResultScanner

        關系:Interface

        作用:客戶端獲取值的接口。

 

三、 HBase Java API簡單實例

 

import java.io.IOException;

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.client.HBaseAdmin;
import org.apache.hadoop.hbase.client.HTable;
import org.apache.hadoop.hbase.client.Put;
import org.apache.hadoop.hbase.client.Get;
import org.apache.hadoop.hbase.client.Result;
import org.apache.hadoop.hbase.client.ResultScanner;
import org.apache.hadoop.hbase.client.Scan;
import org.apache.hadoop.hbase.util.Bytes;
/*
 * @author minglaihan
 */

public class HBaseTest {

    static Configuration cfg = HBaseConfiguration.create();

    //通過HBaseAdmin HTableDescriptor來創建一個新表
    public static void create(String tableName, String columnFamily) throws Exception{
        HBaseAdmin admin = new HBaseAdmin(cfg);
        if(admin.tableExists(tableName)){
            System.out.println("Table exist");
            System.exit(0);
        }
        else {
            HTableDescriptor tableDescriptor = new HTableDescriptor(tableName);
            tableDescriptor.addFamily(new HColumnDescriptor(columnFamily));
            admin.createTable(tableDescriptor);
            System.out.println("Table create success");
        }
    }

    //添加一條數據,通過HTable Put為已存在的表添加數據
    public static void put(String tableName,String row,String columnFamily,String column,String data) throws IOException{
        HTable table = new HTable(cfg, tableName);
        Put put = new Put(Bytes.toBytes(row));
        put.add(Bytes.toBytes(columnFamily),Bytes.toBytes(column),Bytes.toBytes(data));
        table.put(put);
        System.out.println("put success");
    }

    //獲取tableName表里列為row的結果集
    public static void get(String tableName,String row) throws IOException{
        HTable table = new HTable(cfg, tableName);
        Get get = new Get(Bytes.toBytes(row));
        Result result = table.get(get);
        System.out.println("get "+ result);   
    }

    //通過HTable Scan來獲取tableName表的所有數據信息
    public static void scan (String tableName) throws IOException{
        HTable table = new HTable(cfg, tableName);
        Scan scan = new Scan();
        ResultScanner resultScanner = table.getScanner(scan);
        for(Result s:resultScanner){
            System.out.println("Scan "+ resultScanner);
        }
    }

    public static boolean delete(String tableName) throws Exception{
        HBaseAdmin admin = new HBaseAdmin(cfg);
        if(admin.tableExists(tableName)){
            try {
                admin.disableTable(tableName);
                admin.deleteTable(tableName);
            } catch (Exception e) {
                // TODO: handle exception
                e.printStackTrace();
                return false;
            }
        }
        return true;
    }

    public static void main(String[] args) {
        String tableName = "hbase_test";
        String columnFamily = "c1";

        try {
            HBaseTest.create(tableName, columnFamily);
            HBaseTest.put(tableName, "row1", columnFamily, "column1", "data1");
            HBaseTest.get(tableName, "row1");
            HBaseTest.scan(tableName);
            if(HBaseTest.delete(tableName)==true){
                System.out.println("delete table "+ tableName+"success");
            }

        } catch (Exception e) {
            // TODO: handle exception
            e.printStackTrace();
        }
    }
}

 

將Delete的步驟注釋掉的運行結果截圖:

 HBase編程實例

HBase編程實例

 

四、總結

       HBase與Java API的交互目前表現良好,在今后的hadoop編程中,可以根據HBase的情況適當利用,提高整體水平。

來自: http://www.ming-yue.cn/hbase-program-examples/

 

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!