接上篇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等到返回的时候,这段时间会不会算超时的时间?
答案是不会,既然他都没返回,想必也不用谈超时吧!