Hadoop生態(tài)系統(tǒng)及開(kāi)發(fā) 實(shí)訓(xùn)手冊(cè) 實(shí)訓(xùn)8 HBase的API實(shí)戰(zhàn)_第1頁(yè)
Hadoop生態(tài)系統(tǒng)及開(kāi)發(fā) 實(shí)訓(xùn)手冊(cè) 實(shí)訓(xùn)8 HBase的API實(shí)戰(zhàn)_第2頁(yè)
Hadoop生態(tài)系統(tǒng)及開(kāi)發(fā) 實(shí)訓(xùn)手冊(cè) 實(shí)訓(xùn)8 HBase的API實(shí)戰(zhàn)_第3頁(yè)
Hadoop生態(tài)系統(tǒng)及開(kāi)發(fā) 實(shí)訓(xùn)手冊(cè) 實(shí)訓(xùn)8 HBase的API實(shí)戰(zhàn)_第4頁(yè)
Hadoop生態(tài)系統(tǒng)及開(kāi)發(fā) 實(shí)訓(xùn)手冊(cè) 實(shí)訓(xùn)8 HBase的API實(shí)戰(zhàn)_第5頁(yè)
已閱讀5頁(yè),還剩5頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

實(shí)訓(xùn)4.3HBase的API實(shí)戰(zhàn)1.實(shí)訓(xùn)目的認(rèn)識(shí)HBaseJavaAPI并且學(xué)會(huì)簡(jiǎn)單的使用,編程實(shí)現(xiàn)Java連接HBase,編程實(shí)現(xiàn)Java操作HBase表,進(jìn)行數(shù)據(jù)的增刪改查。2.實(shí)訓(xùn)內(nèi)容(1)Java編程實(shí)現(xiàn)連接HBase(2)Java編程實(shí)現(xiàn)對(duì)HBase表的基本操作3.實(shí)訓(xùn)要求以小組為單元進(jìn)行實(shí)訓(xùn),每小組5人,小組自協(xié)商選一位組長(zhǎng),由組長(zhǎng)安排和分配實(shí)訓(xùn)任務(wù),具體參考實(shí)訓(xùn)操作環(huán)節(jié)。需要確保HDFS、ZooKeeper與HBase等環(huán)境安裝正確。4.準(zhǔn)備知識(shí)(1)HBase的API說(shuō)明①HBase采用Java實(shí)現(xiàn),原生客戶端也是Java實(shí)現(xiàn),其他語(yǔ)言需要通過(guò)thrift接口服務(wù)間接訪問(wèn)HBase的數(shù)據(jù)。②HBase作為大數(shù)據(jù)存儲(chǔ)數(shù)據(jù)庫(kù),其寫能力非常強(qiáng),加上HBase本身就脫胎于Hadoop,所以和Hadoop的兼容性極好。(2)HBaseJavaAPI介紹幾個(gè)主要HBaseAPI類和數(shù)據(jù)模型之間的對(duì)應(yīng)關(guān)系如表4-7所示。表4-7API類和數(shù)據(jù)模型之間的關(guān)系java類HBase數(shù)據(jù)模型HBaseAdmin數(shù)據(jù)庫(kù)(DataBase)HBaseConfigurationHTable表(Table)HTableDescriptor列族(ColumnFamily)Put列修飾符(ColumnQualifier)GetScanner①HBaseAdmin關(guān)系:org.apache.hadoop.HBase.client.HBaseAdmin作用:提供了一個(gè)接口來(lái)管理HBase數(shù)據(jù)庫(kù)的表信息。它提供的方法包括:創(chuàng)建表,刪除表,列出表項(xiàng),使表有效或無(wú)效,以及添加或刪除表列族成員等。它的返回值、函數(shù)和描述信息如表4-8所示。表4-8返回值、函數(shù)和描述信息返回值函數(shù)描述voidaddColumn(StringtableName,HColumnDescriptorcolumn)向一個(gè)已經(jīng)存在的表添加列checkHBaseAvailable(HBaseConfigurationconf)靜態(tài)函數(shù),查看HBase是否處于運(yùn)行狀態(tài)createTable(HTableDescriptordesc)創(chuàng)建一個(gè)表,同步操作deleteTable(byte[]tableName)刪除一個(gè)已經(jīng)存在的表enableTable(byte[]tableName)使表處于有效狀態(tài)disableTable(byte[]tableName)使表處于無(wú)效狀態(tài)HTableDescriptor[]listTables()列出所有用戶控件表項(xiàng)voidmodifyTable(byte[]tableName,HTableDescriptorhtd)修改表的模式,是異步的操作,可能需要花費(fèi)一定的時(shí)間booleantableExists(StringtableName)檢查表是否存在用法用例:HBaseAdminadmin=newHBaseAdmin(config);admin.disableTable("tablename")②HBaseConfiguration關(guān)系:org.apache.hadoop.HBase.HBaseConfiguration作用:對(duì)HBase進(jìn)行配置。它的返回值、函數(shù)和描述信息如表4-9所示。表4-9返回值、函數(shù)和描述信息返回值函數(shù)描述voidaddResource(Pathfile)通過(guò)給定的路徑所指的文件來(lái)添加資源voidclear()清空所有已設(shè)置的屬性stringget(Stringname)獲取屬性名對(duì)應(yīng)的值StringgetBoolean(Stringname,boolean獲取為boolean類型的屬性值,如果其屬性值類型部位boolean,則返回默認(rèn)屬性值voidset(Stringname,Stringvalue)通過(guò)屬性名來(lái)設(shè)置值voidsetBoolean(Stringname,boolean設(shè)置boolean類型的屬性值用法用例:HBaseConfigurationhconfig=newHBaseConfiguration();hconfig.set("perty.clientPort","2181");該方法設(shè)置了"perty.clientPort"的端口號(hào)為2181。一般情況下,HBaseConfiguration會(huì)使用構(gòu)造函數(shù)進(jìn)行初始化,然后在使用其他方法。③HTableDescriptor關(guān)系:org.apache.hadoop.HBase.HTableDescriptor作用:包含了表的名字極其對(duì)應(yīng)表的列族。它的返回值、函數(shù)和描述信息如表4-10所示。表4-10返回值、函數(shù)和描述信息返回值函數(shù)描述voidaddFamily(HColumnDescriptor)添加一個(gè)列族HColumnDescriptorremoveFamily(byte[]column)移除一個(gè)列族byte[]getName()獲取表的名字byte[]getvalue(byte[]key)獲取屬性的值voidsetValue(Stringkey,Stringvalue)設(shè)置屬性的值用法用例:HTableDescriptorhtd=newHTableDescriptor(table);htd.addFamily(newHcolumnDescriptor("family"));在上述例子中,通過(guò)一個(gè)HColumnDescriptor實(shí)例,為HTableDescriptor添加了一個(gè)列族:family,該方法設(shè)置了"perty.clientPort"的端口號(hào)為2181。一般情況下,HBaseConfiguration會(huì)使用構(gòu)造函數(shù)進(jìn)行初始化,然后在使用其他方法。④HColumnDescriptor關(guān)系:org.apache.hadoop.HBase.HColumnDescriptor作用:維護(hù)著關(guān)于列族的信息,例如版本號(hào),壓縮設(shè)置等。它通常在創(chuàng)建表或者為表添加列族的時(shí)候使用。列族被創(chuàng)建后不能直接修改,只能通過(guò)刪除然后重新創(chuàng)建的方式。列族被刪除的時(shí)候,列族里面的數(shù)據(jù)也會(huì)同時(shí)被刪除。它的返回值、函數(shù)和描述信息如表4-11所示。表4-11返回值、函數(shù)和描述信息返回值函數(shù)描述byte[]getName()獲取列族的名字byte[]getValue(byte[]key)獲取對(duì)應(yīng)的屬性的值voidsetvalue(Stringkey,Stringvalue)設(shè)置對(duì)應(yīng)屬性的值用法用例:HTableDescriptorhtd=newHTableDescriptor(tablename);HColumnDescriptorcol=newHColumnDescriptor("content:");htd.addFamily(col);此例添加了一個(gè)content的列族。⑤HTable關(guān)系:org.apache.hadoop.HBase.client.HTable作用:可以用來(lái)和HBase的表直接通信。此方法對(duì)于更新操作來(lái)說(shuō)是非線程安全的。它的返回值、函數(shù)和描述信息如表4-12所示。表4-12返回值、函數(shù)和描述信息返回值函數(shù)描述voidcheckAdnPut(byte[]row,byte[]family,自動(dòng)的檢查row/family/qualifier是否與給定的值匹配voidclose()釋放所有的資源或掛起內(nèi)部緩沖區(qū)中的更新Booleanexists(Getget)檢查Get實(shí)例所指定的值是否存在于HTable的列中Resultget(Getget)獲取指定行的某些單元格所對(duì)應(yīng)的值byte[][]getEndKeys()獲取當(dāng)前一打開(kāi)的表每個(gè)區(qū)域的結(jié)束鍵值ResultScannergetScanner(byte[]family)獲取當(dāng)前給定列族的scanner實(shí)例HTableDescriptogetTableDescriptor()獲取當(dāng)前表的HTableDescriptor實(shí)例byte[]getTableName()獲取表名staticbooleanisTableEnabled(HBaseConfigurationconf,StringtableName)檢查表是否有效voidput(Putput)向表中添加值用法用例:HTabletable=newHTable(conf,Bytes.toBytes(tablename));ResultScannerscanner=table.getScanner(family);⑥Put關(guān)系:org.apache.hadoop.HBase.client.Put作用:用來(lái)對(duì)單個(gè)行執(zhí)行添加操作它的返回值、函數(shù)和描述信息如表4-13所示。圖表4-13返回值、函數(shù)和描述信息返回值函數(shù)描述Putadd(byte[]family,byte[]qualifier,byte[]value)將指定的列和對(duì)應(yīng)的值添加到Put實(shí)例中Putadd(byte[]family,byte[]qualifier,longts,byte[]value)將制定的列和對(duì)應(yīng)的值及時(shí)間戳添加到Put實(shí)例中byte[]getRow()獲取Put實(shí)例的行RowLockgetRowLock()獲取Put實(shí)例的行鎖longgetTimeStamp()獲取Put實(shí)例的時(shí)間戳booleanisEmpty()檢查familyMap是否為空PutsetTimeStamp(longtimeStamp)設(shè)置Put實(shí)例的時(shí)間戳用法用例:HTabletable=newHTable(conf,Bytes.toBytes(tablename));Putp=newPut(brow);//為指定行創(chuàng)建一個(gè)Put操作p.add(family,qualifier,value);table.put(p);⑦Get關(guān)系:org.apache.hadoop.HBase.client.Get作用:用來(lái)獲取單個(gè)行的相關(guān)信息它的返回值、函數(shù)和描述信息如圖表4-14所示。表4-14返回值、函數(shù)和描述信息返回值函數(shù)描述GetaddColumn(byte[]family,byte[]qualifier)獲取指定列族和列修飾符對(duì)應(yīng)的列GetaddFamily(byte[]family)通過(guò)指定的列族獲取其對(duì)應(yīng)列的所有列GetsetTimeRange(longminStamp,longmaxStamp)獲取指定取件的列的版本號(hào)GetsetFilter(Filterfilter)當(dāng)執(zhí)行Get操作時(shí)設(shè)置服務(wù)器端的過(guò)濾器用法用例:HTabletable=newHTable(conf,Bytes.toBytes(tablename));Getg=newGet(Bytes.toBytes(row));⑧Result關(guān)系:org.apache.hadoop.HBase.client.Result。作用:存儲(chǔ)Get或者Scan操作后獲取表的單行值。使用此類提供的方法可以直接獲取值

或者各種Map結(jié)構(gòu)(Key-value對(duì))。它的返回值、函數(shù)和描述信息如表4-15所示。表4-15返回值、函數(shù)和描述信息返回值函數(shù)描述booleancontainsColumn(byte[]family,bytequalifier)檢查指定的列是否存在NavigableMap<byte[],byte[]>getFamilyMap(byte[]family)獲取對(duì)應(yīng)列族所包含的修飾符與值的鍵值對(duì)byte[]getValue(byte[]family,byte[]qualifier)獲取對(duì)應(yīng)列的最新值5.實(shí)訓(xùn)步驟(1)準(zhǔn)備工作①依次啟動(dòng)HDFS、ZooKeeper、HBase,查看進(jìn)程如圖4-51所示。②導(dǎo)入依賴本次編程環(huán)境繼續(xù)使用實(shí)訓(xùn)2.3的環(huán)境,但編寫HBase程序需要引入相關(guān)的jar包,所以需要先解壓HBase的安裝包到Windows本地,然后再導(dǎo)入hbase-shaded-client-2.5.0.jar包。操作如圖4-52所示。圖4-52導(dǎo)入HBase的依賴(2)編寫代碼新建一個(gè)HBaseDemo類,完整代碼如下:packagecom.bigdata;

importorg.apache.hadoop.conf.Configuration;

importorg.apache.hadoop.hbase.*;

importorg.apache.hadoop.hbase.client.*;

importorg.apache.hadoop.hbase.filter.Filter;

importorg.apache.hadoop.hbase.filter.FilterList;

importorg.apache.hadoop.hbase.filter.SingleColumnValueFilter;

importorg.apache.hadoop.hbase.util.Bytes;

importjava.io.IOException;

importjava.util.ArrayList;

importjava.util.List;

publicclassHBaseDemo{

publicstaticvoidmain(String[]args){

Configurationconfiguration=HBaseConfiguration.create();

Connectionconnection=null;

configuration.set("HBase.zookeeper.quorum","master:2181,slave1:2181,slave2:2181");

configuration.set("zookeeper.znode.parent","/hbase");

try{

connection=ConnectionFactory.createConnection(configuration);

//獲得Admin對(duì)象

Adminadmin=connection.getAdmin();

Stringtbl="hbase";

TableNametableName=TableName.valueOf(tbl);

//一、表不存在時(shí)創(chuàng)建表

if(!admin.tableExists(tableName)){

//創(chuàng)建表描述對(duì)象

TableDescriptorBuildertableDescriptor=TableDescriptorBuilder.newBuilder(tableName);

//列簇1

ColumnFamilyDescriptorfamilyColumn1=ColumnFamilyDescriptorBuilder.newBuilder("c1".getBytes()).build();

//列簇2

ColumnFamilyDescriptorfamilyColumn2=ColumnFamilyDescriptorBuilder.newBuilder("c2".getBytes()).build();

tableDescriptor.setColumnFamily(familyColumn1);

tableDescriptor.setColumnFamily(familyColumn2);

//用Admin對(duì)象創(chuàng)建表

admin.createTable(tableDescriptor.build());

}

//關(guān)閉Admin對(duì)象

admin.close();

//二、向表put數(shù)據(jù)

//獲得table接口

Tabletable=connection.getTable(tableName);

//添加的數(shù)據(jù)對(duì)象集合

List<Put>putList=newArrayList<Put>();

//添加10行數(shù)據(jù)

for(inti=0;i<10;i++){

//put對(duì)象(rowKey)

StringrowKey="myKey"+i;

Putput=newPut(rowKey.getBytes());

//添加列簇,列名,值

put.addColumn("c1".getBytes(),"c1tofamily1".getBytes(),("100"+i).getBytes());

put.addColumn("c1".getBytes(),"c2tofamily1".getBytes(),("200"+i).getBytes());

put.addColumn("c2".getBytes(),"c1tofamily2".getBytes(),("300"+i).getBytes());

putList.add(put);

}

table.put(putList);

table.close();

//查看對(duì)象

Scanscan=newScan();

//限定rowKey查詢范圍

scan.withStartRow("myKey0".getBytes());

scan.withStopRow("myKey9".getBytes());

//只查詢c1:c1tofamily1列

scan.addColumn("c1".getBytes(),"c1tofamily1".getBytes());

//過(guò)濾器集合

FilterListfilterList=newFilterList();

//查詢符合條件c1:c1tofamily1==1007的記錄

Filterfilter1=newSingleColumnValueFilter("c1".getBytes(),"c1tofamily1".getBytes(),CompareOperator.EQUAL,"1007".getBytes());

filterList.addFilter(filter1);

scan.setFilter(filterList);

ResultScannerresults=table.getScanner(scan);

for(Resultresult:results){

System.out.println("獲得到rowKey:"+newString(result.getRow()));

for(Cellcell:result.rawCells()){

System.out.println("列簇:"+

Bytes.toString(cell.getFamilyArray(),cell.getFam

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論