2012-07-13 86 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