2017-03-24 4 views
-2

MRジョブを作成しました。これは5800個以上の入力ファイルを処理します。 私がそれを始めたとき、それは "スレッドの例外"のメイン "java.lang.OutOfMemoryError:GCオーバーヘッドの限界を超えました"と不安でした。Map ReduceのGCオーバーヘッドの上限を超えています(入力ファイル数が大きい場合)

Exception in thread "main" java.lang.OutOfMemoryError: GC overhead limit exceeded 
    at org.apache.hadoop.security.token.Token.<init>(Token.java:85) 
    at org.apache.hadoop.hdfs.protocol.LocatedBlock.<init>(LocatedBlock.java:52) 
    at org.apache.hadoop.hdfs.protocolPB.PBHelper.convert(PBHelper.java:755) 
    at org.apache.hadoop.hdfs.protocolPB.PBHelper.convertLocatedBlock(PBHelper.java:1174) 
    at org.apache.hadoop.hdfs.protocolPB.PBHelper.convert(PBHelper.java:1192) 
    at org.apache.hadoop.hdfs.protocolPB.PBHelper.convert(PBHelper.java:1328) 
    at org.apache.hadoop.hdfs.protocolPB.PBHelper.convert(PBHelper.java:1436) 
    at org.apache.hadoop.hdfs.protocolPB.PBHelper.convert(PBHelper.java:1445) 
    at org.apache.hadoop.hdfs.protocolPB.ClientNamenodeProtocolTranslatorPB.getListing(ClientNamenodeProtocolTranslatorPB.java:549) 
    at sun.reflect.GeneratedMethodAccessor4.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:606) 
    at org.apache.hadoop.io.retry.RetryInvocationHandler.invokeMethod(RetryInvocationHandler.java:187) 
    at org.apache.hadoop.io.retry.RetryInvocationHandler.invoke(RetryInvocationHandler.java:102) 
    at com.sun.proxy.$Proxy23.getListing(Unknown Source) 
    at org.apache.hadoop.hdfs.DFSClient.listPaths(DFSClient.java:1893) 
    at org.apache.hadoop.hdfs.DistributedFileSystem$15.<init>(DistributedFileSystem.java:742) 
    at org.apache.hadoop.hdfs.DistributedFileSystem.listLocatedStatus(DistributedFileSystem.java:731) 
    at org.apache.hadoop.fs.FileSystem.listLocatedStatus(FileSystem.java:1664) 
    at org.apache.hadoop.mapreduce.lib.input.FileInputFormat.singleThreadedListStatus(FileInputFormat.java:300) 
    at org.apache.hadoop.mapreduce.lib.input.FileInputFormat.listStatus(FileInputFormat.java:264) 
    at org.apache.hadoop.mapreduce.lib.input.SequenceFileInputFormat.listStatus(SequenceFileInputFormat.java:59) 
    at org.apache.hadoop.mapreduce.lib.input.FileInputFormat.getSplits(FileInputFormat.java:385) 
    at org.apache.hadoop.mapreduce.JobSubmitter.writeNewSplits(JobSubmitter.java:589) 
    at org.apache.hadoop.mapreduce.JobSubmitter.writeSplits(JobSubmitter.java:606) 
    at org.apache.hadoop.mapreduce.JobSubmitter.submitJobInternal(JobSubmitter.java:490) 
    at org.apache.hadoop.mapreduce.Job$10.run(Job.java:1295) 
    at org.apache.hadoop.mapreduce.Job$10.run(Job.java:1292) 
    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:1642) 
    at org.apache.hadoop.mapreduce.Job.submit(Job.java:1292) 

地図-削減のための入力ファイル数の制限があります: は、以下の例外スタックトレースです。 私は1.2GBのメモリでaloeを実行しようとしました

+0

どこでメモリを増やしましたか? OOMは送信時に発生するため、より多くのヒープを必要とするのはクライアントアプリケーションです。 –

+0

私は人々がそれを投票している理由を知りません – Stifler

答えて

0

あなたにはコードは表示されていないので、一般的な話しかできません。

この問題は、のファイル番号のHadoop固有の制限が原因ではありません。ファイルの内容が読み込まれ、ヒープに読み込まれた後に、ファイルの合計サイズが原因である可能性があります。しかし必ずしもそうではない。

ここで実際に起こっていることは、(ほぼ)ヒープを埋めることであり、JVMはあまりにも多くの時間をガベージコレクションに費やしていると判断しました。

  1. ヒープはあなたが解決しようとしている問題の大きさに対して小さすぎる:

    大まかに言えば、この種の問題のための3つの原因があります。

  2. アプリケーションがメモリを非効率的に使用しています。
  3. アプリケーションにメモリリークがあります。

あなたの場合は、まず問題1と仮定します。私は、より少ないファイルで試してみたり、(もっと)大きなヒープを試してみます。これらのいずれかが問題を解決すれば、あなたは(今のところ)実行されますが、明らかにこれは処理できる問題の大きさに縛られます。

これで問題が解決しない場合は、メモリリークを探しているかのように扱います。すなわち、なぜアプリケーションが(あまりにも多くの)メモリを使用するのかを理解する。

1.2Gbは特に大きなヒープではありません。

+0

私はstacktraceから少し判断するのを助けることができます、それは本当に問題のファイルのリストです。小さなファイルがあまりにも多く、ラップトップからJavaのデフォルトヒープサイズで大きな仕事を開始しているMapReduceジョブの一般的な問題です。 –

+0

@ThomasJungblut - 私たちはそれを結論づけることはできません。私たちが安全に結論できるのは、ファイルをリストしているときに問題(GCオーバーヘッドの上限)が検出されたことだけです。実際にはOPには5,800個の入力ファイルがあることがわかります。ファイルのリストが問題ではないことを示唆する傾向があります。今...多分OPはそれについて間違っています。しかし、我々はそれの明確な証拠がありません。 –

+0

申し訳ありませんが、私は、銀行のプロジェクトコードベースとして、コードを共有することはできません。 CSVファイルで入力パスを取得し、それを反復処理してFileInputFormat.addInputPath(job、newPath(inputPath))を呼び出すジョブ初期化クラス(ConfiguredクラスとToolクラスの子クラス)。提供されたすべてのパスに対して私はhttp://stackoverflow.com/questions/42997177/getting-java-lang-outofmemoryerror-gc-overhead-limit-exceeded-while-submitting/43009239#43009239を試しました。 – Stifler

関連する問題