Spark設定Kryo序列化緩衝區大小
阿新 • • 發佈:2020-01-09
背景
今天在開發SparkRDD的過程中出現Buffer Overflow錯誤,檢視具體Yarn日誌後發現是因為Kryo序列化緩衝區溢位了,日誌建議調大spark.kryoserializer.buffer.max的value,搜尋了一下設定keyo序列化緩衝區的方法,特此整理記錄下來。
20/01/08 17:12:55 WARN scheduler.TaskSetManager: Lost task 1.0 in stage 1.0 (TID 4, s015.test.com, executor 1): org.apache.spark.SparkException: Kryo serialization failed: Buffer overflow. Available: 0, required: 10300408. To avoid this, increase spark.kryoserializer.buffer.max value. at org.apache.spark.serializer.KryoSerializerInstance.serialize(KryoSerializer.scala:315) at org.apache.spark.executor.Executor$TaskRunner.run(Executor.scala:367) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) at java.lang.Thread.run(Thread.java:748)
方法一:通過conf引數設定spark.kryoserializer.buffer.max
spark-submit在提交spark作業時可以帶很多引數,其中有一個引數--conf
可以設定spark.kryoserializer.buffer.max的大小,具體如下。
./bin/spark-submit \ --class <main-class> \ --master <master-url> \ --deploy-mode <deploy-mode> \ --conf spark.kryoserializer.buffer.max=512m \ ... # other options <application-jar> \ [application-arguments]
上面的--conf spark.kryoserializer.buffer.max=512m
即代表把Kryo序列化緩衝區的buffer大小設定為512mb。
方法二:通過程式中拿到sparkConf物件設定spark.kryoserializer.buffer.max
1.設定Kryo為序列化類
//設定Kryo為序列化類(預設為Java序列類)
sparkConf.set("spark.serializer", "org.apache.spark.serializer.KryoSerializer");
2.設定spark.kryoserializer.buffer.max的值
//兩種設定方法
sparkConf.set("spark.kryoserializer.buffer.max", "128m");
sparkConf.set("spark.kryoserializer.buffer.max.mb", "128");
3.檢查是否成功設定Kryo引數
//列印日誌,檢查是否成功設定
System.out.println( sparkConf.get("spark.kryoserializer.buffer.max") );
參考文獻
[1]【大資料進擊】如何設定spark.kryoserializer.buffer.max value
[2]Spark official docs: Submitting Applicati