2016-09-21 11 views
3

すべてのマッパーは以下の例外を除いて失敗します。私は簡潔さのための最後の失敗を示しただけです。Accumulo MapReduceジョブは、AccumuloRowInputFormatを使用してjava.io.EOFExceptionで失敗します。

なぜこれが起こっているのですか、どうすれば解決できますか?

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、1.5.0 Accumulo、およびJava 1.7を使用しています。

私は先日この作業をしていましたが、私の知識では何も変えていませんでした。だから私はそれが私がそれを実行しているサーバー上の構成やデータの状態と関係するかもしれないと思っています?私のローカルマシンのDockerコンテナで実行されているテストテーブルでは正常に動作しますが、リモートテストサーバーでは失敗します。

accumulo shellにログインして、私が作業しているテーブルをスキャンすることができます。すべてがうまく見えます。私はまた、正常に動作したテストサーバー上の圧縮を実行しようとしましたが、問題を修正しませんでした。

+0

使用しているAccumuloのバージョンは何ですか? – elserj

+0

Accumuloバージョンを含むように答えを更新しました。 – Mack

+0

ありがとう! Btw、私はあなたに新しいバージョンにアップグレードすることを強くお勧めします*。 1.5は*推奨されていません。 – elserj

答えて

2

MapReduceジョブを起動するために使用するAccumuloジャーと、DistributedCacheまたはlibjars CLIオプションを使用してジョブ(マッパー/減速機)を使用するために使用するAccumuloジャーのバージョンが一致していないことが推測されます。

範囲が指定されていないため、AccumuloInputFormatはテーブルのすべてのタブレット境界を自動的に取得し、テーブルにタブレットを持つのと同じ数のRangeInputSplitオブジェクトを作成します。この分割作成は、ローカルJVM(ジョブの実行依頼時に作成されるJVM)で行われます。これらのRangeInputSplitオブジェクトはシリアル化され、YARNに渡されます。

エラーは、これらのシリアル化されたRangeInputSplitオブジェクトの1つをMapperが取得し、それを逆シリアル化しようとしたときに発生します。 Mapperで実行されているAccumuloのバージョンの読み込みをデシリアライズするのに十分なシリアル化されたデータがないため、これは失敗します。

これはあなたのバージョンのAccumuloでのシリアライゼーションエラーである可能性があります(それを分けてください)が、このようなエラーについては聞き取れません。私はローカルクラスパスとMapperクラスパス上のAccumuloのバージョンに違いがあると思います。

+0

瓶のミスマッチのアイデアは私には大変な意味があります。しかし、実際に私が使用しているjarファイルとの依存関係をパッケージ化しているわけではありません。私はaccumuloの 'tool.sh'スクリプトでjarファイルを実行しています。これはAccumuloをインストールしたjarファイルをクラスパスにロードします。これは、そのスクリプトによって読み込まれているjarファイルと環境設定が悪い場合の衝突の可能性を排除しません。 – 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

関連する問題