Los tres mosqueteros del aprendizaje automático de Spark: RDD, DataFrame y API de conjunto de datos

Las tres herramientas principales para que Spark procese datos a gran escala de manera efectiva son RDD, DataFrame y Dataset API. Aunque cada API tiene sus propias ventajas, el nuevo cambio de paradigma admite Dataset como una API de datos unificada para cumplir con todos los requisitos de procesamiento de datos en una única interfaz.

La nueva API de conjunto de datos Spark 2.0 es una colección de objetos de dominio con seguridad de tipos que se pueden convertir en paralelo mediante operaciones funcionales u operaciones relacionales (similar al filtro, mapa y mapa plano () de RDD, etc.). Para compatibilidad con versiones anteriores, Dataset tiene una vista llamada DataFrame, que es una colección de filas sin tipo. En este capítulo, demostraremos 3 conjuntos de API. La figura 3-1 resume las ventajas y desventajas de los componentes clave de Spark para el procesamiento de datos.

 

Figura 3-1

Debido a la expansión del algoritmo o razones históricas, los desarrolladores de aprendizaje automático avanzado deben comprender y poder usar las 3 API sin ningún problema. Aunque recomendamos que todos los desarrolladores migren a la API de conjunto de datos avanzada, aún necesita saber cómo usar la programación RDD para el sistema central de Spark. Por ejemplo, los bancos de inversión y los fondos de cobertura a menudo leen revistas líderes como aprendizaje automático, planificación matemática, finanzas, estadísticas o inteligencia artificial, y luego escriben código en API de bajo nivel para obtener una ventaja competitiva.

3.1.1 RDD: ¿dónde empieza todo?

RDD API es un conjunto de herramientas clave que los desarrolladores de Spark deben utilizar. También proporciona un control de datos de bajo nivel y un paradigma de programación funcional. El poder de RDD también dificulta el uso de muchos programadores nuevos. Aunque la API de RDD y las técnicas de optimización manual son relativamente fáciles de entender, escribir código de alta calidad aún requiere práctica a largo plazo.

Cuando los archivos, bloques o estructuras de datos se convierten a RDD, los datos se dividen en muchas unidades más pequeñas llamadas "particiones" (similares a las divisiones en Hadoop) y se distribuyen en una gran cantidad de nodos, de modo que se puedan paralelizar al mismo tiempo. operando. Para datos a gran escala, Spark actualmente proporciona muchas funciones y los desarrolladores no necesitan ninguna codificación adicional. El marco manejará todos los detalles y los desarrolladores pueden concentrarse en escribir código sin preocuparse por los datos.

Si desea comprender mejor el ingenio y la belleza del RDD subyacente, debe consultar los documentos originales del RDD. Esta es la mejor manera de dominar este contenido.

Hay muchos tipos de RDD disponibles en Spark para simplificar la programación. La figura 3-2 describe parte de la clasificación de RDD. Se recomienda que los programadores de Spark conozcan al menos los tipos de RDD existentes, incluso los RDD menos conocidos como RandomRDD, VertexRDD, HadoopRDD, JdbcRDD y UnionRDD para evitar problemas de codificación innecesarios.

 

Figura 3-2

3.1.2 DataFrame: la evolución natural de la unificación de API y SQL mediante API de alto nivel

Desde la era del laboratorio AMPlab de Berkeley, la comunidad de desarrolladores de Spark se ha comprometido a proporcionar a la comunidad API de alto nivel fáciles de usar. Cuando Michael Armbrust proporcionó el optimizador SparkSQL y Catalyst a la comunidad, la siguiente evolución de la API de datos comenzó a materializarse. El optimizador utiliza una interfaz SQL simple y fácil de entender para permitir que Spark realice la visualización de datos. La API de DataFrame es una evolución natural que usa SparkSQL al organizar los datos en columnas (como tablas relacionales).

La API de DataFrame usa SQL para el procesamiento de datos y puede ser utilizada por muchos científicos y desarrolladores de datos que estén familiarizados con DataFrame en R (data.frame) o Python / Pandas (pandas.DataFrame).

3.1.3 Conjunto de datos: una API de datos unificada avanzada

El conjunto de datos es una colección inmutable de objetos, modelados / mapeados a patrones relacionales tradicionales. Como método preferido en el futuro, hay 4 atributos para distinguir. En particular, encontramos que la API de conjunto de datos es muy atractiva porque su uso es similar a los operadores de conversión que se usan comúnmente en RDD (como filter (), map (), flatMap (), etc.). El conjunto de datos seguirá un paradigma de ejecución diferida similar al RDD. Una de las mejores formas de unificar DataFrame y Dataset es tratar DataFrame como un alias para Dataset [Row].

1. Seguridad de tipo fuerte

La API de conjunto de datos unificada tiene funciones de seguridad en tiempo de compilación (error de sintaxis) y en tiempo de ejecución, que no solo brindan asistencia a los desarrolladores de aprendizaje automático durante el desarrollo, sino que también previenen accidentes en tiempo de ejecución. Los desarrolladores que usan DataFrame o RDD Lambda en Scala o Python comprenderán y apreciarán mejor esta nueva contribución de la comunidad Spark y Databricks cuando encuentren errores inesperados en tiempo de ejecución (los datos son defectuosos).

2. Gestión de la memoria de tungsteno

Tungsten permite que Spark exprima el rendimiento del hardware al límite (es decir, utilice la interfaz sun.misc.Unsafe). El codificador asigna objetos JVM a un formato de tabla (consulte la Figura 3-3). Si usa la API de conjunto de datos, Spark asignará objetos de JVM al formato binario interno fuera del montón de Tungsten, que es más eficiente. Aunque los detalles de las funciones internas de Tungsten están más allá del alcance del manual de aprendizaje automático, las pruebas comparativas muestran que el uso de la administración de memoria fuera del montón es más efectivo que los objetos JVM. Vale la pena mencionar que el concepto de administración de memoria fuera del montón siempre ha sido inherente a Apache Flink antes de que se usara en Spark. Desde Spark 1.4, 1.5, 1.6 hasta el Spark 2.0 actual, los desarrolladores de Spark se han dado cuenta de la importancia del proyecto Tungsten. Aunque enfatizamos que DataFrame será compatible en el momento de escribir este artículo y se ha presentado en detalle (la mayoría de los sistemas de producción todavía son versiones anteriores a Spark 2.0), lo alentamos a que comience a explorar y pensar en el paradigma de Dataset. La figura 3-3 muestra la hoja de ruta de cómo evolucionan RDD, DataFrame y Dataset con el proyecto Tungsten.

3. Codificador

El codificador es el marco de serialización y deserialización (es decir, SerDe) en Spark 2.0. El codificador puede procesar sin problemas la asignación de objetos JVM al formato de tabla. El codificador puede obtener la información subyacente y modificarla según sea necesario (nivel de experto).

A diferencia de la serialización estándar de Java y otras soluciones de serialización (como Kryo), el codificador Spark no utiliza la reflexión en tiempo de ejecución para detectar objetos internos para la serialización en tiempo real. Por el contrario, el código del compilador de Spark se genera durante la compilación y se compila en el código de bytes del objeto especificado, lo que agiliza la operación de serialización y deserialización del objeto. El mecanismo de reflexión en tiempo de ejecución de los objetos internos (como buscar campos y formatos) provocará una sobrecarga adicional. Este mecanismo no existe en Spark 2.0. Pero si es necesario, Kryo, la serialización estándar de Java o cualquier otra tecnología de serialización aún se puede usar como una opción de configuración (ejemplos extremos y compatibilidad con versiones anteriores).

 

Figura 3-3

Los codificadores para objetos y tipos de datos estándar (compuestos por tipos de datos estándar) están disponibles actualmente en Tungsten. El uso de un programa de referencia rápido e informal, en comparación con los codificadores, el uso del mecanismo de serialización de Kryo para serializar objetos de un lado a otro (una práctica popular de los desarrolladores de Hadoop MapReduce) tiene una mejora de eficiencia de 4 a 8 veces. Cuando miré más profundamente en el código fuente, descubrí que el codificador en realidad usa la generación de código en tiempo de ejecución (a nivel de código de bytes) para empaquetar y desempaquetar objetos. En aras de la integridad, solo necesita saber que el tamaño de los objetos generados por el codificador Spark parece ser más pequeño, pero más detalles y explicaciones de las razones están más allá del alcance de este libro.

El codificador [T] es un componente interno de Dataset [T], que es solo un modo de registro. Si es necesario, puede personalizar el codificador utilizando tuplas de datos básicos (como Long, Double e Int). Antes de comenzar a personalizar el codificador (como almacenar objetos personalizados en el conjunto de datos [T]), asegúrese de haber verificado los archivos Encoders.scala y SQLImplicits.scala en el directorio de código fuente de Spark. En el plan y la dirección estratégica de Spark, se proporcionarán API públicas en versiones futuras.

4. Optimizador de catalizador amigable

Con Catalyst, las acciones de la API se pueden convertir en planes de consulta lógica representados por catálogo (funciones definidas por el usuario) y los planes de consulta lógica se pueden convertir en planes físicos. Este método es más eficiente que usar el modo original (incluso si groupBy () se coloca antes de filter (), Catalyst puede ser lo suficientemente inteligente como para intercambiar las dos primeras funciones). Para obtener una explicación más clara, consulte la Figura 3-4.

 

Figura 3-4

Para los usuarios que usan Spark 2.0 o versiones anteriores, tenga en cuenta los siguientes puntos.

  • SparkSession es ahora el único punto de entrada del sistema, SQLContext y HiveContext han sido reemplazados por SparkSession.
  • Para los usuarios de Java, asegúrese de reemplazar DataFrame con Dataset <Row>.
  • Utilice la nueva interfaz de catálogo a través de SparkSession para ejecutar cacheTable (), dropTempView (), createExternalTable (), ListTable (), etc.
  • Para las API de DataFrame y Dataset: unionALL () ha sido abandonado y union () debe usarse ahora; explode () debe reemplazarse con functions.explode () y select () o flatMap (); registerTempTable ha quedado obsoleto y reemplazado por createOrReplaceTempView ().

Este artículo es un extracto de "Spark machine learning combat"

Proporciona una solución integral para las API de aprendizaje automático de Apache y Spark, con pasos claros y explicaciones detalladas, lo que ayuda a los lectores a aprender algoritmos prácticos de aprendizaje automático y a usar Spark para practicar rápidamente.

Este libro proporciona una solución integral para la API de aprendizaje automático de Apache Spark. No solo presenta los conocimientos básicos necesarios para completar las tareas de aprendizaje automático con Spark, sino que también incluye algunas habilidades avanzadas en el aprendizaje automático de Spark. El libro tiene 13 capítulos. A partir de la configuración del entorno, presenta sucesivamente bibliotecas de álgebra lineal, mecanismos de procesamiento de datos, estrategias comunes para construir sistemas de aprendizaje automático, regresión y clasificación, uso de Spark para implementar motores de recomendación, aprendizaje no supervisado, algoritmos de descenso de gradientes y árboles de decisión. Y el uso de modelos integrados, reducción de dimensionalidad de datos, análisis de texto y Spark Steaming.

Este libro está preparado para aquellos desarrolladores de Scala que dominan la tecnología de aprendizaje automático y es especialmente adecuado para lectores que carecen de experiencia práctica en Spark. Este libro asume que el lector ha dominado los conceptos básicos de los algoritmos de aprendizaje automático y tiene cierta experiencia práctica en la implementación de algoritmos de aprendizaje automático utilizando Scala. Pero los lectores no están obligados a comprender la biblioteca Spark ML y su ecosistema de antemano.

Supongo que te gusta

Origin blog.csdn.net/epubit17/article/details/108383636
Recomendado
Clasificación