You are on page 1of 44

Jess

Fernndez Bes
MLG 3JUN2013

ndice
1. Instrucciones de instalacin
2. Visin general de Spark
3. PySpark
1. Uso interacIvo
2. Uso standalone

4. Uso de Spark en nuestro cluster


5. Integracin con Amazon EC2
6. Conclusiones
7. Referencias

INSTRUCCIONES DE INSTALACIN

Instrucciones de instalacin:
Prerrequisitos
Java & Python 2.7
SCALA (Versin 2.9)
Descarga Scala 2.9.2. (Spark necesita Scala para funcionar aunque
programemos en Python pero ATENCIN no es compaIble con la
lIma versin de Scala 2.10).
h^p://www.scala-lang.org/downloads/distrib/les/scala-2.9.2.tgz
Descomprime Scala donde desees.

GIT
Por alguna razn, en Mac OSx necesitas el git.
h^ps://code.google.com/p/git-osx-installer/

Instrucciones de instalacin:
Instalacin de Spark
Descarga la lIma versin de Spark (0.7) de la pgina web.
Versiones anteriores no se pueden usar con Python.
h^p://www.spark-project.org/download-spark-0.7.0-sources-tgz
Descomprime Spark donde desees.
Ahora es necesario o bien que Scala est en el path o mejor
jar una nueva variable de estado SCALA_HOME.
En la carpeta conf dentro del root de spark y crear ah un chero
spark-env.sh (se puede uIlizar para ello la planIlla que hay en el
directorio spark-env.sh.template, cambindole el nombre y en el
chero aadir: spark-env.sh
if [ -z "$SCALA_HOME" ] ; then
SCALA_HOME=<scala-path>

Instrucciones de instalacin:
Instalacin de Spark (2)
Desde el directorio raiz de Spark ejecuta la siguiente instruccin que
compilar Spark y descargar lo que le haga falta para instalarlo.

$ sbt/sbt package


Comprobaciones (desde el raiz de Spark)
$ ./spark-shell

cuando se te abra la shell interacIva escribe sc . Salir ( Ctlr + D )

$ ./pyspark
al igual que antes, cuando se te abra la shell interacIva escribe sc. Salir ( Ctlr + D )
$ ./run spark.examples.SparkPi local

Debera ejecutar el programa de ejemplo que calcula Pi. Deben salir una serie de
mensajes y al nal de todo el valor de pi (o una aproximacin razonable)

DESCRIPCIN Y UTILIZACIN DE
SPARK

Qu es Spark?
Spark es una infraestructura paralela con:

PrimiIvas ecientes para comparIr datos en memoria.


APIs en Scala, Java, SQL y Python.
Aplicable a muchos problemas emergentes.

MapReduce simplic el anlisis de datos en clusters


grandes y sujetos a fallos. Hoy los usuarios quieren
ms:
Aplicaciones ms complejas, iteraDvas (p.e. Machine
learning, graph algorithms).
Consultas ad-hoc ms interacDvas.
Procesado de ujo en Dempo real.

Memoria distribuida tolerante a fallos


Necesario trabajar
en memoria de
manera distribuida
para ser ecientes.

Pero entonces
Como recuperarse
ante fallos?

Solucin:
Resilient Distributed Datasets (RDD)

RDDs
Coleccin parIcionada inmutable de registros.
Se crean a parIr de transformaciones de cheros
Hadoop u otros RDD.
Tiene informacin sobre lineage. Permite recuperarse
ante fallos.
Permite cierto control sobre el parGcionado y la
persistencia.

Resilient Distributed Datasets: A Fault-Tolerant Abstraction for
In-Memory Cluster Computing
Matei Zaharia, Mosharaf Chowdhury, Tathagata Das, Ankur Dave, Justin Ma,
Murphy McCauley, Michael J. Franklin, Scott Shenker, Ion Stoica
University of California, Berkeley

Abstract

tion, which can dominate application execution times.

PrimiIvas Spark
Dos Ipos.
Transformaciones: RDD RDD
Acciones: RDD resultado
TransformaDons
map
atMap
lter
groupBy
join
()

AcDons
count
reduce
collect
()

Spark Streaming
Tratamiento de ujos de datos
en pseudo Iempo-real.
Aplicaciones |picas:
Procesar Twi^er.
EstadsIcas y
monitorizacin de siIos
web.

live data stream

batches of X seconds

ObjeIvos:

Escalable a grandes clusters.


Latencias de segundos.
Modelo simple de
programacin.
Integracin con procesado
en bloque e interacIvo.
Tolerancia a fallos.

Spark
Streaming

processed results

Spark

Nueva Abstraccin:
Dstream
Secuencia de RDDs que representa un
ujo de datos.

Shark
Extensin de Hive para
hacerlo compaIble con
Spark.
Sistema de almacn de
datos (data warehouse).
Permite hacer consultas
Ipo SQL.
Hasta 100% ms rpido que
Hive.
ConverIrlos en RDDs.
Usar Spark sobre ellos.

Programacin
API en Scala, Java y Python:
Originalmente en Scala (Recomendado).
En Java slo modo standalone.
Python aadido recientemente (02/2013).
Se puede uIlizar modo interacDvo o standalone.
No se puede uIlizar con Spark Stream (Desarrollo
futuro).
Permite uIlizar cualquier biblioteca Python: numpy,
scipy... (????)

PySpark: Uso InteracIvo


Vamos a uIlizar el dataset de libros que
uIlizamos en el nltk.
Abrir la consola interacIva en python
$./pyspark

[ $./spark-shell (si quisiramos usar Scala) ]
Variable sc conIene un SparkContext.
Objeto que sabe como interactuar con el cluster
y permite crear RDDs a parIr de cheros o
colecciones de python.

Sintaxis Python lambda


Python soporta el denir mini-funciones
annimas de una lnea sobre la marcha.
Originalmente en Lisp
[ lambda variable: operacin ]
>>> g = lambda x: x**2
>>> g(3)
9

Muy Il dentro de lter, map, reduce.

>>> words.lter(lambda w: w.startswith(a))

Ejercicio Pyspark interacIvo


Construir RDDs a parIr de un chero
(directorio)
>>>
Ver los primeros campos del registro
>>>

Ejercicio Pyspark interacIvo


Construir RDDs a parIr de un chero
(directorio)
>>> bookLines = sc.textFile('books')
Ver los primeros campos del registro
>>> bookLines.take(10)

Ejercicio Pyspark interacIvo


Construir RDDs a parIr de un chero (directorio)
>>> bookLines = sc.textFile('books')
Ver los primeros campos del registro
>>> bookLines.take(10)

Un poco feo, no?. Vamos a mostrarlo un poco


ms limpio
>>>
Otras acciones
>>>
>>>

Ejercicio Pyspark interacIvo


Construir RDDs a parIr de un chero (directorio)
>>> bookLines = sc.textFile('books')
Ver los primeros campos del registro
>>> bookLines.take(10)

Un poco feo, no?. Vamos a mostrarlo un poco


ms limpio
>>> for line in bookLines.take(10): print line
Otras acciones
>>> bookLines.count()
>>> bookLines.collect()

Ejercicio Pyspark interacIvo (2)


Pasar de lista de lneas a lista de palabras para
contar nmero de palabras.
1. Transformar RDD: atMap or map?
>>>

2. Contar las palabras


>>>

Ejercicio Pyspark interacIvo (2)


Pasar de lista de lneas a lista de palabras para
contar nmero de palabras.
1. Transformar RDD: atMap or map?
>>> bookWords1 = bookLines.map( lambda x: x.split(' ') )
>>> bookWords1.take(50)
>>>

2. Contar las palabras


>>>

Ejercicio Pyspark interacIvo (2)


Pasar de lista de lneas a lista de palabras para
contar nmero de palabras.
1. Transformar RDD: atMap or map?
>>> bookWords1 = bookLines.map( lambda x: x.split(' ') )

>>> bookWords1.take(50)
>>> bookWords2 = bookLines.atMap( lambda x: x.split(' ') )
>>> bookWords2.take(50)
>>> bookWords2.take(50)
>>>

2. Contar las palabras


>>>

Ejercicio Pyspark interacIvo (2)


Pasar de lista de lneas a lista de palabras para
contar nmero de palabras.
1. Transformar RDD: atMap or map?
>>> bookWords1 = bookLines.map( lambda x: x.split(' ') )

>>> bookWords1.take(50)
>>> bookWords2 = bookLines.atMap( lambda x: x.split(' ') )
>>> bookWords2.take(50)
>>> bookWords2.take(50)
>>> bookWords = bookWords2.cache()
>>> bookWords2.take(50)

2. Contar las palabras


>>>

Ejercicio Pyspark interacIvo (2)


Pasar de lista de lneas a lista de palabras para
contar nmero de palabras.
1. Transformar RDD: atMap or map?
>>> bookWords1 = bookLines.map( lambda x: x.split(' ') )

>>> bookWords1.take(50)
>>> bookWords2 = bookLines.atMap( lambda x: x.split(' ') )
>>> bookWords2.take(50)
>>> bookWords2.take(50)
>>> bookWords = bookWords2.cache()
>>> bookWords2.take(50)

2. Contar las palabras


>>> bookWords.count()

MapReduce en Spark
map( func )
Return a new distributed dataset formed by passing each element of the source through a
funcIon func.
atMap( func )
Similar to map, but each input item can be mapped to 0 or more output items (so func should
return a Seq rather than a single item).
reduce( func )
Aggregate the elements of the dataset using a funcIon func (which takes two arguments and
returns one). The funcIon should be commutaIve and associaIve so that it can be computed
correctly in parallel.
reduceByKey( func )
When called on a dataset of (K, V) pairs, returns a dataset of (K, V) pairs where the values for
each key are aggregated using the given reduce funcIon.

Ejercicio Pyspark interacIvo (3)


Calcula la lnea de longitud mxima

>>>

Muestra las lneas de longitud mxima
>>>

Ejercicio Pyspark interacIvo (3)


Calcula la lnea de longitud mxima

>>> linesMax = bookLines.map(lambda line: len(line.split(' '))).reduce(max)

Muestra las lneas de longitud mxima
>>>

Ejercicio Pyspark interacIvo (3)


Calcula la lnea de longitud mxima

>>> linesMax = bookLines.map(lambda line: len(line.split(' '))).reduce(max)

Muestra las lneas de longitud mxima
>>> bookLines.lter(lambda line: len(line.split(' '))==linesMax ).collect()

Ejercicio Pyspark interacIvo (4)


Ms MapReduce: WordCount
A parIr de los cheros extraer pares
(palabra,conteo)
En primer lugar hace falta importar el operador
suma para usarlo de manera funcional

>>> from operator import add

A parIr del RDD de palabras bookWords:

1. Map: Generar pares (w,1)


2. Reduce: sumar aquellos pares que tengan la misma
clave w.

Ejercicio Pyspark interacIvo (4)


1. Map: Generar pares (w,1)
2. Reduce: sumar aquellos pares que tengan la misma
clave w.


Mostrar el resultado
>>>

>>>

Ejercicio Pyspark interacIvo (4)


1. Map: Generar pares (w,1)
2. Reduce: sumar aquellos pares que tengan la misma
clave w.


Mostrar el resultado

>>> counts = bookWords.map(lambda x: (x,1) ).reduceByKey(add).cache()

>>>

Ejercicio Pyspark interacIvo (4)


1. Map: Generar pares (w,1)
2. Reduce: sumar aquellos pares que tengan la misma
clave w.


Mostrar el resultado

>>> counts = bookWords.map(lambda x: (x,1) ).reduceByKey(add).cache()

>>> counts.take(50)
>>> for pair in counts.take(50): print pair

Modo standalone
Hacer programas completos que se
ejecuten en bloque en lugar de en la
consola interacIva.

Invocacin |pica:
./pyspark le.py <master> <inputs>
[En local ./pyspark le.py local
<inputs> ]

Dos pasos bsicos:
1. importar SparkContext
from pyspark import SparkContext
2. Crear SparkContext en el nodo
master, nombre del trabajo [y
dependencias que hay que enviar al
nodo.]
sc = SparkContext(sys.argv[1], job",
pyFiles=['MyFile.py', 'lib.zip', 'app.egg])

wordCount.py
import sys
from operator import add

from pyspark import SparkContext


if __name__ == "__main__":
if len(sys.argv) < 3:
print >> sys.stderr, \
"Usage: PythonWordCount <master> <le>"
exit(-1)

sc = SparkContext(sys.argv[1], "PythonWordCount")
lines = sc.textFile(sys.argv[2], 1)

counts = lines.atMap(lambda x: x.split(' ')) \
.map(lambda x: (x, 1)) \
.reduceByKey(add)
output = counts.collect()
for (word, count) in output:
print "%s : %i" % (word, count)

Ejemplos ML de Pyspark
Junto con Spark hay una serie de ejemplos de
algoritmos Ipo ML:
Regresin LogsIca
Kmeans
ALS

Tienen graves errores de programacin


logisDc_regression.py
for i in range(1, ITERATIONS + 1):
print "On iteraIon %i" % i

gradient = points.map(lambda p:
(1.0 / (1.0 + exp(-p.y * np.dot(w, p.x)))) * p.y * p.x ).reduce(add)
w -= gradient

Spark en nuestro cluster


Funciona sobre el gestor de recursos Apache
Mesos. CompaIble con Hadoop.
Dos formas principales de acceder:
Ordenador personal. Necesario instalar
bibliotecas Mesos.
h^p://spark-project.org/docs/latest/running-on-mesos.html

Conectndose primero a amaterasu.tsc.uc3m.es .


Spark en nuestro cluster (2)


Conectarse a amaterasu
ssh amaterasu

Invocar desde all Spark en el masternode del cluster:


10.0.12.18:5050 o subserver1.tsc.uc3m.es:5050
Modo interacDvo:
MASTER=mesos://10.0.12.18:5050 /usr/local/spark/pyspark

Modo standalone:
Introducir mesos://10.0.12.18:5050 como primer parmetro del
programa:
/usr/local/spark/pyspark example.py mesos://10.0.12.18:5050
<params>

Ver trabajos acIvos -> En el navegador 10.0.12.18:5050


Spark en nuestro cluster (3)


cmo subir cheros para procesar y descargar resultados?
UIlizar el Hadoop FileSystem (HDFS).

Ver instrucciones de Harold


h^p://www.tsc.uc3m.es/~miguel/MLG/adjuntos/Hadoop.pdf (pag. 12)

$ hadoop --cong conf_cluster dfs -put src dest


$ hadoop --cong conf_cluster dfs -copyFromLocal src dest
$ hadoop --cong conf_cluster dfs -get src dest
$ hadoop --cong conf_cluster dfs copyToLocal

A la hora de leer el chero uIlizar la URL correcta:


sc.textFile(hdfs://<namenode>:8080/path)

UIlizar un directorio accesible desde el cluster:


/export/clusterdata

Spark provee de scripts para lanzar trabajos


directamente a Amazon ElasIc Compute Cloud
(EC2).
Conguran automIcamente Mesos, Spark y
HDFS en el clster para I.
Necesario pagar Computo ($0,260 por instancia/
hora para la predeterminada) + Coste de
almacenamiento.
Muy fcil de usar.
Grants!!!! h^p://aws.amazon.com/es/grants/

Registrarse en Amazon Web


Services (AWS).
h^p://aws.amazon.com/es/

En la pantalla principal de mi
cuenta crear Claves de acceso.
Pestaa de credenciales de
seguridad.

Antes de ejecutar los scripts


Ienes que jar las variables de
estado AWS_ACCESS_KEY_ID y
AWS_SECRET_ACCESS_KEY_ID a
esos valores.

Generar par de claves:

Accede a tu consola
AWS y all entra en el
servicio EC2.
Selecciona keyPairs y
crea el par
Descargate el chero y
en Linux/Mac Osx
cambiale los permiso a
600
chmod 600
mykey.pem

En el directorio ec2 de spark est el script para


lanzar un cluster, acceder, pararlo, destruirlo.
>>> ./spark-ec2 -k <keypair> -i <key-le> -s <num-slaves> launch <cluster-name>
>>> ./spark-ec2 -k <keypair> -i <key-le> login <cluster-name>
>>> ./spark-ec2 -k <keypair> -i <key-le> -s <num-slaves> launch <cluster-name>
>>> ./spark-ec2 destroy <cluster-name>

Ms detalles aqu.
h^p://spark-project.org/docs/latest/ec2-scripts.html

Conclusiones
Spark propone una infraestructura interesante para
computacin en clusters.

API Scala, Python y Java sencillo. Sobretodo para gente


que sabe programacin funcional.
Modo interacIvo (extraccin rpida de caractersIcas de
grandes datasets).
Funciona bien con procesado secuencial.
Fcil de usar en EC2.

Muy (demasiado) nuevo. Python en febrero de este


ao.
No existe una comunidad de Machine Learning como
Mahout en torno a Spark.

Algunas Referencias
Documentacin ocial de Spark

h^p://spark-project.org/docs/latest/index.html

Mini-Curso del AMPLAB sobre BigData: Spark, Shark y EC2.


h^p://ampcamp.berkeley.edu/big-data-mini-course/

Algunos vdeos con presentaciones de las desarrolladores.


NIPS 2011:
h^ps://www.youtube.com/watch?v=qLvLg-sqxKc
Berkley Analizing Big Data with twi^er (lesson 16):
h^ps://www.youtube.com/watch?v=rpXxsp1vSEs
PyData 2013:
h^p://vimeo.com/63274414

Libro de OReilly en camino (Agosto de 2013):

h^p://shop.oreilly.com/product/0636920028512.do

You might also like