CURSO: APACHE SPARK CAPÍTULO 3: SPARK CONCEPTOS BÁSICOS www.formacionhadoop.com
Índice 1 Introducción a Spark 2 3 Spark Shell 2.1 SparkContext Introducción a RDDs (Resilient Distributed Datasets) 3.1 Creación de un RDD 3.2 Operaciones de un RDD 3.3 Ejecución de operaciones (Lazy Execution) 2
ÍNDICE Introducción a Spark
Apache Spark es el motor de procesamiento de datos con mayor velocidad del mercado. Gracias a el vamos a poder aprovechar todos los beneficios que nos ofrece un cluster Hadoop incrementando su rendimiento con esta gran tecnología de procesamiento de datos inmemory. Spark está desarrollado con el lenguaje de programación Scala. Gracias a esto Spark se ejecuta en la JVM. Spark Shell: Como muchas de las herramientas del ecosistema Hadoop, Spark dispone de su propia Shell para poder ejecutar sentencias y realizar procesamientos de datos. Aplicación Spark: En Spark también es posible realizar nuestras propias aplicaciones. Estas aplicaciones son destinadas a largos procesamientos de datos. Estas aplicaciones pueden ser escritas en Python, Scala o Java. 4
ÍNDICE Spark Shell
La Shell de Spark nos va a permitir interactuar con Spark y realizar procesamientos de datos más sencillos. La creación de aplicaciones se verá a lo largo del curso. Existen dos tipos de Shell: - Python Shell: pyspqrk - Scala Shell: spark-shell 6
2.1 SparkContext SparkContext es la parte principal del API de Spark. Sobre este objecto realizaremos todas las operaciones. SparkContext representa la conexión al cluster Spark, y se puede utilizar para crear DDR, acumuladores y variables de radiodifusión en ese cluster. En la imagen anterior observamos la llamada al SparContext a través de la Shell de python. El objeto context en el caso de la Shell ya está configurado. Para la creación de aplicaciones en Spark el desarrollador deberá instanciar y configurar el SparkContext (Esto lo veremos con más detalle a lo largo del curso). 7
ÍNDICE Introducción a RDDs (Resilient Distributed Datasets)
Spark gira en torno al concepto de un conjunto de datos resistente distribuido (RDDs), que es una colección de alta disponibilidad de elementos que puedan ser explotados en forma paralela. Hay dos formas de crear RDDs: Paralelización de una colección existente en el driver del programa, o que hacen referencia a un conjunto de datos en un sistema de almacenamiento externo, como puede ser un sistema de ficheros compartido, HDFS, HBase, o cualquier fuente de datos queofrezca unhadoop InputFormat. A continuación podemos ver las características más importantes de los RDDs: - Resistente: Si los datos en memoria son perdidos, existe la posibilidad de recuperarlos ( lo veremos a lo largo del curso) - Distribuido: Los datos son almacenados a lo largo del cluster: Programación paralela con Spark (lo veremos a lo largo del curso) 9
3.1 Creación de un RDD Como ya hemos comentado anteriormente, existen varias formas de generar nuestros RDDs: - Obtener datos de un fichero - Obtener datos que tengamos almacenados en memoria - Obtener los datos de otro RDD Creación de un RDD de un fichero de texto: A través de SparkContext.textFile podemos realizar las siguientes acciones: Carga de un fichero: sc.textfile( mifichero.txt ) Carga de varios ficheros: sc.textfile( misdatos/*.log ) Carga de una lista de ficheros: sc.textfile( fichero1.txt,fichero2.txt ) Cada una de las líneas de los ficheros es cargada en un registro diferente en nuestro RDD. - Uri de ficheros: - Ruta absoluta: file:/home/formacionhadoop/fichero.txt - Ruta relativa (usa el sistema de ficheros por defecto): fichero.txt En caso de no especificar un sistema de ficheros (por ejemplo, "file: /") Spark asumirá el URI es relevante al sistema de ficheros por defecto. En el caso de la CDH Spark el sistema de ficheros por defecto es el HDFS. 10
3.2 Operaciones de un RDD Existen dos tipos de operaciones en los RDDs: - Acciones (devuelven un valor): Algunas de estas acciones son: - count(): Devuelve el número de elementos del RDD - take(n): Devuelve un array con los primeros n elementos del RDD - collect(): Devuelve un array con todos los elementos del RDD - saveastextfile(fichero): Guarda el RDD en el fichero de salida - Transformaciones (genera otro RDD basado en el actual): Los RDDs son inmutables: No es posible modificar los datos de un RDD, para realizar esto habrá que ir transformando los RDDs secuencialmente. Algunas de estas transformaciones son: - map(function): Crea un nuevo RDD ejecutando la función en cada registro del RDD. - filter(function): Crea un nuevo RDD incluyendo o excluyendo los registros del RDD acorde con la función boolean. 11
3.2 Operaciones de un RDD Ejemplo de las transformaciones map y filter: 12
3.3 Ejecución de operaciones (Lazy Execution) Los datos de un RDD no son procesados hasta que una acción es ejecutada: En la imagen anterior el procesamiento de los datos no se realizará hasta que ejecutemos una acción, en este caso vamos a ejecutar una acción de tipo count(). datos = sc.textfile( fichero.txt ) result = datos.map(lambda line: line.upper()) resultfilter = result.filter(lambda line: line.startswith( A )) resultfilter.count() Es posible realizar las transformaciones concatenando las instrucciones: Datos = sc.textfile( ficheros.txt ).map(lambda line:line.upper()).filter(lambda line: \ line.startswith( A )).count() 13
Contacto administracion@formacionhadoop.com www.formacionhadoop.com TWITTER Twitter.com/formacionhadoop FACEBOOK Facebook.com/formacionhadoop LINKEDIN linkedin.com/company/formación-hadoop 14