Pregunta Spark 1.4 aumenta la memoria maxResultSize


Estoy usando Spark 1.4 para mi investigación y luchando con la configuración de memoria. Mi máquina tiene 16 GB de memoria, así que no hay problema, ya que el tamaño de mi archivo es de solo 300 MB. Aunque, cuando intento convertir Spark RDD en dataframe de panda usando toPandas() función que recibo el siguiente error:

serialized results of 9 tasks (1096.9 MB) is bigger than spark.driver.maxResultSize (1024.0 MB)

Traté de arreglar esto cambiando el archivo spark-config y aún obteniendo el mismo error. Escuché que este es un problema con la chispa 1.4 y me pregunto si sabrá cómo resolver esto. Cualquier ayuda es muy apreciada.


25
2018-06-25 18:51


origen


Respuestas:


Puedes establecer spark.driver.maxResultSize parámetro en el SparkConf objeto:

from pyspark import SparkConf, SparkContext

# In Jupyter you have to stop the current context first
sc.stop()

# Create new config
conf = (SparkConf()
    .set("spark.driver.maxResultSize", "2g"))

# Create new context
sc = SparkContext(conf=conf)

Probablemente deberías crear un nuevo SQLContext también:

from pyspark.sql import SQLContext
sqlContext = SQLContext(sc)

35
2018-06-25 19:01



Desde la línea de comando, como con pyspark, --conf spark.driver.maxResultSize=3g también se puede usar para aumentar el tamaño de resultado máximo.


17
2018-03-25 22:17



Sintonización spark.driver.maxResultSize es una buena práctica teniendo en cuenta el entorno de funcionamiento. Sin embargo, no es la solución a su problema ya que la cantidad de datos puede cambiar cada cierto tiempo. Como @ @ Zia-Kayani mencionó, es mejor recopilar datos sabiamente. Entonces, si tienes un DataFrame df, entonces puedes llamar df.rdd y hacer todo el material mágico en el clúster, no en el controlador. Sin embargo, si necesita recopilar los datos, sugeriría:

  • No encienda spark.sql.parquet.binaryAsString. Los objetos de cadena toman más espacio
  • Utilizar spark.rdd.compress para comprimir RDD cuando los recolectas
  • Intenta recogerlo usando la paginación. (código en Scala, de otra respuesta Scala: cómo obtener un rango de filas en un marco de datos)

    long count = df.count() int limit = 50; while(count > 0){ df1 = df.limit(limit); df1.show(); //will print 50, next 50, etc rows df = df.except(df1); count = count - limit; }


6
2017-10-26 16:01



Parece que estás recopilando el RDD, por lo que definitivamente recogerá todos los datos en el nodo del controlador y por eso te enfrentas a este problema. Debe evitar recopilar datos si no es necesario para un rdd, o si es necesario, especifique spark.driver.maxResultSize. hay dos formas de definir esta variable

1 - crea Spark Config configurando esta variable como
conf.set("spark.driver.maxResultSize", "3g")
  2 - o establece esta variable   en spark-defaults.conf archivo presente en la carpeta conf de chispa. me gusta    spark.driver.maxResultSize 3g y reinicia la chispa.


5
2018-06-25 19:12



También hay un error de Spark https://issues.apache.org/jira/browse/SPARK-12837  eso da el mismo error

 serialized results of X tasks (Y MB) is bigger than spark.driver.maxResultSize

aunque es posible que no esté extrayendo datos al controlador explícitamente.

SPARK-12837 soluciona un error de chispa de que los acumuladores / variables de difusión anteriores a Spark 2 se extrajeron al controlador, lo que causaba este problema.


2
2017-12-16 22:05



al iniciar el trabajo o la terminal, puede usar

--conf spark.driver.maxResultSize="0"

para eliminar el cuello de botella


1
2018-04-28 16:28