摘要:在前文中安裝了Hbase,經過Hbase shell能夠進行一些操做,可是和實際的編程實例聯繫起來不方便,所以本文介紹有關Hbase編程的實例。java
1,在Eclipse中新建一個Java Project,命名爲HBaseTest,而後右鍵Properties中選擇Java Build Path,選擇Add External Jars,將HBase/lib目錄下的jar包導入進來。shell
2,在工程根目錄下建立Conf文件夾,將HBase/Conf下的hbase-site.xml文件複製到該文件夾中,經過右鍵選擇Properties->Java BuildPath->Libraries->Add Class Folder,而後選擇Conf文件夾便可。數據庫
1, HbaseConfigurationapache
關係:org.apache.hadoop.hbase.HBaseConfiguration編程
做用:經過此類能夠對HBase進行配置安全
2, HBaseAdminoop
關係:org.apache.hadoop.hbase.client.HBaseAdminui
做用:提供一個接口來管理HBase數據庫中的表信息。它提供建立表、刪除表等方法。spa
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
做用:客戶端獲取值的接口。
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與Java API的交互目前表現良好,在從此的hadoop編程中,能夠根據HBase的狀況適當利用,提升總體水平。