2012-07-13 67 views
12

我写作业mapreduce.The输入是hbase中的表。Hbase mapreduce错误

当作业运行,有错误:

org.apache.hadoop.hbase.client.ScannerTimeoutException:88557ms自上次调用中传递,超时当前设置为60000在org.apache.hadoop.hbase .client.HTable $ ClientScanner.next(HTable.java:1196)at org.apache.hadoop.hbase.mapreduce.TableRecordReaderImpl.nextKeyValue(TableRecordReaderImpl.java:133)at org.apache.hadoop.hbase.mapreduce.TableRecordReader.nextKeyValue (TableRecordReader.java:142)at org.apache.hadoop.mapred.MapTask $ NewTrackingRecordReader.nextKeyValue(MapTask.java:532)at org.apache.hadoop.mapreduce.MapContext.nextKeyValue(MapContext.java:67)at org。 apache.hadoop.mapreduce.Mapper.run(Mapper.java:143)at org.apache.hadoop.mapred.MapTask.ru在org.apache.hadoop.mapred.Child上的org.apache.hadoop.mapred.MapTask.run(MapTask.java:370)处的nNewMapper(MapTask.java:764)$ 4.run(Child.java:255)at java。在org.apache的org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1083)上的javax.security.auth.Subject.doAs(Subject.java:396)处的security.AccessController.doPrivileged(Native Method)。 hadoop.mapred.Child.main(Child.java:249)引起的:org.apache.hadoop.hbase.UnknownScannerException:org.apache.hadoop.hbase.UnknownScannerException:名称:1502530095384129314位于org.apache.hadoop.hbase.regionserver .HRegionServer.next(HRegionServer.java:1837)at sun.reflect.GeneratedMethodAccessor19.invoke(Unknown Source)at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)at java.lang.reflect.Method.invoke(Method .java:597)at org.apache.hadoop.hbase.ipc.HBaseRPC $ Server.call(HBaseRPC.java:570)at org.apache.hadoop.hbase.ipc.HBaseServer $ Handler.run(HBaseServer.java:1039 )在sun.reflect.NativeCons在构造函数的sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)上的sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)处的tructorAccessorImpl.newInstance0(Native方法)。在org.apache.hadoop上org.apache.hadoop.hbase.client.ScannerCallable.call(ScannerCallable.java:83)处的org.apache.hadoop.hbase.RemoteExceptionHandler.decodeRemoteException(RemoteExceptionHandler.java:96) .hbase.client.ScannerCallable.call(ScannerCallable.java:38)at org.apache.hadoop.hbase.client.HConnectionManager $ HConnectionImplementation.getRegionServerWithRetries(HConnectionManager.java:1226)at org.apache.hadoop.hbase.client.HTable $ ClientScanner.next(HTable.java:1187)... 12更多

你能帮忙吗我修复它。

回答

9

已发生扫描仪超时异常。为了避免超时异常通过设置在HBase的-site.xml中的属性将在hbase-可>的conf

<property> 
    <name>hbase.client.scanner.timeout.period</name> 
    <value>900000</value> <!-- 900 000, 15 minutes --> 
    </property> 
    <property> 
    <name>hbase.rpc.timeout</name> 
    <value>900000</value> <!-- 15 minutes --> 
    </property> 
9

由于官方HBase的书状态增加超时:

你可能需要在较少数量的RPC和客户端和服务器上使用的内存 之间找到最佳位置。将扫描仪缓存设置得越高,在大多数情况下都会提高扫描性能,但将其设置得太高也会产生不利影响:由于提取的数据越多,需要将 传输到客户端,并且一旦您超出客户端进程可用的最大堆数 它可能会以OutOfMemoryException终止。 当向客户端传输行或在客户端上处理数据所用的时间超过配置的扫描程序租用阈值时, 将最终以抛出ScannerTimeoutException的形式接收到租约到期错误。

因此,最好不要通过上述配置避免异常,而要将Map端的缓存设置得更低,使映射器能够将所需的加载处理到预先指定的时间间隔。

+1

https://books.google.fr/books?id=nUhiQxUXVpMC&pg=PA128&lpg=PA128#v=onepage&q&f=false – Fabien 2016-04-06 13:41:24

+0

的片段是从** HBase的权威指南** ,2011年第1版第128页。 – botchniaque 2016-10-25 08:31:53

2

您可以使用Scan对象的setCaching(int noOfRows)方法来减少扫描仪一次获取的行数。

Scan scan=new Scan(); 
scan.setCaching(400);//here 400 is just an example value 

较大的缓存值可能会导致ScannerTimeoutException为你的程序可能需要比超时值消费/取处理行更多的时间。

但是它可能会减慢你的任务,同时当扫描器向服务器发出更多的提取请求时,所以你应该根据你的程序需要微调你的cachingtimeout值。在HBase的-site.xml中

0

Settting以下属性为我工作

<property> 
     <name>hbase.client.scanner.timeout.period</name> 
     <value>900000</value> 
    </property> 

是,如果RPC之间的时间要求从客户端到RegionServer的超过扫描超时抛出。例如

if (RPC_call_time > Scanner_timeout){ 

throw ScannerTimeoutException 

} 

访问my blogspot for details