12

我写作业mapreduce。输入是hbase中的一个表。

作业运行时,出现错误:

org.apache.hadoop.hbase.client.ScannerTimeoutException:自上次调用以来已过去 88557 毫秒,超时当前在 org.apache.hadoop.hbase.client.HTable$ClientScanner.next(HTable.java:1196) 在 org 设置为 60000 .apache.hadoop.hbase.mapreduce.TableRecordReaderImpl.nextKeyValue(TableRecordReaderImpl.java:133) 在 org.apache.hadoop.hbase.mapreduce.TableRecordReader.nextKeyValue(TableRecordReader.java:142) 在 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.runNewMapper(MapTask.java:764) 在 org.apache.hadoop.mapred.MapTask.run(MapTask.java:370) 在 org.apache.hadoop.mapred.Child$4.run (Child.java:255) 在 java.security.AccessController。doPrivileged(Native Method) at javax.security.auth.Subject.doAs(Subject.java:396) at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1083) at org.apache.hadoop.mapred。 Child.main(Child.java:249) 引起:org.apache.hadoop.hbase.UnknownScannerException:org.apache.hadoop.hbase.UnknownScannerException:名称:1502530095384129314 at org.apache.hadoop.hbase.regionserver.HRegionServer.next (HRegionServer.java:1837) 在 sun.reflect.GeneratedMethodAccessor19.invoke(Unknown Source) 在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) 在 java.lang.reflect.Method.invoke(Method.java:597 ) 在 org.apache.hadoop.hbase.ipc.HBaseRPC$Server.call(HBaseRPC.java:570) 在 org.apache.hadoop.hbase.ipc.HBaseServer$Handler.run(HBaseServer.java:1039) 在 sun。反射.NativeConstructorAccessorImpl。newInstance0(Native Method) at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39) at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27) at java.lang.reflect.Constructor.newInstance(Constructor.java: 513) 在 org.apache.hadoop.hbase.client.ScannerCallable.call(ScannerCallable.java:83) 在 org.apache.hadoop.hbase 的 org.apache.hadoop.hbase.RemoteExceptionHandler.decodeRemoteException(RemoteExceptionHandler.java:96) .client.ScannerCallable.call(ScannerCallable.java:38) 在 org.apache.hadoop.hbase.client.HConnectionManager$HConnectionImplementation.getRegionServerWithRetries(HConnectionManager.java:1226) 在 org.apache.hadoop.hbase.client.HTable$ClientScanner .next(HTable.java:1187) ... 12 更多newInstance(NativeConstructorAccessorImpl.java:39) at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27) at java.lang.reflect.Constructor.newInstance(Constructor.java:513) at org.apache.hadoop.hbase.RemoteExceptionHandler .decodeRemoteException(RemoteExceptionHandler.java:96) 在 org.apache.hadoop.hbase.client.ScannerCallable.call(ScannerCallable.java:83) 在 org.apache.hadoop.hbase.client.ScannerCallable.call(ScannerCallable.java:38) ) 在 org.apache.hadoop.hbase.client.HTable$ClientScanner.next(HTable.java:1187) 的 org.apache.hadoop.hbase.client.HConnectionManager$HConnectionImplementation.getRegionServerWithRetries(HConnectionManager.java:1226) ...还有 12 个newInstance(NativeConstructorAccessorImpl.java:39) at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27) at java.lang.reflect.Constructor.newInstance(Constructor.java:513) at org.apache.hadoop.hbase.RemoteExceptionHandler .decodeRemoteException(RemoteExceptionHandler.java:96) 在 org.apache.hadoop.hbase.client.ScannerCallable.call(ScannerCallable.java:83) 在 org.apache.hadoop.hbase.client.ScannerCallable.call(ScannerCallable.java:38) ) 在 org.apache.hadoop.hbase.client.HTable$ClientScanner.next(HTable.java:1187) 的 org.apache.hadoop.hbase.client.HConnectionManager$HConnectionImplementation.getRegionServerWithRetries(HConnectionManager.java:1226) ...还有 12 个org.apache.hadoop.hbase.RemoteExceptionHandler.decodeRemoteException(RemoteExceptionHandler.java:96) org.apache.hadoop.hbase.client.ScannerCallable.call(ScannerCallable. java:83) 在 org.apache.hadoop.hbase.client.ScannerCallable.call(ScannerCallable.java:38) 在 org.apache.hadoop.hbase.client.HConnectionManager$HConnectionImplementation.getRegionServerWithRetries(HConnectionManager.java:1226) 在 org .apache.hadoop.hbase.client.HTable$ClientScanner.next(HTable.java:1187) ... 12 更多org.apache.hadoop.hbase.RemoteExceptionHandler.decodeRemoteException(RemoteExceptionHandler.java:96) org.apache.hadoop.hbase.client.ScannerCallable.call(ScannerCallable. java:83) 在 org.apache.hadoop.hbase.client.ScannerCallable.call(ScannerCallable.java:38) 在 org.apache.hadoop.hbase.client.HConnectionManager$HConnectionImplementation.getRegionServerWithRetries(HConnectionManager.java:1226) 在 org .apache.hadoop.hbase.client.HTable$ClientScanner.next(HTable.java:1187) ... 12 更多java:38) 在 org.apache.hadoop.hbase.client.HConnectionManager$HConnectionImplementation.getRegionServerWithRetries(HConnectionManager.java:1226) 在 org.apache.hadoop.hbase.client.HTable$ClientScanner.next(HTable.java:1187) ... 12 更多java:38) 在 org.apache.hadoop.hbase.client.HConnectionManager$HConnectionImplementation.getRegionServerWithRetries(HConnectionManager.java:1226) 在 org.apache.hadoop.hbase.client.HTable$ClientScanner.next(HTable.java:1187) ... 12 更多

你能帮我修一下吗。

4

4 回答 4

11

发生扫描仪超时异常。避免超时异常通过在 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>
于 2012-07-13T12:07:18.480 回答
9

正如 HBase 官方书籍所述:

您可能需要在少量 RPC 和客户端和服务器上使用的内存之间找到一个最佳点。在大多数情况下,将扫描仪缓存设置得更高会提高扫描性能,但将其设置得太高也会产生不利影响:每次调用 next() 将花费更长的时间,因为要获取更多数据并需要将其传输到客户端,并且一旦超过了客户端进程可用的最大堆,它可能会以 OutOfMemoryException 终止。当将行传输到客户端或处理客户端上的数据所花费的时间超过配置的扫描仪租约阈值时,您最终将收到一个租约过期错误,其形式为抛出 ScannerTimeoutException。

所以最好不要通过上述配置避免异常,而是将 Map 端的缓存设置得较低,使您的映射器能够在预先指定的时间间隔内处理所需的负载。

于 2012-09-19T13:39:53.953 回答
2

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

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

较大的缓存值可能会导致ScannerTimeoutException您的程序在消耗/处理获取的行时可能比超时值花费更多的时间。

但它也会减慢您的任务,因为扫描仪正在向服务器发出更多获取请求,因此您应该根据您的程序需要微调您的caching和值。timeout

于 2016-03-29T14:42:04.750 回答
0

在 hbase-site.xml 中设置以下属性对我有用

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

如果从客户端到 RegionServer 的 RPC 调用之间的时间超过扫描超时,则会抛出此错误。例如

if ( RPC_call_time > Scanner_timeout ){

throw ScannerTimeoutException

}

访问我的 blogspot 了解详情

于 2016-09-26T06:03:09.927 回答