Esta es el arreglo más acertada que encomtrarás dar, sin embargo obsérvala detenidamente y analiza si se puede adaptar a tu proyecto.
Solución:
Cuando Spark lee un archivo de HDFS, crea una sola partición para una sola división de entrada. La división de entrada la establece Hadoop InputFormat
utilizado para leer este archivo. Por ejemplo, si usa textFile()
podría ser TextInputFormat
en Hadoop, que le devolvería una sola partición para un solo bloque de HDFS (pero la división entre particiones se haría en línea, no en la división exacta del bloque), a menos que tenga un archivo de texto comprimido. En el caso de un archivo comprimido, obtendrá una sola partición para un solo archivo (ya que los archivos de texto comprimidos no se pueden dividir).
Cuando usted llama rdd.repartition(x)
realizaría una mezcla de los datos de N
particiones que tienes en rdd
a x
particiones que desea tener, la partición se realizará por turnos.
Si tiene un archivo de texto sin comprimir de 30 GB almacenado en HDFS, con la configuración predeterminada de tamaño de bloque de HDFS (128 MB) se almacenaría en 235 bloques, lo que significa que el RDD que lea de este archivo tendría 235 particiones. Cuando usted llama repartition(1000)
su RDD se marcaría como para ser repartidopero de hecho se barajará a 1000 particiones solo cuando ejecute una acción sobre este RDD (concepto de ejecución diferida)
Al leer archivos HDFS sin depósito (p. ej., parquet) con spark-sql, la cantidad de particiones de DataFrame df.rdd.getNumPartitions
depende de estos factores:
spark.default.parallelism
(se traduce aproximadamente a #núcleos disponibles para la aplicación)spark.sql.files.maxPartitionBytes
(predeterminado 128 MB)spark.sql.files.openCostInBytes
(predeterminado 4 MB)
Una estimación aproximada del número de particiones es:
-
Si usted tiene suficientes núcleos para leer todos sus datos en paralelo (es decir, al menos un núcleo por cada 128 MB de sus datos)
AveragePartitionSize ≈ min(4MB, TotalDataSize/#cores)
NumberOfPartitions ≈ TotalDataSize/AveragePartitionSize -
si no tienes suficientes núcleos,
AveragePartitionSize ≈ 128MB
NumberOfPartitions ≈ TotalDataSize/AveragePartitionSize
Los cálculos exactos son un poco complicados y se pueden encontrar en el código base de FileSourceScanExec, consulte aquí.
Aquí está la instantánea de “Cómo se cargan los bloques en HDFS en trabajadores de Spark como particiones“
En estas imágenes, 4 bloques HDFS se cargan como particiones Spark dentro de la memoria de 3 trabajadores
Ejemplo: puse un archivo de texto de 30 GB en el sistema HDFS, que lo distribuye en 10 nodos.
Chispará
a) usar las mismas 10 particiones?
Spark carga los mismos 10 bloques HDFS en la memoria de los trabajadores como particiones. Asumo tamaño de bloque de 30 GB archivo debe ser de 3 GB para obtener 10 particiones/bloques (con configuración predeterminada)
b) ¿repartir 30 GB en el clúster cuando llamo a repartition(1000)?
SíSpark mezcla los datos entre los nodos trabajadores para crear 1000 particiones en la memoria de los trabajadores.
Nota:
HDFS Block -> Spark partition : One block can represent as One partition (by default)
Spark partition -> Workers : Many/One partitions can present in One workers
Reseñas y calificaciones
Agradecemos que quieras asentar nuestra función escribiendo un comentario o valorándolo te damos la bienvenida.