Red de conocimiento informático - Problemas con los teléfonos móviles - Conjunto de datos elásticos distribuidos Spark RDD

Conjunto de datos elásticos distribuidos Spark RDD

Un rdd es un conjunto de datos distribuidos resilientes que representa elementos de datos inmutables que se pueden particionar para su procesamiento en paralelo.

rdd es una descripción general del método de generación de datos y el método de flujo de cálculo iterativo. Puede generarse a partir de una memoria estable u otros RDD y no requiere una transformación apresurada, solo un flujo iterativo de datos único en un RDD específico. RDD realiza un seguimiento de sus propias dependencias para evitar la pérdida de datos y puede regenerarse nuevamente a través de relaciones "consanguíneas". Los usuarios también tienen la opción de colocar datos en RDD que se reutilizan con frecuencia y se rehacen si se pierden datos.

Resumen de las características de rdd:

La memoria compartida distribuida es un lector y escritor de grano fino que puede leer y escribir en cada unidad de almacenamiento. Su coherencia requiere que el programa la mantenga. , y su tolerancia a fallas requiere establecer puntos de control y revertir el programa. Sin embargo, RDD es más adecuado para tareas de lectura y escritura por lotes porque es inmutable, de lectura y escritura de grano grueso y puede utilizar el mecanismo de "línea de sangre" para restaurar datos, lo que reduce la sobrecarga de establecer puntos de control. En caso de falla, solo se volverá a calcular la parte faltante de la partición. Por otro lado, la inmutabilidad de los RDD permite que el sistema utilice tareas alternativas (como mapreduce) para reemplazar tareas de ejecución lenta sin interferir entre sí.

Además, RDD también aprovecha las características de la memoria distribuida y puede optimizar las operaciones de procesamiento por lotes de acuerdo con la ubicación de los datos, mejorando así el rendimiento. Al cargar datos, el rendimiento de un rdd se degrada suavemente cuando la memoria es insuficiente y las particiones que no se pueden cargar en la memoria se pueden almacenar en el disco.

Los 5 puntos anteriores son las interfaces implementadas por rdd all, que también son las funciones de rdd all.

Como se muestra en el código fuente anterior, RDD proporciona una función abstracta para particiones, a saber, protected def getPartitions: el número de particiones en el RDD representa la granularidad de concurrencia del cálculo.

Los usuarios pueden especificar el número de particiones que ejecutarán ellos mismos. Si no se especifica, se utilizará el número predeterminado de particiones.

Como puede ver en el código fuente, si no ingresa el número de particiones, el número predeterminado de particiones es defaultParallelism, que es defaultParallelism = math.max(totalCoreCount.get(),2 ), por lo que el valor mínimo es 2, el valor máximo es la cantidad de núcleos en el host.

HadoopRDD es un rdd que lee archivos hdfs. HadoopRDD utiliza la API MapReduce.

spark.sparkContext.textFile(" hdfs://user/local/admin.text ") en textFile es el método para leer archivos hdfs.

textFile es un RDD que lee datos de todos los nodos del sistema de archivos distribuido HDFS y devuelve una cadena.

Resuma las reglas de partición de HadoopRDD:

1. Si textFile especifica el número de particiones como 0 o 1 (el valor predeterminado de MinPartitions es 1), entonces habrá tantas particiones como haya. archivos.

2. Si no se especifica el número predeterminado de particiones y el número predeterminado de particiones es 2, entonces todos los archivos se dividirán por el tamaño de bytes totalSize por el número de particiones y el valor de goalSize, y luego compare goalSize con el tamaño de bloque especificado por hdfs (128M aquí), use el goalSize más pequeño como tamaño de corte.

Al cortar cada archivo, si el archivo es más grande que goalSize, se generará una partición (fileSize/goalSize) Si los datos del archivo no se pueden dividir por el número de particiones + 1, entonces (fileSize/goalSize) + 1.

3. Si el número especificado de particiones es mayor o igual a 2, el número predeterminado de particiones es el valor especificado y las reglas reales para el número de particiones generadas son las mismas que 2.

Para resumir: si el tamaño total del archivo dividido por el número de particiones es mayor que el tamaño del bloque, está relacionado con el tamaño del bloque; de ​​lo contrario, está relacionado con el cociente de ingresos.

La ubicación preferida de rdd devuelve la información de ubicación de cada partición. Sigue el concepto de informática móvil e intenta asignar cálculos a la máquina donde se encuentran los datos.

Las operaciones RDD son operaciones de grano grueso. El RDD se convierte para formar un nuevo RDD. El nuevo RDD forma una relación de dependencia con el RDD original y mantiene la tolerancia a fallas a través de esta relación "sanguínea".

Como puedes ver, mapRDD tiene OneToOneDependency y su padre es ParallelCollectionRDD.

Como puedes ver, groupRDD tiene ShuffleDependency y su padre es MapPartitionsRDD. groupbykey es un operador que requiere barajar y es una amplia dependencia.

Spark representa los tipos de dependencias entre RDD a través de las clases que crea, NarrowDependency representa dependencias estrechas y ShuffleDenpendency representa dependencias amplias. Los detalles se detallarán en capítulos posteriores.

Del código fuente del RDD anterior, podemos encontrar que hay una función de cálculo () en cada RDD, que se utiliza para implementar cálculos de partición específicos del RDD.

def compute(split: Partition, context: TaskContext): Iterador[T]

El valor de retorno de compute es un iterador de las particiones, y esta función se llamará para cada una dividir. En realidad, el cálculo no se realiza hasta antes del operador de acción.

Partitioner se refiere a la función de partición de Spark. Las dos funciones más utilizadas son HashPartitioner y RangePartitioner, seguidas de CoalescedPartitioner, que es una función de partición que reduce el número de particiones. La partición es un concepto que existe sólo en pares clave-valor (K,V). El concepto de partición solo existe en RDD de pares clave-valor (K, V), y el particionador de RDD sin valor clave es Ninguno.

La función de partición determina el número de particiones del RDD en sí y también determina la base para cortar cada partición en la salida de MapOut en Shuffle.

HashPartitioner calculará key.hascode%numpartitions para la clave de los datos y colocará el valor calculado en la partición correspondiente, para que los datos se puedan distribuir a las particiones de manera más uniforme.

RangePartitioner: Es el particionador que se utilizará en el algoritmo de ordenación. Es un particionador para operadores de clasificación como sortbykey, sortby, orderby, etc. El particionador primero toma muestras de los valores clave de los datos de entrada para estimar la distribución de los valores clave y luego divide el rango de acuerdo con el orden especificado, tratando de distribuir uniformemente los valores clave en el rango correspondiente a cada partición.

Los operadores en rdd se pueden dividir en dos tipos, uno es el operador de conversión y el otro es el operador de acción.

1. Transformación: operador de transformación. Esta transformación no activa el envío del trabajo y completa el proceso intermedio del trabajo.

2.Acción: operador, activa SparkContext para enviar un trabajo.

2.