2016-09-21 72 views
3

我的所有映射器都失敗,下面的例外失敗。我只表現出了簡潔的最後一次失敗。Accumulo MapReduce作業失敗,出現java.io.EOFException,使用AccumuloRowInputFormat

爲什麼會發生這種情況,我該如何解決?

16/09/21 17:01:57 INFO mapred.JobClient: Task Id : attempt_201609151451_0044_m_000002_2, Status : FAILED 
java.io.EOFException 
    at java.io.DataInputStream.readFully(DataInputStream.java:197) 
    at java.io.DataInputStream.readUTF(DataInputStream.java:609) 
    at java.io.DataInputStream.readUTF(DataInputStream.java:564) 
    at org.apache.accumulo.core.client.mapreduce.RangeInputSplit.readFields(RangeInputSplit.java:154) 
    at org.apache.hadoop.io.serializer.WritableSerialization$WritableDeserializer.deserialize(WritableSerialization.java:71) 
    at org.apache.hadoop.io.serializer.WritableSerialization$WritableDeserializer.deserialize(WritableSerialization.java:42) 
    at org.apache.hadoop.mapred.MapTask.getSplitDetails(MapTask.java:356) 
    at org.apache.hadoop.mapred.MapTask.runNewMapper(MapTask.java:640) 
    at org.apache.hadoop.mapred.MapTask.run(MapTask.java:330) 
    at org.apache.hadoop.mapred.Child$4.run(Child.java:268) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at javax.security.auth.Subject.doAs(Subject.java:415) 
    at org.apache.hadoop.security.UserGroupInformation.doAs(UserGroupInformation.java:1671) 
    at org.ap 
16/09/21 17:02:00 INFO mapred.JobClient: Job complete: job_201609151451_0044 
16/09/21 17:02:00 INFO mapred.JobClient: Counters: 8 
16/09/21 17:02:00 INFO mapred.JobClient: Job Counters 
16/09/21 17:02:00 INFO mapred.JobClient:  Failed map tasks=1 
16/09/21 17:02:00 INFO mapred.JobClient:  Launched map tasks=48 
16/09/21 17:02:00 INFO mapred.JobClient:  Data-local map tasks=13 
16/09/21 17:02:00 INFO mapred.JobClient:  Rack-local map tasks=35 
16/09/21 17:02:00 INFO mapred.JobClient:  Total time spent by all maps in occupied slots (ms)=343982 
16/09/21 17:02:00 INFO mapred.JobClient:  Total time spent by all reduces in occupied slots (ms)=0 
16/09/21 17:02:00 INFO mapred.JobClient:  Total time spent by all maps waiting after reserving slots (ms)=0 
16/09/21 17:02:00 INFO mapred.JobClient:  Total time spent by all reduces waiting after reserving slots (ms)=0 

我正在使用Accumulo表作爲我的輸入數據。我的設置如下:

@Override 
public int run(String[] args) throws Exception { 
    Configuration conf = getConf(); 
    String idMapFileContent = readResourceFile(TYPE_ID_MAP_FILENAME); 
    conf.set(TYPE_ID_MAP_KEY, idMapFileContent); 

    Job job = Job.getInstance(conf, this.getClass().getSimpleName()); 
    job.setJarByClass(this.getClass()); 
    job.setMapperClass(DanglingLinksFinderMapper.class); 
    job.setReducerClass(DanglingLinksFinderReducer.class); 
    this.setupRowInputFormat(job); 

    job.setMapOutputKeyClass(Text.class); 
    job.setMapOutputValueClass(Text.class); 
    job.setOutputFormatClass(TextOutputFormat.class); 
    Path out = new Path(args[0]); 
    LOGGER.info("Writing to output directory: " + out.toUri()); 
    FileOutputFormat.setOutputPath(job, out); 

    int exitCode = job.waitForCompletion(true) ? 0 : 1; 
} 

private Job setupRowInputFormat(Job job) 
     throws IOException, AccumuloSecurityException 
{ 
    job.setInputFormatClass(AccumuloRowInputFormat.class); 
    Configuration conf = job.getConfiguration(); 

    AccumuloConnectInfo connectInfo = new AccumuloConnectInfo(conf); 
    LOGGER.info(connectInfo.toString()); 

    AccumuloRowInputFormat.setZooKeeperInstance(job, connectInfo.getInstanceNames(), connectInfo.getZookeeperInstanceNames()); 
    AccumuloRowInputFormat.setConnectorInfo(job, connectInfo.getUserName(), connectInfo.getPassword()); 
    AccumuloRowInputFormat.setScanAuthorizations(job, new Authorizations()); 
    AccumuloRowInputFormat.setInputTableName(job, TABLE_NAME); 
    return job; 
} 

我使用的是Hadoop 2.6.0,Accumulo 1.5.0和Java 1.7。

我有這個工作在前一天,並沒有(據我所知)改變任何東西。所以我在想也許它與我在運行它的服務器上的配置或數據狀態有關?該作業在我的本地機器上的Docker容器中運行的測試表上正常工作,但在我的遠程測試服務器上失敗。

我可以登錄到accumulo shell並掃描我正在使用的表格。那裏一切都很美好。我也嘗試在測試服務器上運行壓縮,運行良好,但沒有解決問題。

+0

您正在使用什麼版本的Accumulo? – elserj

+0

更新了包含Accumulo版本的答案。 – Mack

+0

謝謝!順便說一句,我*非常強烈*建議您升級到更新的版本。 1.5是*長*棄用。 – elserj

回答

2

我在猜測你有一個版本不匹配的Accumulo jar用來啓動MapReduce作業,以及那些你通過DistributedCache或libjars CLI選項使用的作業本身(Mappers/Reducers)。

由於您未指定範圍,因此AccumuloInputFormat將自動爲您的表提取所有平板電腦邊界,並創建與表中的平板電腦相同數量的RangeInputSplit對象。這種拆分創建是在本地JVM(提交作業時創建的JVM)中完成的。這些RangeInputSplit對象被序列化並傳遞給YARN。

您提供的錯誤是當一個Mapper使用這些序列化的RangeInputSplit對象之一併試圖反序列化它時。一些如何,這是失敗的,因爲沒有足夠的序列化數據來反序列化在Mapper中運行的Accumulo版本的預期讀取。

這可能是您的Accumulo版本中的一個序列化錯誤(請分享一下),但我不記得聽說過這樣的錯誤。我猜想在本地類路徑和Mapper的類路徑中的Accumulo版本有所不同。

+0

罐子不匹配的想法對我來說很有意義。然而,我實際上並沒有使用我正在使用的jar文件打包任何依賴關係,而且我正在使用accumulo的'tool.sh'腳本運行jar,我相信它將使用Accumulo安裝的jar加載到classpath中。這並不能消除由該腳本加載的罐子或通過糟糕的環境設置產生衝突的可能性。 – Mack

+0

我已經驗證了我們的系統管理員,這絕對是一個jar不匹配問題。顯然,當配置測試服務器時,已經安裝了Accumulo 1.5.4。然後它被降低到1.5.0,但一些最初的罐子留在原地。我相信這是由於[已知不兼容]導致的失敗(https://accumulo.apache.org/release_notes/1.5.2#fixes-mapreduce-package-name-change)。 – Mack

+0

太好了。很高興你明白了。 – elserj

相關問題