Kryoシリアライザがバッファにメモリを割り当てる方法を理解するのに役立ちます。
私のSparkアプリは、ワーカーからドライバーに約122Mbのデータを収集しようとすると、収集ステップで失敗します。
com.esotericsoftware.kryo.KryoException: Buffer overflow. Available: 0, required: 57197
at com.esotericsoftware.kryo.io.Output.require(Output.Java:138)
at com.esotericsoftware.kryo.io.Output.writeBytes(Output.Java:220)
at com.esotericsoftware.kryo.io.Output.writeBytes(Output.Java:206)
at com.esotericsoftware.kryo.serializers.DefaultArraySerializers$ByteArraySerializer.write(DefaultArraySerializers.Java:29)
at com.esotericsoftware.kryo.serializers.DefaultArraySerializers$ByteArraySerializer.write(DefaultArraySerializers.Java:18)
at com.esotericsoftware.kryo.Kryo.writeObjectOrNull(Kryo.Java:549)
at com.esotericsoftware.kryo.serializers.DefaultArraySerializers$ObjectArraySerializer.write(DefaultArraySerializers.Java:312)
at com.esotericsoftware.kryo.serializers.DefaultArraySerializers$ObjectArraySerializer.write(DefaultArraySerializers.Java:293)
at com.esotericsoftware.kryo.Kryo.writeClassAndObject(Kryo.Java:568)
at org.Apache.spark.serializer.KryoSerializerInstance.serialize(KryoSerializer.scala:161)
at org.Apache.spark.executor.Executor$TaskRunner.run(Executor.scala:213)
この例外は、ドライバーのメモリを3Gbに、エグゼキューターのメモリを4Gbに、kryoserializerのバッファーサイズを増やした後に表示されます(Spark 1.3)を使用しています)
conf.set('spark.kryoserializer.buffer.mb', '256')
conf.set('spark.kryoserializer.buffer.max', '512')
バッファーを十分に大きく設定したようですが、sparkアプリがクラッシュし続けます。ExecutorでKryoバッファーを使用しているオブジェクトを確認するにはどうすればよいですか?クリーンアップする方法はありますか?
私の場合、問題は最大バッファサイズに間違ったプロパティ名を使用していたことです。
=Spark version 1.3 まで)プロパティ名はspark.kryoserializer.buffer.max.mb
です-".mb
"最後に。ただし、 Spark 1.4 docs -spark.kryoserializer.buffer.max
のプロパティ名を使用しました。
その結果、sparkアプリはデフォルト値-64MBを使用していました。そして、処理していたデータ量には十分ではありませんでした。
プロパティ名をspark.kryoserializer.buffer.max.mb
に修正した後、アプリは正常に動作しました。
conf.set('spark.kryoserializer.buffer.max.mb', 'val')
を使用してkryoserializer
バッファーを設定し、val
は2048未満でなければならないことに注意してください。そうしないと、バッファーが2048MB未満であることを示すエラーが再び表示されます。
解決策は、セットアップすることですspark.kryoserializer.buffer.max
から1g
in spark-default.conf
および再起動sparkサービス
これは少なくとも私にとってはうまくいきました。
spark 1.5.2を使用していますが、同じ問題が発生しました。設定spark.kryoserializer.buffer.max.mb
から256に修正しました。
今spark.kryoserializer.buffer.max.mb
は非推奨です
警告spark.SparkConf:構成キー 'spark.kryoserializer.buffer.max.mb'はSpark 1.4の時点で廃止予定であり、将来削除される可能性があります。新しいキー 'を使用してください代わりにspark.kryoserializer.buffer.max '。
あなたはむしろ使うべきです:
import org.Apache.spark.SparkConf
val conf = new SparkConf()
conf.set("spark.kryoserializer.buffer.max", "val")