web-dev-qa-db-ja.com

KryoシリアライザがSparkでバッファを割り当てる方法

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バッファーを使用しているオブジェクトを確認するにはどうすればよいですか?クリーンアップする方法はありますか?

13
vvladymyrov

私の場合、問題は最大バッファサイズに間違ったプロパティ名を使用していたことです。

=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に修正した後、アプリは正常に動作しました。

7
vvladymyrov

conf.set('spark.kryoserializer.buffer.max.mb', 'val')を使用してkryoserializerバッファーを設定し、valは2048未満でなければならないことに注意してください。そうしないと、バッファーが2048MB未満であることを示すエラーが再び表示されます。

2
dnivog

解決策は、セットアップすることですspark.kryoserializer.buffer.maxから1g in spark-default.confおよび再起動sparkサービス

これは少なくとも私にとってはうまくいきました。

2
lambzee

spark 1.5.2を使用していますが、同じ問題が発生しました。設定spark.kryoserializer.buffer.max.mbから256に修正しました。

1
Mayukh

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")
1
Ignacio Alorre