HBase golang初探

最近要进行大数据相关的任务,牛刀小试,先将最基础的HBase搭建并实践起来。本文借用docker,快速搭建HBase基础环境,并使用go结合thrift调用相关API进行数据操作。
0、方便起见,需要一个docker环境,安装配置略过不表。
1、拉取image

docker pull harisekhon/hbase

2、修改entrypoint.sh,启用thrift2

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

3、挂载修改后的启动文件,启动hbase,并暴露thrift2端口

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

4、运行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对应的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 用时:%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 = "调用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 = "调用Put方法写数据"

 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 = "调用Get方法获取新增加的数据"

 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 = "调用Put update方法'修改'数据"

 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 = "调用Get方法获取'修改'后的数据"

 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 = "调用DeleteSingle方法删除一条数据"

 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 = "调用PutMultiple方法添加" + strconv.Itoa(TESTRECORD) + "条数据"

 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 = "调用GetMultiple方法获取" + strconv.Itoa(TESTRECORD) + "数据"

 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包含一个TGet一个TPut,就不做测试了

 //可以和MutateRow结合使用

 //

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

 logformattitle = "调用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 = "调用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 = "调用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 = "调用DeleteMultiple方法删除" + strconv.Itoa(TESTRECORD) + "数据"

 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调用总计用时:%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))

 }

}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 200,738评论 5 472
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,377评论 2 377
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 147,774评论 0 333
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,032评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,015评论 5 361
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,239评论 1 278
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,724评论 3 393
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,374评论 0 255
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,508评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,410评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,457评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,132评论 3 316
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,733评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,804评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,022评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,515评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,116评论 2 341

推荐阅读更多精彩内容

  • 入门指南 1. 简介 Quickstart会让你启动和运行一个单节点单机HBase。 2. 快速启动 – 单点HB...
    和心数据阅读 4,510评论 1 41
  • HBase那些事 @(大数据工程学院)[HBase, Hadoop, 优化, HadoopChen, hbase]...
    分痴阅读 3,923评论 3 17
  • 1. HBase介绍,Hbase是什么? HBase -- Hadoop Database ,是一个高可靠、高性能...
    奉先阅读 3,725评论 1 36
  • 转载自 http://blog.opskumu.com/docker.html 一、Docker 简介 Docke...
    极客圈阅读 10,468评论 0 120
  • 一直反对报很多课外班,却没想到,不知不觉中,自己也陷入了这个漩涡。奥数,英语,竹笛。还有游泳和写字之类想报又没有报...
    溜走了阅读 199评论 0 0