martes, junio 10, 2014

Primeros pasos con Apache Spark. Un contador de palabras en Scala y Spark

¿Qué es Apache Spark?

Spark es un motor para analítica de datos open source hecho como un framework de Scala y que pertenece al ecosistema de Hadoop, entre otras cosas, por hacer uso del HDFS (Hadoop Distributed File System).

Algunas de sus principales virtudes son que resulta mas fácil de usar que Hadoop MapReduce así como puede resultar computacionalmente mucho mas rápido en ciertos casos.

Su principal característica diferenciadora si lo comparamos con Hadoop MapReduce es que Spark realiza los cálculos en "in-memory" para alcanzar esas velocidades de cómputo superiores hasta 100 veces mas rápido que Hadoop MapReduce en memoria y hasta 10 veces mas rápido en disco.

Instalación

Lo primero será descargar Apache Spark desde la web oficial: http://spark.apache.org/ Para el propósito de este tutorial, y para guardar relación con el resto de tutoriales que usan Hadoop 1.2.1, vamos a descargar la versión binaria para Hadoop 1, escrito en la sección de descargas como "Download binaries for Hadoop 1 (HDP1, CDH3)"

Una vez descargado, extraemos y entramos en el directorio de se acaba de crear (opcional: vamos también a cambiar el nombre de la carpeta a simplemente "spark" para mejor legibilidad) Nosotros vamos a descargarlo e instalarlo en $HOME/spark

wget http://d3kbcqa49mib13.cloudfront.net/spark-0.9.1-bin-hadoop1.tgz
tar -zxvf spark-0.9.1-bin-hadoop1.tgz
mv spark-0.9.1-bin-hadoop1.tgz spark-0.9.1-bin-hadoop1 spark
cd spark
pwd
/home/ubuntu/spark

Bien, ahora vamos a exportar tanto la carpeta bin dentro de la instalación como el home de Spark y también vamos a compilar y ensamblar el paquete:


# Exportar directorios
export PATH=$PATH:$HOME/spark/bin
export SPARK_HOME=$HOME/spark

# Compilar y ensamblar
sbt/sbt clean compile
sbt/sbt assembly

# OPCIONAL: Agregar SPARK_HOME a nuestro ~/.bashrc o similar
echo 'export SPARK_HOME=$HOME/spark' >> ~/.bashrc

NOTA: Para agregar la ruta de spark/bin al PATH lo mas facil y seguro es abrir directamente el ~/.bashrc con un editor de textos y buscar la linea donde pone "export $PATH". Ahora tendremos que ejecutar nuestro cluster de Hadoop en modo pseudo-distribuido o distribuido (real). Si aun no sabes como montar un cluster de Hadoop con HDFS, que es en realidad lo que va a usar Spark, aquí puedes encontrar un gran tutorial al respecto: Instalando Hadoop en modo pseudo-distribuido

# Arrancar todos los procesos de Hadoop
$HADOOP_INSTALL/bin/start-all.sh

Primeras pruebas

Una vez tengamos todos los procesos corriendo: NameNode, SecondaryNameNode, JobTracker (para el nodo master) y TaskTracker y DataNode (para los esclavos o workers), ya podemos ejecutar Spark. Aun así, vamos a comprobar la correcta instalación de Spark iniciando uno de los ejemplos que vienen. Para ello nos vamos a la raiz donde hemos instalado spark (en nuestro caso $HOME/spark) y ejecutamos:

bin/run-example org.apachebin/run-example org.apache.spark.examples.SparkPi local 50

El resultado, como suele ser habitual, contiene un montón de mensajes de log. Veremos ir pasando cada una de las 50 iteraciones pero, en algún punto ya al final, aparecerá algo como:
Pi is roughly 3.1419392
Lo cual nos indica el éxito de la operación.

El siguiente paso es escribir nuestro ya famoso contador de palabras. En Spark se puede Scala, Java y Python. Para este tutorial vamos a usar Scala ya que es el lenguaje "nativo" para Spark y es el que más funcionalidades soporta. Mas adelante haŕe algún ejemplo también en Python.


import org.apache.spark.{SparkContext, SparkConf}

object WordCount {
  def main(args: Array[String]) {


    val conf = new SparkConf(true)
    conf.setAppName("cassandra-example-hello")
    conf.setMaster("local")

    val spark = new SparkContext(conf)

    val textFile = spark.textFile("/tmp/test")
    val counts = textFile.flatMap(line => line.split(" "))
      .map(word => (word, 1))
      .reduceByKey(_ + _)
    counts.saveAsTextFile("/tmp/testResult")
  }
}

#Resultado
res10: Array[(String, Int)] = Array((y,1), (palabras,1), (a,2), (este,1), (Spark,1), (de,2), (contar,1), (usar,1), (capacidades,1), (las,2), (fichero.,1), (Vamos,2), (HDFS,1))

# Opcional: Guardar los contenidos del resultado en el disco
reducer.saveAsTextFile("results")


Espero que os haya gustado el tutorial. Los próximos tutoriales sobre Spark estarán orientado a la escritura de scripts, el uso de la API de Python y Java, al uso de HDFS y al uso de Apache Shark

0 comentarios:

Publicar un comentario