2016-07-27 10 views
2

大したものではない地図(テキストファイルとしてHDFSに保存したとき〜70 MB)をブロードキャストしようとしましたが、メモリエラーが発生しました。 11Gにドライバメモリを増やし、11Gにエグゼキュータメモリを増やそうとしましたが、それでも同じエラーが発生しました。 memory.fractionは0.3に設定されており、1G未満のデータもキャッシュされません。Spark:オブジェクトをブロードキャストしているときにメモリが不足しています

マップが約2 MBの場合、問題はありません。私はオブジェクトを放送するときにサイズの制限があるのだろうかと思う。より大きな地図を使用してこの問題を解決するにはどうすればよいですか?ありがとうございました!

Exception in thread "main" java.lang.OutOfMemoryError: Java heap space 
    at java.util.IdentityHashMap.resize(IdentityHashMap.java:469) 
    at java.util.IdentityHashMap.put(IdentityHashMap.java:445) 
    at org.apache.spark.util.SizeEstimator$SearchState.enqueue(SizeEstimator.scala:159) 
    at org.apache.spark.util.SizeEstimator$.visitArray(SizeEstimator.scala:229) 
    at org.apache.spark.util.SizeEstimator$.visitSingleObject(SizeEstimator.scala:194) 
    at org.apache.spark.util.SizeEstimator$.org$apache$spark$util$SizeEstimator$$estimate(SizeEstimator.scala:186) 
    at org.apache.spark.util.SizeEstimator$.estimate(SizeEstimator.scala:54) 
    at org.apache.spark.util.collection.SizeTracker$class.takeSample(SizeTracker.scala:78) 
    at org.apache.spark.util.collection.SizeTracker$class.afterUpdate(SizeTracker.scala:70) 
    at org.apache.spark.util.collection.SizeTrackingVector.$plus$eq(SizeTrackingVector.scala:31) 
    at org.apache.spark.storage.MemoryStore.unrollSafely(MemoryStore.scala:278) 
    at org.apache.spark.storage.MemoryStore.putIterator(MemoryStore.scala:165) 
    at org.apache.spark.storage.MemoryStore.putIterator(MemoryStore.scala:143) 
    at org.apache.spark.storage.BlockManager.doPut(BlockManager.scala:801) 
    at org.apache.spark.storage.BlockManager.putIterator(BlockManager.scala:648) 
    at org.apache.spark.storage.BlockManager.putSingle(BlockManager.scala:1006) 
    at org.apache.spark.broadcast.TorrentBroadcast.writeBlocks(TorrentBroadcast.scala:99) 
    at org.apache.spark.broadcast.TorrentBroadcast.<init>(TorrentBroadcast.scala:85) 
    at org.apache.spark.broadcast.TorrentBroadcastFactory.newBroadcast(TorrentBroadcastFactory.scala:34) 
    at org.apache.spark.broadcast.BroadcastManager.newBroadcast(BroadcastManager.scala:63) 
    at org.apache.spark.SparkContext.broadcast(SparkContext.scala:1327) 

編集: はコメントに応じてより多くの情報を追加します。

  • 私は火花提出クライアントモードでコンパイルしたjarファイルを提出することを使用しています。 1.5.0
  • spark.yarn.executor.memoryOverhead 600
  • セット( "spark.kryoserializer.buffer.max"、 "256メートル")
  • セット( "spark.speculation"、 "真")
  • スパーク
  • セット( "spark.storage.memoryFraction"、 "0.3")
  • セット( "spark.driver.memory"、 "15G")
  • セット( "spark.executor.memory"、 "11G")
  • 私はset( "spar.sql.tungsten.enabled"、 "false")を試しましたが、それは役に立ちません。
  • マスタマシンには60Gのメモリがあります。 Spark/Yarnには約30Gが使用されています。私はヒープサイズがどれくらいの仕事量であるのかよく分かりませんが、同時に他のプロセスは進んでいません。特にマップは約70MBです。

放送に関連するいくつかのコード:

val mappingAllLocal: Map[String, Int] = mappingAll.rdd.map(r => (r.getAs[String](0), r.getAs[Int](1))).collectAsMap().toMap 
// I can use the above mappingAll to HDFS, and it's around 70MB 
val mappingAllBrd = sc.broadcast(mappingAllLocal) // <-- this is where the out of memory happens 
+1

ヒープサイズとその他のパラメータはどれくらい設定できますか?もう少し説明してください。あなたの仕事をどのように提出していますか?あなたが問題を抱えている場所のコードも少しありますか? – ChikuMiku

+0

@ChikuMikuありがとう!私はちょうど詳細を私の質問を編集しました。 – EXP0

+0

あなたは糸で提出していますか?もしあなたが持っている多くのDNとあなたのコンテナの最大サイズは何ですか? – ChikuMiku

答えて

5

はクライアントモードには影響しません。ドライバーのヒープサイズを増やすには、アプリケーションをサブミットするときにコマンドラインパラメーター--conf="spark.driver.memory=15G"を使用する必要があります。

+0

ありがとうございました!できます! set( "spark.driver.memory"、 "15G")がクライアントモードに影響しないことをどのようにして知ることができますか?クライアントモードに影響を与えないその他の設定はありますか?ありがとう! – EXP0

+0

[Sparkのドキュメント](http://spark.apache.org/docs/latest/configuration.html#application-properties)に記載されています – Dikei

+0

ありがとうございました!私はその文書をもっと慎重に読むべきだった。 – EXP0

0

をあなたはJVMのヒープサイズを増やしてみてくださいすることができます:set("spark.driver.memory", "15G")を使用して

-Xmx2g : max size of 2Go 
-Xms2g : initial size of 2Go (default size is 256mo) 
+0

ありがとうございます!私はこの解決策を試しませんでした。私はまずDiskeiのソリューションを試しました。 – EXP0

関連する問題