Hadoop之RHbase的rhbase:: (IOError) Default TException.

时间:2021-08-28 08:27:17

接上篇http://blog.csdn.net/yibei8811/article/details/46842079

MapReduce调用R的时候会抛出一些异常,我们需要重现它。

Rhbase获取的rows提供了2个方法。一个是get(),一个是close()。

测试下close()后,再次查看端口,thirft的连接并未中断。那么它起到了什么作用?

可以见下图。

>
> library(rhbase)
> hb.init(serialize='character',host='192.168.101.110')
<pointer: 0x27d7ee0>
attr(,"class")
[1] "hb.client.connection"
> filterstring = paste("PrefixFilter('",'65026',"_')"," AND QualifierFilter(=,'substring:",'HSDPA_Users',"')",sep='' )
>
> rows<-hb.scan.ex("kpinfo",filterstring=filterstring)
> rows$get(1)
[[1]]
[[1]][[1]]
[1] "65026_201407290000"

[[1]][[2]]
[1] "h:HSDPA_Users"

[[1]][[3]]
[[1]][[3]][[1]]
[1] "1.025"



> rows$close()
> rows$get(1)
错误于rows$get(1) :
  rhbase<hbScannerGetList>:: (IllegalArgument) Default TException.
>
>

可见close()之后,无法再次使用get()!

回忆上篇,我们是关闭其他窗口,让其他卡住的rows得到返回!那么去其他窗口调用rows的close()方法是否会有这个效果呢,答案是否定的!


另外会出现的一个错误就是rhbase<hbScannerGetList>:: (IOError) Default TException.!

这个错误其实很值得研究,他有些奇怪的地方。

先看贴图代码,再做解释吧。

> library(rhbase)
> hb.init(serialize='character',host='192.168.101.110')
<pointer: 0x1147ee0>
attr(,"class")
[1] "hb.client.connection"
>
> filterstring = paste("PrefixFilter('",'65026',"_')"," AND QualifierFilter(=,'substring:",'HSDPA_Users',"')",sep='' )
> rows<-hb.scan.ex("kpinfo",filterstring=filterstring)
> Sys.sleep(60)
> rows$get(1)
错误于rows$get(1) :
  rhbase<hbScannerGetList>:: (IOError) Default TException.
> rows<-hb.scan.ex("kpinfo",filterstring=filterstring)
> rows$get(1)
[[1]]
[[1]][[1]]
[1] "65026_201407290000"

[[1]][[2]]
[1] "h:HSDPA_Users"

[[1]][[3]]
[[1]][[3]][[1]]
[1] "1.025"



> Sys.sleep(60)
> rows$get(1)
[[1]]
[[1]][[1]]
[1] "65026_201407290030"

[[1]][[2]]
[1] "h:HSDPA_Users"

[[1]][[3]]
[[1]][[3]][[1]]
[1] "0"



> rows$get(1000)
错误于rows$get(1000) :
  rhbase<hbScannerGetList>:: (IOError) Default TException.
>

得出的结论就是,超时后获取结果会产生IOError异常!

但是你先get一次结果集后,再次让它超时。其实你还能获取结果集。

就如你$get(1)以后sleep(60),你还能$get(1)。

那怎么证明它超时的呢?因为你获取$get(100)是不可以的了。因为结果中并未有缓存这么多数据吧。

可以继续做2个试验!

1.如果没有加sleep(60).你$get(1)以后,可以立即$get(100)得到结果。

2.如果你$get(1)不停的循环执行下去,大概70,80次之后也会出现这个异常。


这里会有另外一个疑问,既然rows会超时。那么卡住的rows等到返回的时候,这段时间会不会算超时的时间?

答案是不会,既然他都没返回,想必也不用谈超时吧!