HBase golang初探

最近要進(jìn)行大數(shù)據(jù)相關(guān)的任務(wù)元镀,牛刀小試,先將最基礎(chǔ)的HBase搭建并實(shí)踐起來(lái)。本文借用docker脆淹,快速搭建HBase基礎(chǔ)環(huán)境,并使用go結(jié)合thrift調(diào)用相關(guān)API進(jìn)行數(shù)據(jù)操作沽一。
0盖溺、方便起見(jiàn),需要一個(gè)docker環(huán)境铣缠,安裝配置略過(guò)不表烘嘱。
1、拉取image

docker pull harisekhon/hbase

2蝗蛙、修改entrypoint.sh蝇庭,啟用thrift2

/hbase/bin/hbase-daemon.sh start thrift2

3、掛載修改后的啟動(dòng)文件捡硅,啟動(dòng)hbase哮内,并暴露thrift2端口

docker run -d -p 9090:9090 -v `pwd`/entrypoint.sh:/entrypoint.sh --name hbase harisekhon/hbase

4、運(yùn)行hbase shell病曾,建表

docker exec -it hbase bash

hbase shell

// 建表

create 'elvizlai_test',{NAME => 'f1', VERSIONS => 2},{NAME => 'f2', VERSIONS => 2}

// 刪除表

disable 'elvizlai_test'

drop 'elvizlai_test

4牍蜂、thrift for mac安裝漾根,感謝brew
brew install thrift

5、下載hbase thrift2對(duì)應(yīng)的hbase.thrift文件鲫竞,生成go package

wget https://raw.githubusercontent.com/apache/hbase/master/hbase-thrift/src/main/resources/org/apache/hadoop/hbase/thrift2/hbase.thrift

thrift -r -out . --gen go *.thrift

6辐怕、撰寫main.go一探究竟吧

package main

import (

 "encoding/binary"

 "fmt"

 "hbase"

 "reflect"

 "strconv"

 "time"

 "git.apache.org/thrift.git/lib/go/thrift"

)

const HOST = "127.0.0.1"

const PORT = "9090"

const TESTRECORD = 10

func main() {

 startTime := currentTimeMillis()

 logformatstr_ := "----%s\n"

 logformatstr := "----%s 用時(shí):%d-%d=%d毫秒\n\n"

 logformattitle := "建立連接"

 table := "elvizlai_test"

 rowkey := "1"

 family := "f1"

 protocolFactory := thrift.NewTBinaryProtocolFactoryDefault()

 transport, err := thrift.NewTSocket(HOST + ":" + PORT)

 if err != nil {

 panic(err)

 }

 client := hbase.NewTHBaseServiceClientFactory(transport, protocolFactory)

 if err := transport.Open(); err != nil {

 panic(err)

 }

 tmpendTime := currentTimeMillis()

 fmt.Printf(logformatstr, logformattitle, tmpendTime, startTime, (tmpendTime - startTime))

 defer transport.Close()

 //--------------Exists

 logformattitle = "調(diào)用Exists方法"

 fmt.Printf(logformatstr_, logformattitle)

 tmpstartTime := currentTimeMillis()

 isexists, err := client.Exists([]byte(table), &hbase.TGet{Row: []byte(rowkey)})

 fmt.Printf("rowkey{%s} in table{%s} Exists:%t\n", rowkey, table, isexists)

 tmpendTime = currentTimeMillis()

 fmt.Printf(logformatstr, logformattitle, tmpendTime, tmpstartTime, (tmpendTime - tmpstartTime))

 //--------------Put

 logformattitle = "調(diào)用Put方法寫數(shù)據(jù)"

 fmt.Printf(logformatstr_, logformattitle)

 tmpstartTime = currentTimeMillis()

 cvarr := []*hbase.TColumnValue{

 {

 Family: []byte(family),

 Qualifier: []byte("idoall.org"),

 Value: []byte("welcome idoall.org"),

 },

 }

 temptput := hbase.TPut{Row: []byte(rowkey), ColumnValues: cvarr}

 err = client.Put([]byte(table), &temptput)

 if err != nil {

 fmt.Printf("Put err:%s\n", err)

 } else {

 fmt.Println("Put done")

 }

 tmpendTime = currentTimeMillis()

 fmt.Printf(logformatstr, logformattitle, tmpendTime, tmpstartTime, (tmpendTime - tmpstartTime))

 //------------Get---------------

 logformattitle = "調(diào)用Get方法獲取新增加的數(shù)據(jù)"

 fmt.Printf(logformatstr_, logformattitle)

 tmpstartTime = currentTimeMillis()

 result, err := client.Get([]byte(table), &hbase.TGet{Row: []byte(rowkey)})

 if err != nil {

 fmt.Printf("Get err:%s\n", err)

 } else {

 fmt.Println("Rowkey:" + string(result.Row))

 for _, cv := range result.ColumnValues {

 printscruct(cv)

 }

 }

 tmpendTime = currentTimeMillis()

 fmt.Printf(logformatstr, logformattitle, tmpendTime, tmpstartTime, (tmpendTime - tmpstartTime))

 //--------------put update

 logformattitle = "調(diào)用Put update方法'修改'數(shù)據(jù)"

 fmt.Printf(logformatstr_, logformattitle)

 tmpstartTime = currentTimeMillis()

 cvarr = []*hbase.TColumnValue{

 {

 Family: []byte(family),

 Qualifier: []byte("idoall.org"),

 Value: []byte("welcome idoall.org---update"),

 },

 }

 temptput = hbase.TPut{Row: []byte(rowkey), ColumnValues: cvarr}

 err = client.Put([]byte(table), &temptput)

 if err != nil {

 fmt.Printf("Put update err:%s\n", err)

 } else {

 fmt.Println("Put update done")

 }

 tmpendTime = currentTimeMillis()

 fmt.Printf(logformatstr, logformattitle, tmpendTime, tmpstartTime, (tmpendTime - tmpstartTime))

 //------------Get update---------------

 logformattitle = "調(diào)用Get方法獲取'修改'后的數(shù)據(jù)"

 fmt.Printf(logformatstr_, logformattitle)

 tmpstartTime = currentTimeMillis()

 //

 result, err = (client.Get([]byte(table), &hbase.TGet{Row: []byte(rowkey)}))

 if err != nil {

 fmt.Printf("Get update err:%s\n", err)

 } else {

 fmt.Println("update Rowkey:" + string(result.Row))

 for _, cv := range result.ColumnValues {

 printscruct(cv)

 }

 }

 tmpendTime = currentTimeMillis()

 fmt.Printf(logformatstr, logformattitle, tmpendTime, tmpstartTime, (tmpendTime - tmpstartTime))

 //------------DeleteSingle------------

 logformattitle = "調(diào)用DeleteSingle方法刪除一條數(shù)據(jù)"

 fmt.Printf(logformatstr_, logformattitle)

 tmpstartTime = currentTimeMillis()

 tdelete := hbase.TDelete{Row: []byte(rowkey)}

 err = client.DeleteSingle([]byte(table), &tdelete)

 if err != nil {

 fmt.Printf("DeleteSingle err:%s\n", err)

 } else {

 fmt.Print("DeleteSingel done\n")

 }

 tmpendTime = currentTimeMillis()

 fmt.Printf(logformatstr, logformattitle, tmpendTime, tmpstartTime, (tmpendTime - tmpstartTime))

 //-------------PutMultiple----------------

 logformattitle = "調(diào)用PutMultiple方法添加" + strconv.Itoa(TESTRECORD) + "條數(shù)據(jù)"

 fmt.Printf(logformatstr_, logformattitle)

 tmpstartTime = currentTimeMillis()

 var tputArr []*hbase.TPut

 for i := 0; i < TESTRECORD; i++ {

 putrowkey := strconv.Itoa(i)

 tputArr = append(tputArr, &hbase.TPut{

 Row: []byte(putrowkey),

 ColumnValues: []*hbase.TColumnValue{

 {

 Family: []byte(family),

 Qualifier: []byte("idoall.org"),

 Value: []byte(time.Now().String()),

 },

 }})

 }

 err = client.PutMultiple([]byte(table), tputArr)

 if err != nil {

 fmt.Printf("PutMultiple err:%s\n", err)

 } else {

 fmt.Print("PutMultiple done\n")

 }

 tmpendTime = currentTimeMillis()

 fmt.Printf(logformatstr, logformattitle, tmpendTime, tmpstartTime, (tmpendTime - tmpstartTime))

 //------------------GetMultiple-----------------------------

 logformattitle = "調(diào)用GetMultiple方法獲取" + strconv.Itoa(TESTRECORD) + "數(shù)據(jù)"

 fmt.Printf(logformatstr_, logformattitle)

 tmpstartTime = currentTimeMillis()

 //

 var tgets []*hbase.TGet

 for i := 0; i < TESTRECORD; i++ {

 putrowkey := strconv.Itoa(i)

 tgets = append(tgets, &hbase.TGet{

 Row: []byte(putrowkey)})

 }

 results, err := client.GetMultiple([]byte(table), tgets)

 if err != nil {

 fmt.Printf("GetMultiple err:%s", err)

 } else {

 fmt.Printf("GetMultiple Count:%d\n", len(results))

 for _, k := range results {

 fmt.Println("Rowkey:" + string(k.Row))

 for _, cv := range k.ColumnValues {

 printscruct(cv)

 }

 }

 }

 tmpendTime = currentTimeMillis()

 fmt.Printf(logformatstr, logformattitle, tmpendTime, tmpstartTime, (tmpendTime - tmpstartTime))

 //-------------------TMutation

 //TMutation包含一個(gè)TGet一個(gè)TPut,就不做測(cè)試了

 //可以和MutateRow結(jié)合使用

 //

 //-------------------OpenScanner

 logformattitle = "調(diào)用OpenScanner方法"

 fmt.Printf(logformatstr_, logformattitle)

 tmpstartTime = currentTimeMillis()

 startrow := make([]byte, 4)

 binary.LittleEndian.PutUint32(startrow, 1)

 stoprow := make([]byte, 4)

 binary.LittleEndian.PutUint32(stoprow, 10)

 scanresultnum, err := client.OpenScanner([]byte(table), &hbase.TScan{

 StartRow: startrow,

 StopRow: stoprow,

 // FilterString: []byte("RowFilter(=, 'regexstring:00[1-3]00')"),

 // FilterString: []byte("PrefixFilter('1407658495588-')"),

 Columns: []*hbase.TColumn{

 {

 Family: []byte(family),

 Qualifier: []byte("idoall.org"),

 },

 },

 })

 if err != nil {

 fmt.Printf("OpenScanner err:%s\n", err)

 } else {

 fmt.Printf("OpenScanner %d done\n", scanresultnum)

 scanresult, err := client.GetScannerRows(scanresultnum, 100)

 if err != nil {

 fmt.Printf("GetScannerRows err:%s\n", err)

 } else {

 fmt.Printf("GetScannerRows %d done\n", len(scanresult))

 for _, k := range scanresult {

 fmt.Println("scan Rowkey:" + string(k.Row))

 for _, cv := range k.ColumnValues {

 printscruct(cv)

 }

 }

 }

 }

 tmpendTime = currentTimeMillis()

 fmt.Printf(logformatstr, logformattitle, tmpendTime, tmpstartTime, (tmpendTime - tmpstartTime))

 //--closescanner

 logformattitle = "調(diào)用CloseScanner方法"

 fmt.Printf(logformatstr_, logformattitle)

 tmpstartTime = currentTimeMillis()

 err = client.CloseScanner(scanresultnum)

 if err != nil {

 fmt.Printf("CloseScanner err:%s\n", err)

 }

 tmpendTime = currentTimeMillis()

 fmt.Printf(logformatstr, logformattitle, tmpendTime, tmpstartTime, (tmpendTime - tmpstartTime))

 //-------------------GetScannerResults

 logformattitle = "調(diào)用GetScannerResults方法"

 fmt.Printf(logformatstr_, logformattitle)

 tmpstartTime = currentTimeMillis() //

 gsr, err := client.GetScannerResults([]byte(table), &hbase.TScan{

 StartRow: startrow,

 StopRow: stoprow,

 // FilterString: []byte("RowFilter(=, 'regexstring:00[1-3]00')"),

 // FilterString: []byte("PrefixFilter('1407658495588-')"),

 Columns: []*hbase.TColumn{

 {

 Family: []byte(family),

 Qualifier: []byte("idoall.org"),

 },

 }}, 100)

 if err != nil {

 fmt.Printf("GetScannerResults err:%s\n", err)

 } else {

 fmt.Printf("GetScannerResults %d done\n", len(gsr))

 for _, k := range gsr {

 fmt.Println("scan Rowkey:" + string(k.Row))

 for _, cv := range k.ColumnValues {

 printscruct(cv)

 }

 }

 }

 tmpendTime = currentTimeMillis()

 fmt.Printf(logformatstr, logformattitle, tmpendTime, tmpstartTime, (tmpendTime - tmpstartTime))

 //---------------DeleteMultiple--------------

 logformattitle = "調(diào)用DeleteMultiple方法刪除" + strconv.Itoa(TESTRECORD) + "數(shù)據(jù)"

 fmt.Printf(logformatstr_, logformattitle)

 tmpstartTime = currentTimeMillis()

 var tdelArr []*hbase.TDelete

 for i := 0; i < TESTRECORD; i++ {

 putrowkey := strconv.Itoa(i)

 tdelArr = append(tdelArr, &hbase.TDelete{

 Row: []byte(putrowkey)})

 }

 r, err := client.DeleteMultiple([]byte(table), tdelArr)

 if err != nil {

 fmt.Printf("DeleteMultiple err:%s\n", err)

 } else {

 fmt.Printf("DeleteMultiple %d done\n", TESTRECORD)

 fmt.Println(r)

 }

 tmpendTime = currentTimeMillis()

 fmt.Printf(logformatstr, logformattitle, tmpendTime, tmpstartTime, (tmpendTime - tmpstartTime))

 endTime := currentTimeMillis()

 fmt.Printf("\nGolang調(diào)用總計(jì)用時(shí):%d-%d=%d毫秒\n", endTime, startTime, (endTime - startTime))

}

func currentTimeMillis() int64 {

 return time.Now().UnixNano() / 1000000

}

func printscruct(cv interface{}) {

 switch reflect.ValueOf(cv).Interface().(type) {

 case *hbase.TColumnValue:

 s := reflect.ValueOf(cv).Elem()

 typeOfT := s.Type()

 //獲取Thrift2中struct的field

 for i := 0; i < s.NumField(); i++ {

 f := s.Field(i)

 fileldformatstr := "\t%d: %s(%s)= %v\n"

 switch f.Interface().(type) {

 case []uint8:

 fmt.Printf(fileldformatstr, i, typeOfT.Field(i).Name, f.Type(), string(f.Interface().([]uint8)))

 case *int64:

 var tempint64 int64

 if f.Interface().(*int64) == nil {

 tempint64 = 0

 } else {

 tempint64 = *f.Interface().(*int64)

 }

 fmt.Printf(fileldformatstr, i, typeOfT.Field(i).Name, f.Type(), tempint64)

 default:

 fmt.Print("I don't know")

 }

 }

 default:

 fmt.Print("I don't know")

 fmt.Print(reflect.ValueOf(cv))

 }

}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末从绘,一起剝皮案震驚了整個(gè)濱河市寄疏,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌僵井,老刑警劉巖陕截,帶你破解...
    沈念sama閱讀 218,546評(píng)論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異批什,居然都是意外死亡农曲,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,224評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門驻债,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)乳规,“玉大人,你說(shuō)我怎么就攤上這事合呐∧旱模” “怎么了?”我有些...
    開(kāi)封第一講書人閱讀 164,911評(píng)論 0 354
  • 文/不壞的土叔 我叫張陵淌实,是天一觀的道長(zhǎng)冻辩。 經(jīng)常有香客問(wèn)我,道長(zhǎng)拆祈,這世上最難降的妖魔是什么恨闪? 我笑而不...
    開(kāi)封第一講書人閱讀 58,737評(píng)論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮缘屹,結(jié)果婚禮上凛剥,老公的妹妹穿的比我還像新娘。我一直安慰自己轻姿,他們只是感情好犁珠,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,753評(píng)論 6 392
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著互亮,像睡著了一般犁享。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上豹休,一...
    開(kāi)封第一講書人閱讀 51,598評(píng)論 1 305
  • 那天炊昆,我揣著相機(jī)與錄音,去河邊找鬼。 笑死凤巨,一個(gè)胖子當(dāng)著我的面吹牛视乐,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播敢茁,決...
    沈念sama閱讀 40,338評(píng)論 3 418
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼佑淀,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了彰檬?” 一聲冷哼從身側(cè)響起伸刃,我...
    開(kāi)封第一講書人閱讀 39,249評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎逢倍,沒(méi)想到半個(gè)月后捧颅,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,696評(píng)論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡较雕,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,888評(píng)論 3 336
  • 正文 我和宋清朗相戀三年碉哑,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片郎笆。...
    茶點(diǎn)故事閱讀 40,013評(píng)論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡谭梗,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出宛蚓,到底是詐尸還是另有隱情,我是刑警寧澤设塔,帶...
    沈念sama閱讀 35,731評(píng)論 5 346
  • 正文 年R本政府宣布凄吏,位于F島的核電站,受9級(jí)特大地震影響闰蛔,放射性物質(zhì)發(fā)生泄漏痕钢。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,348評(píng)論 3 330
  • 文/蒙蒙 一序六、第九天 我趴在偏房一處隱蔽的房頂上張望任连。 院中可真熱鬧,春花似錦例诀、人聲如沸随抠。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 31,929評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)拱她。三九已至,卻和暖如春扔罪,著一層夾襖步出監(jiān)牢的瞬間秉沼,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 33,048評(píng)論 1 270
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留唬复,地道東北人矗积。 一個(gè)月前我還...
    沈念sama閱讀 48,203評(píng)論 3 370
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像敞咧,于是被迫代替她去往敵國(guó)和親棘捣。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,960評(píng)論 2 355

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

  • 入門指南 1. 簡(jiǎn)介 Quickstart會(huì)讓你啟動(dòng)和運(yùn)行一個(gè)單節(jié)點(diǎn)單機(jī)HBase妄均。 2. 快速啟動(dòng) – 單點(diǎn)HB...
    和心數(shù)據(jù)閱讀 4,566評(píng)論 1 41
  • HBase那些事 @(大數(shù)據(jù)工程學(xué)院)[HBase, Hadoop, 優(yōu)化, HadoopChen, hbase]...
    分癡閱讀 3,941評(píng)論 3 17
  • 1. HBase介紹柱锹,Hbase是什么? HBase -- Hadoop Database 丰包,是一個(gè)高可靠禁熏、高性能...
    奉先閱讀 3,747評(píng)論 1 36
  • 轉(zhuǎn)載自 http://blog.opskumu.com/docker.html 一、Docker 簡(jiǎn)介 Docke...
    極客圈閱讀 10,501評(píng)論 0 120
  • 一直反對(duì)報(bào)很多課外班邑彪,卻沒(méi)想到瞧毙,不知不覺(jué)中,自己也陷入了這個(gè)漩渦寄症。奧數(shù)宙彪,英語(yǔ),竹笛有巧。還有游泳和寫字之類想報(bào)又沒(méi)有報(bào)...
    溜走了閱讀 209評(píng)論 0 0