{ "cells": [ { "cell_type": "markdown", "metadata": {}, "source": [ "# Ipython y Spark para el analisis de datos" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "*Esta notebook fue creada originalmente como un blog post por [Raúl E. López Briega](http://relopezbriega.com.ar/) en [Mi blog sobre Python](http://relopezbriega.github.io). El contenido esta bajo la licencia BSD.*" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Una de las nuevas estrellas en el análisis de datos masivos es [Apache Spark](http://spark.apache.org/). Desarrollado en [Scala](http://www.scala-lang.org/), [Apache Spark](http://spark.apache.org/) es una plataforma de computación de código abierto para el análisis y procesamiento de grandes volúmenes de datos. \n", "\n", "Algunas de las ventajas que nos ofrece [Apache Spark](http://spark.apache.org/) sobre otros [frameworks](http://es.wikipedia.org/wiki/Framework), son:\n", "\n", "* **Velocidad:** Sin dudas la velocidad es una de las principales fortalezas de [Apache Spark](http://spark.apache.org/), como esta diseñado para soportar el [procesameinto en memoria](http://en.wikipedia.org/wiki/In-Memory_Processing), puede alcanzar una performance sorprendente en análisis avanzados de datos. Algunos programas escritos utilizando [Apache Spark](http://spark.apache.org/), pueden correr hasta 100x más rápido que utilizando [Hadoop](http://hadoop.apache.org/).\n", "* **Fácil de usar:** Podemos escribir programas en [Python](http://python.org/), [Scala](http://www.scala-lang.org/) o [Java](http://java.com/en/) que hagan uso de las herramientas que ofrece [Apache Spark](http://spark.apache.org/); asimismo nos permite trabajar en forma interactiva (con [Python](http://python.org/) o con [Scala](http://www.scala-lang.org/)) y su [API](http://es.wikipedia.org/wiki/Interfaz_de_programaci%C3%B3n_de_aplicaciones) es muy fácil de aprender. \n", "* **Generalismo:** El mundo del análisis de datos incluye muchos subgrupos de distinta índole, están los que hacen un análisis investigativo, los que que realizan análisis exploratorios, los que construyen sistemas de procesamientos de datos, etc. Los usuarios de cada uno de esos subgrupos, al tener objetivos distintos, suelen utilizar una gran variedad de herramientas totalmente diferentes. [Apache Spark](http://spark.apache.org/) nos proporciona un gran número de herramientas de alto nivel como [Spark SQL](http://spark.apache.org/sql/), [MLlib](http://spark.apache.org/mllib/) para [machine learning](http://es.wikipedia.org/wiki/Machine_learning), [GraphX](http://spark.apache.org/graphx/), y [Spark Streaming](http://spark.apache.org/streaming/); las cuales pueden ser combinadas para crear aplicaciones multipropósito que ataquen los diferentes dominios del análisis de datos. \n", "\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## RDD o Resilient Distributed Datasets" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "En el corazón de [Apache Spark](http://spark.apache.org/) se encuentran los [RDDs](http://www.cs.berkeley.edu/~matei/papers/2012/nsdi_spark.pdf).\n", "Los [RDDs](http://www.cs.berkeley.edu/~matei/papers/2012/nsdi_spark.pdf) son una abstracción distribuida que le permite a los programadores realizar cómputos [en memoria](http://en.wikipedia.org/wiki/In-Memory_Processing) sobre grandes clusters de computadoras sin errores o pérdidas de información. Están especialmente diseñados para el análisis de datos interactivo ([data mining](http://es.wikipedia.org/wiki/Miner%C3%ADa_de_datos)) y para la aplicación de algoritmos iterativos ([MapReduce](http://es.wikipedia.org/wiki/MapReduce)). En ambos casos, mantener los datos en la memoria puede mejorar el rendimiento en una gran proporción. Para lograr la tolerancia a fallos de manera eficiente, [RDDs](http://www.cs.berkeley.edu/~matei/papers/2012/nsdi_spark.pdf) utiliza una forma restringida de memoria compartida. \n", "Los [RDDs](http://www.cs.berkeley.edu/~matei/papers/2012/nsdi_spark.pdf) son los suficientemente expresivos como para capturar una gran variedad de cálculos." ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Instalando Apache Spark" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Para instalar [Apache Spark](http://spark.apache.org/) en forma local y poder comenzar a utilizarlo, pueden seguir los siguientes pasos:" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "1. En primer lugar, necesitamos tener instalado [Oracle JDK](http://www.oracle.com/technetwork/java/javase/downloads/jdk7-downloads-1880260.html). Para instalarlo en [Ubuntu](http://www.ubuntu.com/) podemos utilizar los siguientes comandos:\n", "
\n",
    "$ sudo add-apt-repository ppa:webupd8team/java\n",
    "$ sudo apt-get update\n",
    "$ sudo apt-get install oracle-jdk7-installer\n",
    "
\n", "\n", "2. Luego nos instalamos las herramientas para trabajar con [Scala](http://www.scala-lang.org/), [SBT](http://www.scala-sbt.org/) con el siguiente comando:\n", "
\n",
    "$ sudo apt-get install sbt\n",
    "
\n", "\n", "3. Después nos descargamos la última versión de [Apache Spark](http://spark.apache.org/) desde [aquí](http://d3kbcqa49mib13.cloudfront.net/spark-1.0.2.tgz)\n", "
\n",
    "4. Ahora descomprimimos el archivo:\n",
    "
\n",
    "$ tar -xvf spark-1.0.2.tgz \n",
    "
\n", "\n", "5. Nos movemos a la carpeta recién descomprimida y realizamos la compilación de [Apache Spark](http://spark.apache.org/) utilizando [SBT](http://www.scala-sbt.org/). (tener paciencia, es sabido que [Scala](http://www.scala-lang.org/) tarda mucho en compilar) \n", "
\n",
    "$ cd spark-1.0.2\n",
    "$ sbt/sbt assembly\n",
    "
\n", "\n", "6. Opcionalmente, para facilitar la utilización de [Apache Spark](http://spark.apache.org/) desde la línea de comando, yo modifique mi archivo .bashrc para incluir los siguientes alias:\n", "
\n",
    "$ echo \"alias ipyspark='IPYTHON_OPTS=\"notebook --pylab inline\" ~/spark-1.0.2/bin/pyspark'\" >> ~/.bashrc\n",
    "$ echo \"alias pyspark='~/spark-1.0.2/bin/pyspark'\" >> ~/.bashrc\n",
    "$ echo \"alias spark='~/spark-1.0.2/bin/spark-shell'\" >> ~/.bashrc\n",
    "
\n", "\n", "7. Ahora simplemente tipeando `pyspark` nos abre el interprete interactivo de [Python](http://python.org/) con [Apache Spark](http://spark.apache.org/), tipeando `spark` nos abre el interprete interactivo de [Scala](http://www.scala-lang.org/), y tipeando `ipyspark` nos abre el [notebook de Ipython](http://ipython.org/notebook.html) integrado con [Apache Spark](http://spark.apache.org/)!\n", "
$ ./bin/pyspark #o pyspark si creamos el alias
\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Ejemplo de utilización de Spark con Ipython" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Ahora llegó el momento de ensuciarse las manos y probar [Apache Spark](http://spark.apache.org/), vamos a hacer el típico ejercicio de wordcounts; en este caso vamos a contar todas las palabras que posee la Biblia en su versión en inglés y vamos a ver cuantas veces aparece la palabra Dios(God). Para esto nos descargamos la versión de la Biblia en texto plano del [proyecto Gutemberg](http://www.gutenberg.org/ebooks/10).\n" ] }, { "cell_type": "code", "execution_count": 1, "metadata": { "collapsed": false }, "outputs": [], "source": [ "# Comenzamos con algunos imports.\n", "# No necesitamos importar pyspark porque ya se autoimporta como sc.\n", "from operator import add\n", "import pandas as pd" ] }, { "cell_type": "code", "execution_count": 2, "metadata": { "collapsed": false }, "outputs": [], "source": [ "lineas = sc.textFile(\"/home/raul/spark-1.0.2/examples/data/Bible.txt\") # usamos la función textFile para subir el texto a Spark" ] }, { "cell_type": "code", "execution_count": 3, "metadata": { "collapsed": false }, "outputs": [], "source": [ "# Mapeamos las funciones para realizar la cuenta de las palabras y generamos el RDD.\n", "cuenta = lineas.flatMap(lambda x: x.split(' ')) \\\n", " .map(lambda x: (x.replace(',' , '').upper(), 1)) \\\n", " .reduceByKey(add)" ] }, { "cell_type": "code", "execution_count": 4, "metadata": { "collapsed": false }, "outputs": [], "source": [ "# Creamos la lista con las palabras y su respectiva frecuencia.\n", "lista = cuenta.collect()" ] }, { "cell_type": "code", "execution_count": 5, "metadata": { "collapsed": false }, "outputs": [], "source": [ "# Creamos un DataFrame de Pandas para facilitar el manejo de los datos.\n", "dataframe = pd.DataFrame(lista, columns=['palabras', 'cuenta'])" ] }, { "cell_type": "code", "execution_count": 6, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/html": [ "
\n", "\n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", " \n", "
palabrascuenta
2867 FATHER 814
7329 GOD 3330
8902 LORD 6448
21404 JESUS 893
\n", "
" ], "text/plain": [ " palabras cuenta\n", "2867 FATHER 814\n", "7329 GOD 3330\n", "8902 LORD 6448\n", "21404 JESUS 893" ] }, "execution_count": 6, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Nos quedamos solo con las palabras que hacen referencia a Dios\n", "god = dataframe[dataframe['palabras'].apply(lambda x: x.upper() in ['GOD', 'LORD', 'JESUS', 'FATHER'])]\n", "god" ] }, { "cell_type": "code", "execution_count": 7, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "" ] }, "execution_count": 7, "metadata": {}, "output_type": "execute_result" }, { "data": { "image/png": "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\nSUVORK5CYII=\n", "text/plain": [ "" ] }, "metadata": {}, "output_type": "display_data" } ], "source": [ "# Realizamos un gráfico de barras sobre los datos\n", "god.set_index('palabras').plot(kind = 'bar')" ] }, { "cell_type": "code", "execution_count": 8, "metadata": { "collapsed": false }, "outputs": [ { "data": { "text/plain": [ "palabras FATHERGODLORDJESUS\n", "cuenta 11485\n", "dtype: object" ] }, "execution_count": 8, "metadata": {}, "output_type": "execute_result" } ], "source": [ "# Realizamos la sumatoria de las 4 palabras combinadas\n", "god.sum()" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "Como demuestra el ejemplo, Dios sería nombrado en la Biblia, ya sea como lord, god, jesus o father; unas 11485 veces!\n" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "## Conclusión" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "[Apache Spark](http://spark.apache.org/) es realmente una herramienta muy prometedora, con ella podemos analizar datos con un rendimiento muy alto y combinado con otras herramientas como [Python](http://python.org/), [Numpy](http://www.numpy.org/), [Pandas](http://pandas.pydata.org/) e [IPython](http://ipython.org/); se convierten en un [framework](http://es.wikipedia.org/wiki/Framework) sumamente completo y efectivo para el análisis de grandes volúmenes de datos en forma muy sencilla.\n", "\n", "Para más información sobre [Apache Spark](http://spark.apache.org/), pueden visitar su la sección de [ejemplos](http://spark.apache.org/examples.html) de su página oficial.\n", "\n", "Espero les haya sido de utilidad este [notebook]((http://ipython.org/notebook.html)).\n", "\n", "Saludos!!" ] }, { "cell_type": "markdown", "metadata": {}, "source": [ "*Este post fue escrito utilizando IPython notebook. Pueden descargar este [notebook](https://github.com/relopezbriega/relopezbriega.github.io/blob/master/downloads/pyspark.ipynb) o ver su version estática en [nbviewer](http://nbviewer.ipython.org/github/relopezbriega/relopezbriega.github.io/blob/master/downloads/pyspark.ipynb).*" ] } ], "metadata": { "kernelspec": { "display_name": "Python 3", "language": "python", "name": "python3" }, "language_info": { "codemirror_mode": { "name": "ipython", "version": 3 }, "file_extension": ".py", "mimetype": "text/x-python", "name": "python", "nbconvert_exporter": "python", "pygments_lexer": "ipython3", "version": "3.4.3+" } }, "nbformat": 4, "nbformat_minor": 0 }