在研究用go程序读取hbase数据中遇到的问题,希望前辈能指点一下。 recover 会收到 could not connect to a server 就是有的时候会连接成功并打印读到的数据,有的时候就会提示连接失败。 请问这是程序的问题,还是我用的第三方包问题,还是hbase本身对连接的支持问题呢? 补充一下:在for循环100此的时候不会出现panic。但是上升到500的时候就会有panic出现。

package main

import (
    "github.com/lazyshot/go-hbase"

    "fmt"
    "sync"
    "time"
)

var wg sync.WaitGroup

func main() {

    start := time.Now().UnixNano()
    for i := 0; i < 500; i++ {
        wg.Add(1)
        go func() {
            defer func() {
                if err := recover(); err != nil {
                    fmt.Println(err)
                }
            }()
            defer wg.Done()
            client := hbase.NewClient([]string{"192.168.100.12:2181"}, "/hbase")
            get := hbase.CreateNewGet([]byte("sjaldksjaldjla"))
            result, err := client.Get("userinfo", get)
            if err != nil {
                fmt.Println("get err", err)
                return
            }
            fmt.Println(result)
        }()
    }
    wg.Wait()
    end := time.Now().UnixNano()
    usetime := end - start
    fmt.Println("use time:", usetime)
    fmt.Println("average:", usetime/500)

}

共 9 个回复


stevewang

这里没有必要recover吧,panic了直接看看函数调用栈就知道那里出错了。

# 0

yxllin

因为panic打印的东西太多,界面已经被刷过去了,看不到,所以。。。
目前出现连接不上无服务器的原因可能是因为zookeeper有限制连接数100的默认配置。
那在连接数小于100的情况下,出现读取空值的问题时常出现,暂时不清楚问题出在哪里,该如何排查,怎么解决。

# 1

stevewang

你把标准输出和错误输出重定向到一个文件就可以了。
panic应该是从go-hbase里抛出来的。

# 2

hearfish

应该是你的zookeeper链接数到上限了 检查一下zookeeper的最大链接数

# 3

yxllin

500并发出现连接失败的原因是 zookeeper的最大连接数设置的问题,这个已经解决。
关于时而会读取空值的原因,我找这个第三方包源码的时候发现了client.go的一个getCachedLocation()方法里面有一个判断,if ( len(region.endKey) == 0 ||
bytes.Compare(row, region.endKey) < 0) &&
( len(region.startKey) == 0 ||
bytes.Compare(row, region.startKey) >= 0)
,将len(region.endKey) == 0和len(region.startKey) == 0 注释掉以后出现空值的现象就没了。但是具体原因是什么我目前还不清楚,如果前辈们有空能看一下这个源码给出答案,那真是再感谢不过了。。。。
感谢回答各位

# 4

stevewang

你还是应该看看panic信息来定位panic发生的语句。

# 5

yxllin

嗯。。昨天看了,panic确实是从gohbase里出来的。

# 6

derek

@yxllin

是否可以提供一个联系方式,例如qq之类的,我也在测试使用go-hbase,发现无法运行,到现在还没有找到解决方案,是否可以指点一下,我的qq 77095729
谢谢

# 7