本篇文章講述用HBase Shell命令 和 HBase Java API 對HBase 服務(wù)器 進(jìn)行操作。在此之前需要對HBase的總體上有個大概的了解。比如說HBase服務(wù)器內(nèi)部由哪些主要部件構(gòu)成?HBase的內(nèi)部工作原理是什么?我想學(xué)習(xí)任何一項知識、技術(shù)的態(tài)度不能只是知道如何使用,對產(chǎn)品的內(nèi)部構(gòu)建一點都不去關(guān)心,那樣出了問題,很難讓你很快的找到答案,甚至我們希望最后能對該項技術(shù)的領(lǐng)悟出自己的心得,為我所用,借鑒該項技術(shù)其中的設(shè)計思想創(chuàng)造出自己的解決方案,更靈活的去應(yīng)對多變的計算場景與架構(gòu)設(shè)計。以我目前的對HBase的了解還不夠深入,將來不斷的學(xué)習(xí),我會把我所知道的點滴分享到這個Blog上。
先來看一下讀取一行記錄HBase是如何進(jìn)行工作的,首先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.' 命令列出你創(chuàng)建的所有表的詳細(xì)信息),從而獲取Region分布的信息。一旦Client獲取了這一行的位置信息,比如這一行屬于哪個Region,Client將會緩存這個信息并直接訪問HRegionServer。久而久之Client緩存的信息漸漸增多,即使不訪問.META.表也能知道去訪問哪個HRegionServer。HBase中包含兩種基本類型的文件,一種用于存儲WAL的log,另一種用于存儲具體的數(shù)據(jù),這些數(shù)據(jù)都通過DFS Client和分布式的文件系統(tǒng)HDFS進(jìn)行交互實現(xiàn)存儲。
如圖所示:
再來看看HBase的一些內(nèi)存實現(xiàn)原理:
* HMaster— HBase中僅有一個Master server。
* HRegionServer—負(fù)責(zé)多個HRegion使之能向client端提供服務(wù),在HBase cluster中會存在多個HRegionServer。
* ServerManager—負(fù)責(zé)管理Region server信息,如每個Region server的HServerInfo(這個對象包含HServerAddress和startCode),已load Region個數(shù),死亡的Region server列表
* RegionManager—負(fù)責(zé)將region分配到region server的具體工作,還監(jiān)視root和meta 這2個系統(tǒng)級的region狀態(tài)。
* RootScanner—定期掃描root region,以發(fā)現(xiàn)沒有分配的meta region。
* MetaScanner—定期掃描meta region,以發(fā)現(xiàn)沒有分配的user region。
HBase基本命令
下面我們再看看看HBase的一些基本操作命令,我列出了幾個常用的HBase Shell命令,如下:
名稱
|
命令表達(dá)式
|
創(chuàng)建表 | create '表名稱', '列名稱1','列名稱2','列名稱N' |
添加記錄 | put '表名稱', '行名稱', '列名稱:', '值' |
查看記錄 | get '表名稱', '行名稱' |
查看表中的記錄總數(shù) | count '表名稱' |
刪除記錄 | delete '表名' ,'行名稱' , '列名稱' |
刪除一張表 | 先要屏蔽該表,才能對該表進(jìn)行刪除,第一步 disable '表名稱' 第二步 drop '表名稱' |
查看所有記錄 | scan "表名稱" |
查看某個表某個列中所有數(shù)據(jù) | scan "表名稱" , ['列名稱:'] |
更新記錄 | 就是重寫一遍進(jìn)行覆蓋 |
如果你是一個新手隊HBase的一些命令還不算非常熟悉的話,你可以進(jìn)入 hbase 的shell 模式中你可以輸入 help 命令查看到你可以執(zhí)行的命令和對該命令的說明,例如對scan這個命令,help中不僅僅提到有這個命令,還詳細(xì)的說明了scan命令中可以使用的參數(shù)和作用,例如,根據(jù)列名稱查詢的方法和帶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服務(wù)器進(jìn)行操作
需要下列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);
}
/**
* 創(chuàng)建一張表
*/
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 .");
}
}
/**
* 添加一條數(shù)據(jù)
*/
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 .");
}
/**
* 顯示所有數(shù)據(jù)
*/
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();
}
}
}
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

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