Capítulo 1. Introducción a Spark de Alto Rendimiento
Este trabajo se ha traducido utilizando IA. Agradecemos tus opiniones y comentarios: translation-feedback@oreilly.com
Este capítulo proporciona una visión general de lo que esperamos que puedas aprender de este libro y hace todo lo posible para convencerte de que aprendas Scala. No dudes en pasar al Capítulo 2 si ya sabes lo que buscas y utilizas Scala (o tienes el corazón puesto en otro lenguaje).
Qué es Spark y por qué es importante el rendimiento
Apache Spark es un sistema informático distribuido de propósito general y alto rendimiento que se ha convertido en el proyecto de código abierto Apache más activo, con más de 1.000 colaboradores activos.1 Spark permite procesar grandes cantidades de datos, más allá de lo que cabe en una sola máquina, con una API de alto nivel y relativamente fácil de usar. El diseño y la interfaz de Spark son únicos, y es uno de los sistemas más rápidos de su clase. De forma única, Spark nos permite escribir la lógica de las transformaciones de datos y los algoritmos de aprendizaje automático de una forma que es paralelizable, pero relativamente agnóstica al sistema. Así que a menudo es posible escribir cálculos que sean rápidos para sistemas de almacenamiento distribuido de distinto tipo y tamaño.
Sin embargo, a pesar de sus muchas ventajas y de la excitación en torno a Spark, la implementación más sencilla de muchas rutinas comunes de la ciencia de datos en Spark puede ser mucho más lenta y mucho menos robusta que la mejor versión.Dado que los cálculos que nos ocupan pueden implicar datos a una escala muy grande, el tiempo y los recursos que se obtienen al ajustar el código para el rendimiento son enormes. Rendimiento no sólo significa ejecutar más rápido; a menudo, a esta escala, significa conseguir que algo se ejecute. Es posible construir una consulta Spark que falle en gigabytes de datos pero que, cuando se refactoriza y ajusta teniendo en cuenta la estructura de los datos y los requisitos del clúster, tenga éxito en el mismo sistema con terabytes de datos. En la experiencia de los autores escribiendo código Spark de producción, hemos visto que las mismas tareas, ejecutadas en los mismos clústeres, se ejecutan 100× más rápido utilizando algunas de las optimizaciones tratadas en este libro. En términos de procesamiento de datos, el tiempo es dinero, y esperamos que este libro se amortice mediante una reducción de los costes de infraestructura de datos y de las horas de trabajo de los desarrolladores.
No todas estas técnicas son aplicables a todos los casos de uso. Especialmente porque Spark es altamente configurable y está expuesto a un nivel más alto que otros marcos computacionales de potencia comparable, podemos obtener enormes beneficios con sólo estar más en sintonía con la forma y la estructura de nuestros datos. Algunas técnicas pueden funcionar bien con determinados tamaños de datos o incluso con determinadas distribuciones de claves, pero no con todas. El ejemplo más sencillo de esto puede ser cómo para muchos problemas, utilizar groupByKey
en Spark puede provocar muy fácilmente las temidas excepciones de fuera de memoria, pero para datos con pocos duplicados esta operación puede ser tan rápida como las alternativas que presentaremos. Aprender a comprender tu caso de uso y tu sistema concretos y cómo interactuará Spark con ellos es imprescindible para resolver los problemas de ciencia de datos más complejos con Spark.
Qué puedes esperar de este libro
Nuestra esperanza es que este libro te ayude a tomar tus consultas Spark y hacerlas más rápidas, capaces de manejar datos de mayor tamaño y utilizar menos recursos. Este libro cubre una amplia gama de herramientas y escenarios. Es probable que adquieras algunas técnicas que podrían no aplicarse a los problemas con los que estás trabajando, pero que podrían aplicarse a un problema en el futuro y podrían ayudar a dar forma a tu comprensión de Spark de forma más general. Los capítulos de este libro están escritos con suficiente contexto como para permitir que el libro se utilice como referencia; sin embargo, la estructura de este libro es intencionada y la lectura de las secciones en orden debería proporcionarte no sólo algunos consejos dispersos, sino una comprensión global de Apache Spark y de cómo hacerlo cantar.
Este libro no pretende ser una introducción a Spark ni a Scala; existen otros libros y series de vídeos que te ayudarán a empezar. Puede que los autores sean un poco parciales a este respecto, pero creemos que Learning Spark de Karau, Konwinski, Wendell y Zaharia, así como la serie de vídeos de introducción de Paco Nathan, son excelentes opciones para los principiantes en Spark. Aunque este libro se centra en el rendimiento, no es un libro de operaciones, por lo que no se tratan temas como la configuración de un clúster y la multitenencia. Suponemos que ya tienes una forma de utilizar Spark en tu sistema, por lo que no te proporcionaremos mucha ayuda para tomar decisiones de arquitectura de alto nivel. Hay futuros libros en preparación, de otros autores, sobre el tema de las operaciones de Spark, que pueden estar terminados para cuando leas éste. Si las operaciones son tu especialidad, o si no hay nadie responsable de operaciones en tu organización, esperamos que esos libros puedan ayudarte.
Versiones Spark
Spark sigue el versionado semántico con el estándar [MAYOR].[MENOR].[MANTENIMIENTO] con estabilidad de la API para las API públicas no experimentales y no para desarrolladores dentro de las versiones menores y de mantenimiento.Muchos de estos componentes experimentales son algunos de los más interesantes desde el punto de vista del rendimiento, incluyendo Datasets
-la nueva abstracción de datos estructurada y fuertemente tipada de Spark SQL. Spark también intenta la compatibilidad binaria de la API entre versiones, utilizando MiMa2por lo que, si utilizas la API estable, no deberías tener que recompilar para ejecutar un trabajo con una nueva versión de Spark, a menos que la versión principal haya cambiado.
Consejo
Este libro se ha creado utilizando las API de Spark 2.0.1, pero gran parte del código funcionará también en versiones anteriores de Spark. En los lugares en los que no es así, hemos intentado indicarlo.
¿Por qué Scala?
En este libro, nos centraremos en la API Scala de Spark y asumiremos un conocimiento práctico de Scala. Parte de esta decisión obedece simplemente al interés por el tiempo y el espacio; confiamos en que los lectores que deseen utilizar Spark en otro lenguaje sean capaces de traducir los conceptos utilizados en este libro sin presentar los ejemplos en Java y Python. Y lo que es más importante, los autores creen que el desarrollo "serio" y eficaz de Spark se consigue más fácilmente en Scala.
Para que quede claro, estas razones son muy específicas del uso de Spark con Scala; hay muchos más argumentos generales a favor (y en contra) de las aplicaciones de Scala en otros contextos.
Para ser un experto en Spark tienes que aprender un poco de Scala de todos modos
Aunque Python y Java son lenguajes más utilizados, aprender Scala es una inversión que merece la pena para cualquiera que esté interesado en profundizar en el desarrollo de Spark. La documentación de Spark puede ser irregular. Sin embargo, la legibilidad del código base es de primera clase. Quizás más que con otros marcos, las ventajas de cultivar una comprensión sofisticada de la base de código de Spark son integrales para el usuario avanzado de Spark. Dado que Spark está escrito en Scala, será difícil interactuar con el código fuente de Spark sin la capacidad, al menos, de leer código Scala. Además, los métodos de la clase Conjuntos de Datos Distribuidos Resistentes (RDD) se asemejan mucho a los de la API de colecciones de Scala. Las funciones RDD, como , , , , y , tienen especificaciones casi idénticas a sus equivalentes en Scala. map
filter
flatMap
reduce
fold
3
Fundamentalmente, Spark es un marco funcional, que se basa en gran medida en conceptos como la inmutabilidad y la definición lambda, por lo que utilizar la API de Spark puede resultar más intuitivo con ciertos conocimientos de programación funcional.
La API Spark Scala es más fácil de usar que la API Java
Una vez que hayas aprendido Scala, descubrirás rápidamente que escribir Spark en Scala es menos doloroso que escribir Spark en Java. En primer lugar, escribir Spark en Scala es significativamente más conciso que escribir Spark en Java, ya que Spark se basa en gran medida en definiciones de funciones en línea y expresiones lambda, que están soportadas de forma mucho más natural en Scala (especialmente antes de Java 8). En segundo lugar, el intérprete de comandos de Spark puede ser una poderosa herramienta para la depuración y el desarrollo, y sólo está disponible en lenguajes con REPL existentes (Scala, Python y R).
Scala es más eficaz que Python
Puede resultar atractivo escribir Spark en Python, ya que es fácil de aprender, rápido de escribir, interpretado e incluye un conjunto muy rico de herramientas de ciencia de datos. Sin embargo, el código Spark escrito en Python suele ser más lento que el código equivalente escrito en la JVM, ya que Scala está tipado estáticamente, y el coste de la comunicación de la JVM (de Python a Scala) puede ser muy elevado. Por último, las funcionalidades de Spark se escriben generalmente primero en Scala y luego se traducen a Python, por lo que para utilizar funcionalidades Spark de perímetro, necesitarás estar en la JVM; la compatibilidad de Python con MLlib y Spark Streaming están particularmente retrasadas.
¿Por qué no Scala?
Hay varias buenas razones para desarrollar con Spark en otros lenguajes. Una de las razones constantes más importantes es la preferencia del desarrollador/equipo. El código existente, tanto interno como en bibliotecas, también puede ser una razón de peso para utilizar un lenguaje diferente. Python es uno de los lenguajes más compatibles en la actualidad. Aunque escribir código Java puede ser engorroso y a veces retrasarse ligeramente en términos de API, escribir en otro lenguaje JVM tiene muy poco coste de rendimiento (como mucho algunas conversiones de objetos).4
Consejo
Aunque todos los ejemplos de este libro se presentan en Scala para la versión final, portaremos muchos de los ejemplos de Scala a Java y Python cuando las diferencias de implementación puedan ser importantes. Estarán disponibles (con el tiempo) en nuestro GitHub. Si deseas adaptar un ejemplo concreto, envíanos un correo electrónico o crea una incidencia en el repositorio de GitHub.
Spark SQL hace mucho por minimizar la diferencia de rendimiento cuando se utiliza un lenguaje ajeno a la JVM.El Capítulo 7 examina las opciones para trabajar eficazmente en Spark con lenguajes ajenos a la JVM, incluidos los lenguajes Python y R compatibles con Spark. Esta sección también ofrece orientación sobre cómo utilizar Fortran, C y código específico de la GPU para obtener mejoras de rendimiento adicionales. Aunque estemos desarrollando la mayor parte de nuestra aplicación Spark en Scala, no debemos sentirnos atados a hacerlo todo en Scala, porque las bibliotecas especializadas en otros lenguajes pueden merecer la pena por la sobrecarga que supone salir de la JVM.
Aprender Scala
Si después de todo esto te hemos convencido para que utilices Scala, existen varias opciones excelentes para aprender Scala.Spark 1.6 está construido con Scala 2.10 y compilado de forma cruzada con Scala 2.11, y Spark 2.0 está construido con Scala 2.11 y compilado de forma cruzada con Scala 2.10 hasta Spark 2.3 y podría añadir 2.12 en el futuro.10 hasta Spark 2.3 y puede que añada 2.12 en el futuro. Dependiendo de cuánto te hayamos convencido para aprender Scala, y de cuáles sean tus recursos, hay varias opciones diferentes, desde libros hasta cursos online masivos y abiertos (MOOC) y formación profesional.
En cuanto a libros, Programming Scala, 2ª Edición, de Dean Wampler y Alex Payne puede ser estupendo, aunque gran parte de las referencias al sistema de actores no son relevantes cuando se trabaja en Spark. El sitio web del lenguaje Scala también mantiene una lista de libros sobre Scala.
Además de libros centrados en Spark, hay cursos online para aprender Scala. Principios de Programación Funcional en Scala, impartido por Martin Ordersky, su creador, está en Coursera, así como Introducción a la Programación Funcional en edX. Varias empresas diferentes también ofrecen cursos de Scala basados en vídeo, ninguno de los cuales los autores han experimentado personalmente ni recomiendan.
Para quienes prefieran un enfoque más interactivo, varias empresas ofrecen formación profesional, entre ellas Lightbend (antes Typesafe). Aunque no hemos experimentado directamente la formación de Typesafe, recibe críticas positivas y es conocida especialmente por ayudar a poner al día a un equipo o grupo de personas con Scala para trabajar con Spark.
Conclusión
Aunque es probable que puedas sacar el máximo partido del rendimiento de Spark si tienes conocimientos de Scala, trabajar en Spark no requiere conocimientos de Scala. Para aquellos cuyos problemas se adapten mejor a otros lenguajes o herramientas, en el Capítulo 7 se tratarán técnicas para trabajar con otros lenguajes. Este libro está dirigido a personas que ya conocen los fundamentos de Spark, y te agradecemos que hayas elegido Spark de Alto Rendimiento para profundizar en tus conocimientos sobre Spark. En el siguiente capítulo se presentarán algunos de los paradigmas generales de diseño y evaluación de Spark, que son importantes para comprender cómo utilizar Spark de forma eficiente.
1 En http://spark.apache.org/.
2 MiMa es el Gestor de Migraciones para Scala e intenta detectar incompatibilidades binarias entre versiones.
3 Aunque, como exploramos en este libro, las implicaciones de rendimiento y la semántica de evaluación son bastante diferentes.
4 Por supuesto, en materia de rendimiento, toda regla tiene su excepción. mapPartitions
en Spark 1.6 y anteriores en Java sufre algunas severas restricciones de rendimiento que tratamos en "Transformaciones de Iterador a Iterador con mapPartitions".
Get Chispa de alto rendimiento now with the O’Reilly learning platform.
O’Reilly members experience books, live events, courses curated by job role, and more from O’Reilly and nearly 200 top publishers.