Acabo de crear python lista de range(1,100000).

Utilizando SparkContext realiza los siguientes pasos:

a = sc.parallelize([i for i in range(1, 100000)])
b = sc.parallelize([i for i in range(1, 100000)])

c = a.zip(b)

>>> [(1, 1), (2, 2), -----]

sum  = sc.accumulator(0)

c.foreach(lambda (x, y): life.add((y-x)))

Que da aviso de la siguiente manera:

ARN TaskSetManager: Etapa 3 contiene una tarea de gran tamaño (4644 KB). El máximo recomendado para el tamaño de la tarea es de 100 KB.

Cómo resolver esta advertencia? Es allí cualquier manera de manejar el tamaño? Y también, afectará a la vez la complejidad del big data?

  • Primero de todo, ¿qué es exactamente life? Did you mean sum acumulador? De cualquier forma, no debería ser un problema aquí. Consulte este para obtener más detalles.
InformationsquelleAutor user2959723 | 2015-03-05

3 Comentarios

  1. 4

    La expansión de @leo9r comentario: considere la posibilidad de usar no es un python range, pero sc.range https://spark.apache.org/docs/1.6.0/api/python/pyspark.html#pyspark.SparkContext.range.

    Así evitar la transferencia de la enorme lista de su controlador a los ejecutores.

    De curso, los Ddr se utilizan generalmente para propósitos de prueba, por lo que no desea para ser difundido.

    • el uso de sc.range en lugar de range obras en el juguete ejemplo, pero se pierde en el problema más general (cómo se transmiten los datos entre python y java)
  2. 9

    Chispa de forma nativa se incluye una copia de cada variable durante el envío de la tarea. Para tamaños grandes de estas variables puede que desee utilizar Difusión De Las Variables

    Si usted todavía se enfrentan a problemas de tamaño, Entonces tal vez este tipo de datos debe ser un dispositivo de este tipo en sí mismo

    edit: Actualizado el enlace

    • Hola @Hitesh Dharamdasani, ¿hay alguna forma de cambiar la CHISPA de los archivos de configuración para maximizar el tamaño de la tarea.?
    • Lo siento, llego tarde. spark.apache.org/docs/1.2.0/tuning.html tiene algunas de las recomendaciones de la «Serialización de Datos» de la sección. pero su general, no se recomienda. He tenido algo de éxito con el kyro serializador pero no es algo de lo que presumir. Difusión de las variables son mejores
    • qué hacer si la variable no es serialisable (y por lo tanto tendrás que utilizar los operadores como mapPartitions)? Creo que no puede ser envuelto en el interior de una emisión de la variable.
    • Solo para aclarar esta respuesta un poco más. La variable que se va a más de 100 KB en el ejemplo es [i for i in range(1, 100000)]
  3. 7

    La idea general es que PySpark crea como muchos procesos java que no son los ejecutores, y luego envía los datos para cada proceso. Si hay muy pocos procesos, una memoria de cuello de botella que sucede en el espacio del montón java.

    En su caso, el error específico es que el RDD que creó con sc.parallelize([...]) no se especifica el número de partición (argumento numSlices, ver la docs). Y el RDD valores predeterminados para un número de partición que es demasiado pequeño (posiblemente está constituido por una sola partición).

    Para resolver este problema, basta con especificar el número de particiones que quería:

    a = sc.parallelize([...], numSlices=1000)   # and likewise for b
    

    Como se especifica más y más alto número de sectores, se observa una disminución en el tamaño indicado en el mensaje de advertencia. Aumentar el número de rebanadas hasta que no obtenga más mensaje de advertencia. Por ejemplo,

    Stage 0 contains a task of very large size (696 KB). The maximum recommended task size is 100 KB
    

    significa que usted necesita para especificar más sectores.


    Otro consejo que puede ser útil cuando se trata de problemas de memoria (pero esto no está relacionado con el mensaje de advertencia): por defecto, la memoria disponible para cada ejecutor es de 1 GB o así. Puede especificar cantidades mayores a través de la línea de comandos, por ejemplo, con --executor-memory 64G.

    • ¿Cómo puedo determinar el mejor número de sectores a usar? A partir de su ejemplo parece que 7 es necesario para mantener cada uno de menos de 100 KB. Aunque ¿cómo puedo determinar cuál es el tamaño de la tarea?
    • Como usted escribió, usted sabrá si el tamaño es demasiado alto a través de mensaje de advertencia (blabla contains a task of very large size..) – yo no conozco ninguna otra manera de obtener esta información antes de intentar.

Dejar respuesta

Please enter your comment!
Please enter your name here