web-dev-qa-db-fra.com

Espace de mémoire Java OutOfMemoryError dans pyspark spark-submit?

J'ai une taille de fichier de 10 Go (exemple Test.txt).

J'ai écrit mon script pyspark comme ci-dessous (Test.py):

from pyspark import SparkConf
from pyspark.sql import SparkSession
from pyspark.sql import SQLContext
spark = SparkSession.builder.appName("FilterProduct").getOrCreate()
sc = spark.sparkContext
sqlContext = SQLContext(sc)
lines = spark.read.text("C:/Users/test/Desktop/Test.txt").rdd
lines.collect()

Ensuite, j'exécute le script ci-dessus à l'aide de la commande ci-dessous:

spark-submit Test.py --executor-memory  12G 

Alors je reçois une erreur comme ci-dessous:

17/12/29 13:27:18 INFO FileScanRDD: Reading File path: file:///C:/Users/test/Desktop/Test.txt, range: 402653184-536870912, partition values: [empty row]
17/12/29 13:27:18 INFO CodeGenerator: Code generated in 22.743725 ms
17/12/29 13:27:44 ERROR Executor: Exception in task 1.0 in stage 0.0 (TID 1)
Java.lang.OutOfMemoryError: Java heap space
        at Java.util.Arrays.copyOf(Arrays.Java:3230)
        at Java.io.ByteArrayOutputStream.grow(ByteArrayOutputStream.Java:113)
        at Java.io.ByteArrayOutputStream.ensureCapacity(ByteArrayOutputStream.Java:93)
        at Java.io.ByteArrayOutputStream.write(ByteArrayOutputStream.Java:140)
        at org.Apache.spark.util.ByteBufferOutputStream.write(ByteBufferOutputStream.scala:41)
        at Java.io.ObjectOutputStream$BlockDataOutputStream.drain(ObjectOutputStream.Java:1877)
        at Java.io.ObjectOutputStream$BlockDataOutputStream.setBlockDataMode(ObjectOutputStream.Java:1786)
        at Java.io.ObjectOutputStream.writeObject0(ObjectOutputStream.Java:1189)
        at Java.io.ObjectOutputStream.writeObject(ObjectOutputStream.Java:348)
        at org.Apache.spark.serializer.JavaSerializationStream.writeObject(JavaSerializer.scala:43)
        at org.Apache.spark.serializer.JavaSerializerInstance.serialize(JavaSerializer.scala:100)
        at org.Apache.spark.executor.Executor$TaskRunner.run(Executor.scala:383)
        at Java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.Java:1142)
        at Java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.Java:617)
        at Java.lang.Thread.run(Thread.Java:745)
17/12/29 13:27:44 ERROR Executor: Exception in task 2.0 in stage 0.0 (TID 2)
Java.lang.OutOfMemoryError: Java heap space
        at Java.util.Arrays.copyOf(Arrays.Java:3230)
        at Java.io.ByteArrayOutputStream.grow(ByteArrayOutputStream.Java:113)
        at Java.io.ByteArrayOutputStream.ensureCapacity(ByteArrayOutputStream.Java:93

S'il vous plaît laissez-moi savoir comment résoudre ce problème? 

6
Sai

Vous pouvez essayer --conf "spark.driver.maxResultSize=20g". Vous devriez vérifier les configurations sur spark conf page.spark.Apache.org/docs/latest/configuration.html.

En plus de cette réponse, j'aimerais vous suggérer de réduire le résultat de vos tâches, sinon vous pourriez avoir des problèmes avec la sérialisation.

1
eyildiz

Je vérifie que votre répertoire Apache-spark contient le fichier Apache-spark/2.4.0/libexec/conf/spark-defaults.conf, où 2.4.0 correspond à la version Apache-spark.

Si ce fichier n'existe pas, créez-le.

Puis insérez à la fin du fichier: spark.driver.memory 12g

Cela devrait résoudre sans avoir besoin de --executor-memory 12G: il suffit de faire spark-submit Test.py.

0
Francesco Boi