本篇文章講述用HBase Shell命令 和 HBase Java API 對HBase 服務器 進行操作。在此之前需要對HBase的總體上有個大概的了解。比如說HBase服務器內部由哪些主要部件構成?HBase的內部工作原理是什么?我想學習任何一項知識、技術的態度不能只是知道如何使用,對產品的內部構建一點都不去關心,那樣出了問題,很難讓你很快的找到答案,甚至我們希望最后能對該項技術的領悟出自己的心得,為我所用,借鑒該項技術其中的設計思想創造出自己的解決方案,更靈活的去應對多變的計算場景與架構設計。以我目前的對HBase的了解還不夠深入,將來不斷的學習,我會把我所知道的點滴分享到這個Blog上。
先來看一下讀取一行記錄HBase是如何進行工作的,首先HBase Client端會連接Zookeeper Qurom (從下面的代碼也能看出來,例如:HBASE_CONFIG.set("hbase.zookeeper.quorum", "192.168.50.216") )。通過Zookeeper組件Client能獲知哪個Server管理-ROOT- Region。那么Client就去訪問管理-ROOT-的Server,在META中記錄了HBase中所有表信息,(你可以使用 scan '.META.' 命令列出你創建的所有表的詳細信息),從而獲取Region分布的信息。一旦Client獲取了這一行的位置信息,比如這一行屬于哪個Region,Client將會緩存這個信息并直接訪問HRegionServer。久而久之Client緩存的信息漸漸增多,即使不訪問.META.表也能知道去訪問哪個HRegionServer。HBase中包含兩種基本類型的文件,一種用于存儲WAL的log,另一種用于存儲具體的數據,這些數據都通過DFS Client和分布式的文件系統HDFS進行交互實現存儲。
如圖所示:
再來看看HBase的一些內存實現原理:
* HMaster— HBase中僅有一個Master server。
* HRegionServer—負責多個HRegion使之能向client端提供服務,在HBase cluster中會存在多個HRegionServer。
* ServerManager—負責管理Region server信息,如每個Region server的HServerInfo(這個對象包含HServerAddress和startCode),已load Region個數,死亡的Region server列表
* RegionManager—負責將region分配到region server的具體工作,還監視root和meta 這2個系統級的region狀態。
* RootScanner—定期掃描root region,以發現沒有分配的meta region。
* MetaScanner—定期掃描meta region,以發現沒有分配的user region。
HBase基本命令
下面我們再看看看HBase的一些基本操作命令,我列出了幾個常用的HBase Shell命令,如下:
名稱
|
命令表達式
|
創建表 | create '表名稱', '列名稱1','列名稱2','列名稱N' |
添加記錄 | put '表名稱', '行名稱', '列名稱:', '值' |
查看記錄 | get '表名稱', '行名稱' |
查看表中的記錄總數 | count '表名稱' |
刪除記錄 | delete '表名' ,'行名稱' , '列名稱' |
刪除一張表 | 先要屏蔽該表,才能對該表進行刪除,第一步 disable '表名稱' 第二步 drop '表名稱' |
查看所有記錄 | scan "表名稱" |
查看某個表某個列中所有數據 | scan "表名稱" , ['列名稱:'] |
更新記錄 | 就是重寫一遍進行覆蓋 |
如果你是一個新手隊HBase的一些命令還不算非常熟悉的話,你可以進入 hbase 的shell 模式中你可以輸入 help 命令查看到你可以執行的命令和對該命令的說明,例如對scan這個命令,help中不僅僅提到有這個命令,還詳細的說明了scan命令中可以使用的參數和作用,例如,根據列名稱查詢的方法和帶LIMIT 、STARTROW的使用方法:
scan Scan a table; pass table name and optionally a dictionary of scanner specifications. Scanner specifications may include one or more of the following: LIMIT, STARTROW, STOPROW, TIMESTAMP, or COLUMNS. If no columns are specified, all columns will be scanned. To scan all members of a column family, leave the qualifier empty as in 'col_family:'. Examples:
hbase> scan '.META.'
hbase> scan '.META.', {COLUMNS => 'info:regioninfo'}
hbase> scan 't1', {COLUMNS => ['c1', 'c2'], LIMIT => 10, STARTROW => 'xyz'}
使用Java API對HBase服務器進行操作
需要下列jar包
hbase-0.20.6.jar
hadoop-core-0.20.1.jar
commons-logging-1.1.1.jar
zookeeper-3.3.0.jar
log4j-1.2.91.jar
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.HBaseAdmin;
import org.apache.hadoop.hbase.client.HTable;
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.io.BatchUpdate;
@SuppressWarnings("deprecation")
public class HBaseTestCase {
static HBaseConfiguration cfg = null;
static {
Configuration HBASE_CONFIG = new Configuration();
HBASE_CONFIG.set("hbase.zookeeper.quorum", "192.168.50.216");
HBASE_CONFIG.set("hbase.zookeeper.property.clientPort", "2181");
cfg = new HBaseConfiguration(HBASE_CONFIG);
}
/**
* 創建一張表
*/
public static void creatTable(String tablename) throws Exception {
HBaseAdmin admin = new HBaseAdmin(cfg);
if (admin.tableExists(tablename)) {
System.out.println("table Exists!!!");
}
else{
HTableDescriptor tableDesc = new HTableDescriptor(tablename);
tableDesc.addFamily(new HColumnDescriptor("name:"));
admin.createTable(tableDesc);
System.out.println("create table ok .");
}
}
/**
* 添加一條數據
*/
public static void addData (String tablename) throws Exception{
HTable table = new HTable(cfg, tablename);
BatchUpdate update = new BatchUpdate("Huangyi");
update.put("name:java", "http://www.javabloger.com".getBytes());
table.commit(update);
System.out.println("add data ok .");
}
/**
* 顯示所有數據
*/
public static void getAllData (String tablename) throws Exception{
HTable table = new HTable(cfg, tablename);
Scan s = new Scan();
ResultScanner ss = table.getScanner(s);
for(Result r:ss){
for(KeyValue kv:r.raw()){
System.out.print(new String(kv.getColumn()));
System.out.println(new String(kv.getValue() ));
}
}
}
public static void main (String [] agrs) {
try {
String tablename="tablename";
HBaseTestCase.creatTable(tablename);
HBaseTestCase.addData(tablename);
HBaseTestCase.getAllData(tablename);
}
catch (Exception e) {
e.printStackTrace();
}
}
}
更多文章、技術交流、商務合作、聯系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號聯系: 360901061
您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對您有幫助就好】元
