hadoop筆記8--HBase的eclipse環(huán)境開發(fā)

上一篇記錄了HBase的shell中的基本操作,這一篇看看用java來實(shí)現(xiàn)那些相應(yīng)的操作。

首先進(jìn)入hadoop目錄和Hbase目錄话瞧,將偽分布式hadoop環(huán)境和Hbase啟動(dòng):

# 進(jìn)入hadoop目錄
sbin/start-all.sh

# 進(jìn)入hbase目錄
bin/start-hbase.sh
啟動(dòng)hadoop和hbase

然后在eclipse中建立一個(gè)mapreduce工程,這時(shí)候相應(yīng)的工程中已經(jīng)包含了開發(fā)hadoop程序用到的一些jar包。

包含了hadoop需要的包

不過這些jar包并沒有包含hbase要用到的凳忙,因此我們需要自己導(dǎo)入组去。導(dǎo)入的方法是右擊項(xiàng)目工程只壳,選擇 Properties->Java Build Path->Libraries->Add External JARs, 選擇添加所需的 jar 包:

我們需要的jar包在hbase的安裝(解壓縮)目錄下的lib目錄中,比如我的就是在/usr/local/hbase-1.1.7/lib圾浅,進(jìn)入后就能看到:

由于目前不清楚各種包里面包含了些什么腹尖,為了防止報(bào)錯(cuò)柳恐,我把這個(gè)目錄中的所有jar包都給導(dǎo)入到了工程中。

接著還要指定HBase配置文件的位置热幔,因?yàn)閆ookeeper的集群的信息在HBase的配置文件中(雖然我用的是HBase自帶的一個(gè)Zookeeper實(shí)例)乐设。

如何指定呢?可以將HBase的配置文件復(fù)制一份到工程里。先在工程目錄下創(chuàng)建一個(gè)名為conf的目錄绎巨,再將HBase的配置文件 hbase-site.xml 復(fù)制到該目錄下近尚。接著,還是右擊項(xiàng)目工程认烁,選擇 Properties->Java Build Path->Libraries->Add Class Folder, 將剛剛增加的conf目錄選上:

然后就可以進(jìn)行代碼的編寫了肿男。

首先來創(chuàng)建一個(gè)表:

public class HelloHBase {
    private static Configuration conf = HBaseConfiguration.create();

    //create a table
    public static void createTable(String tableName,String[] familys) throws Exception{
        @SuppressWarnings("deprecation")
        HBaseAdmin admin = new HBaseAdmin(conf);
        
        if(admin.tableExists(tableName)){
            System.out.println("table"+tableName+"already exists!");
        }else{
            @SuppressWarnings("deprecation")
            HTableDescriptor tableDesc = new HTableDescriptor(tableName);
            for(int i=0;i<familys.length;i++){
                tableDesc.addFamily(new HColumnDescriptor(familys[i]));
            }
            admin.createTable(tableDesc);
            System.out.println("create table "+tableName+" success!");
        }
        
    }

    public static void main(String[] args){
        try{
            String tablename = "testTableName";
            String[] familys = {"family1","family2"};
            HelloHBase.createTable(tablename, familys);
        }catch(Exception e){
            e.printStackTrace();
        }
    }
}

寫好后,運(yùn)行看看:

運(yùn)行結(jié)果

打印結(jié)果說明我們創(chuàng)建成功了却嗡,但如何查看呢舶沛?這時(shí)候需要進(jìn)入終端,進(jìn)入 HBase Shell查看結(jié)果:

可以看到窗价,剛才創(chuàng)建的testTableName顯示了出來如庭,說明執(zhí)行成功了。

接下來就繼續(xù)測(cè)試表更新的接口撼港,表更新有Put(插入或更新)坪它,Delete(刪除)Append(添加)帝牡,Increment(增長)等往毡。

插入數(shù)據(jù):

//插入數(shù)據(jù),其中rowKey為行靶溜,family為列族开瞭,qualifier為列名懒震,value為數(shù)據(jù)
public static void addData(String tableName,String rowKey,String family,String qualifier,String value) throws Exception{
        HTable table = new HTable(conf,tableName);
        Put put = new Put(Bytes.toBytes(rowKey));
        put.add(Bytes.toBytes(family),Bytes.toBytes(qualifier),Bytes.toBytes(value));
        table.put(put);
        System.out.println("insert recored success!");
    }

刪除一行數(shù)據(jù):

public static void deleteRow(String tableName,String rowKey) throws IOException{
        HTable table = new HTable(conf,tableName);
        Delete deleteRow = new Delete(rowKey.getBytes(rowKey));
        table.delete(deleteRow);
        System.out.println("delete row "+rowKey+" success!");
    }

刪除一行中某列的數(shù)據(jù):

public static void deleteColumn(String tableName,String rowKey,String familyName,String columnName) throws IOException{
        HTable table = new HTable(conf,tableName);
        Delete deleteColumn = new Delete(Bytes.toBytes(rowKey));
        deleteColumn.deleteColumn(Bytes.toBytes(familyName), Bytes.toBytes(columnName));
        table.delete(deleteColumn);
        System.out.println("delete "+rowKey+":"+familyName+":"+columnName+" success!");
    }

添加數(shù)據(jù)(Append):

public static void appendData(String tableName,String rowKey,String family,String qualifier,String value) throws IOException{
        HTable table = new HTable(conf,tableName);
        Append append = new Append(Bytes.toBytes(rowKey));
        append.add(Bytes.toBytes(family),Bytes.toBytes(qualifier),Bytes.toBytes(value));
        table.append(append);
        System.out.println("append data success!");
    }

增長數(shù)據(jù)(Increment):

public static void incrementData(String tableName,String rowKey,String family,String qualifier,long amount) throws IOException{
        HTable table = new HTable(conf,tableName);
        Increment increment = new Increment(Bytes.toBytes(rowKey));
        increment.addColumn(Bytes.toBytes(family), Bytes.toBytes(qualifier), amount);
        table.increment(increment);
        System.out.println("increment data success!");
    }

接下來看看數(shù)據(jù)的讀取。

讀取一行數(shù)據(jù):

public static void getOneRow(String tableName,String rowKey) throws IOException{
        HTable table = new HTable(conf,tableName);
        //
        Get get = new Get(rowKey.getBytes());
        Result result = table.get(get);
        //
        for(KeyValue kv:result.raw()){
            System.out.print("row: "+new String(kv.getRow())+" ");
            System.out.print("family: "+new String(kv.getFamily())+" ");
            System.out.print("qualifier: "+new String(kv.getQualifier())+" ");
            System.out.print("timestamp: "+kv.getTimestamp()+" ");
            System.out.println("value: "+new String(kv.getValue()));
        }
    }

掃描一個(gè)區(qū)段的數(shù)據(jù):

public static void scanRows(String tableName,String startRow,String stopRow) throws IOException{
        HTable table = new HTable(conf,tableName);
        //
        Scan s = new Scan(startRow.getBytes(),stopRow.getBytes());
        ResultScanner ss = table.getScanner(s);
        for(Result r:ss){
            for(KeyValue kv:r.raw()){
                System.out.print("row: "+new String(kv.getRow())+" ");
                System.out.print("family: "+new String(kv.getFamily())+" ");
                System.out.print("qualifier: "+new String(kv.getQualifier())+" ");
                System.out.print("timestamp: "+kv.getTimestamp()+" ");
                System.out.println("value: "+new String(kv.getValue()));
            }
        }
    }

還可以使用Filter來過濾一些數(shù)據(jù):

public static void scanByFilter(String tableName,String family,String qualifier,String value) throws IOException{
        HTable table = new HTable(conf,tableName);
        Scan scan = new Scan();
        scan.addColumn(Bytes.toBytes(family), Bytes.toBytes(qualifier));
        Filter filter = new SingleColumnValueFilter(Bytes.toBytes(family), Bytes.toBytes(qualifier), CompareOp.EQUAL, Bytes.toBytes(value));
        scan.setFilter(filter);
        
        ResultScanner result = table.getScanner(scan);
        
        //
        for(Result r:result){
            for(KeyValue kv:r.raw()){
                System.out.print("row: "+new String(kv.getRow())+" ");
                System.out.print("family: "+new String(kv.getFamily())+" ");
                System.out.print("qualifier: "+new String(kv.getQualifier())+" ");
                System.out.print("timestamp: "+kv.getTimestamp()+" ");
                System.out.println("value: "+new String(kv.getValue()));
            }
        }
    }

HBase基本用法就是這樣嗤详,可以在eclipse中運(yùn)行代碼后進(jìn)入hbase shell中查看對(duì)應(yīng)的表个扰。

代碼基本上進(jìn)行的是增刪改查,這樣也就更能看到HBase扮演的角色就相當(dāng)于在HDFS文件系統(tǒng)下的數(shù)據(jù)庫葱色。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末递宅,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子苍狰,更是在濱河造成了極大的恐慌办龄,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,692評(píng)論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件舞痰,死亡現(xiàn)場(chǎng)離奇詭異土榴,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)响牛,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,482評(píng)論 3 392
  • 文/潘曉璐 我一進(jìn)店門玷禽,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人呀打,你說我怎么就攤上這事矢赁。” “怎么了贬丛?”我有些...
    開封第一講書人閱讀 162,995評(píng)論 0 353
  • 文/不壞的土叔 我叫張陵撩银,是天一觀的道長。 經(jīng)常有香客問我豺憔,道長额获,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,223評(píng)論 1 292
  • 正文 為了忘掉前任恭应,我火速辦了婚禮抄邀,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘昼榛。我一直安慰自己境肾,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,245評(píng)論 6 388
  • 文/花漫 我一把揭開白布胆屿。 她就那樣靜靜地躺著奥喻,像睡著了一般。 火紅的嫁衣襯著肌膚如雪非迹。 梳的紋絲不亂的頭發(fā)上环鲤,一...
    開封第一講書人閱讀 51,208評(píng)論 1 299
  • 那天,我揣著相機(jī)與錄音憎兽,去河邊找鬼冷离。 笑死结闸,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的酒朵。 我是一名探鬼主播,決...
    沈念sama閱讀 40,091評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼扎附,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼蔫耽!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起留夜,我...
    開封第一講書人閱讀 38,929評(píng)論 0 274
  • 序言:老撾萬榮一對(duì)情侶失蹤匙铡,失蹤者是張志新(化名)和其女友劉穎,沒想到半個(gè)月后碍粥,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體鳖眼,經(jīng)...
    沈念sama閱讀 45,346評(píng)論 1 311
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,570評(píng)論 2 333
  • 正文 我和宋清朗相戀三年嚼摩,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了钦讳。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 39,739評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡枕面,死狀恐怖愿卒,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情潮秘,我是刑警寧澤琼开,帶...
    沈念sama閱讀 35,437評(píng)論 5 344
  • 正文 年R本政府宣布,位于F島的核電站枕荞,受9級(jí)特大地震影響柜候,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜躏精,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,037評(píng)論 3 326
  • 文/蒙蒙 一渣刷、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧玉控,春花似錦飞主、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,677評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至虱而,卻和暖如春筏餐,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背牡拇。 一陣腳步聲響...
    開封第一講書人閱讀 32,833評(píng)論 1 269
  • 我被黑心中介騙來泰國打工魁瞪, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留穆律,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 47,760評(píng)論 2 369
  • 正文 我出身青樓导俘,卻偏偏與公主長得像峦耘,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子旅薄,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,647評(píng)論 2 354

推薦閱讀更多精彩內(nèi)容