Introducción A Scala
Introducción A Scala
Introducción A Scala
Spark
Meetup
Introduccin
a
Scala
#ApacheSparkMX
@isragaytan
israel.gaytan@vitatronix.net
isragaytan@gmail.com
Hands On
Instalacin
en
su
sistema
Introduccin
a
Scala
Ejercicios
con
Scala
Break
Introduccin
a
Apache
Spark
Ejemplo
de
Scala
con
Apache
Spark
Preguntas
y
Respuestas
Instalacin
hGps://spark.apache.org/downloads.html
Instalacin
en
su
sistema
Descargar
de
ser
posible
en
hGps://spark.apache.org/downloads.html
Descargar
la
versin
1.3.1
prebuilt
para
Hadoop
2.6
Crear
una
carpeta
en
su
sistema
spark1.3
Descomprimir
la
carpeta
y
renombrarla
a
spark1.3
Probando
instalacin
Dirigirse
a
su
carpeta
de
instalacin
de
spark1.3
Ejecutar
bin/spark-shell
Se
abrir
el
shell
de
Apache
Spark
con
Scala
scala
>
Nota:
Scala
es
completamente
descargable
de
hGp://www.scala-lang.org/download/all.html
Introduccin
a
Scala
Scala
es
un
lenguaje
orientado
a
objetos
(OOP)
y
de
programacin
funcional
(FP)
Compila
a
archivos
class
que
empaquetamos
como
JAR
(Java
Archive)
(Maven
o
SBT)
Corre
sobre
la
Java
Virtual
Machine
Creado
por
Mar^n
Odersky
Cada
variable
es
un
objeto
y
cada
operador
es
un
mtodo
hGp://scala-lang.org
Introduccin
a
Scala
Como
corre
sobre
la
JVM
nos
permite
usar
las
libreras
de
Java
SCALA
CAMBIAR
LA
MANERA
EN
QUE
PIENSAS
COMO
PROGRAMAR
Permite
escribir
cdigo
de
manera
concisa
No
te
desesperes
si
no
en^endes
al
principio
Cadenas
Abre
tu
prompt
de
Apache
Spark
(spark1.3)
bin/spark-shell
scala
>
Hola
Mundo
res0:
String
=
Hola
Mundo
scala>
"Hola
scala".getClass.getName
res2:
String
=
java.lang.String
Cadenas
scala>
val
s
=
"Hola
Scala
Meetup"
s:
String
=
Hola
Scala
Meetup
scala>
s.length
res4:
Int
=
17
scala>
s.foreach(println)
H
o
l
Cadenas
Podemos
u^lizar
mtodos
funcionales
como
lter
ej:
scala>
var
result
=
s.lter(_
!=
'l')
result:
String
=
Hoa
Scaa
Meetup
Ver
(StringOps,
StringLike,
WrappedString)
Cadenas
scala>
s1.drop(4).take(2).capitalize
res6:
String
=
Up
scala>
val
s3
=
"hola"
s3:
String
=
hola
scala>
s3
==
"hola"
res8:
Boolean
=
true
Cadenas
scala>
val
mensaje
=
"Apache
Spark
Meetup".map(c
=>c.toUpper)
mensaje:
String
=
APACHE
SPARK
MEETUP
Pero
tambin
podemos
usar
el
carcter
mgico
_
para
que
nuestro
cdigo
se
vea
mucho
ms
limpio
scala>
val
mensaje2
=
"Apache
Spark
Meetup".map(_.toUpper)
mensaje2:
String
=
APACHE
SPARK
MEETUP
A
el
mtodo
map
se
le
pasan
funciones
(programacin
funcional)
Cadenas
Ver
como
funcionan
las
expresiones
regulares
scala>
val
address
=
"Dr
Levante
1234
Edif
302
".replaceAll("[0-9]","x")
address:
String
=
"Dr
Levante
xxxx
Edif
xxx
Clases
implicitas
Las
clases
implcitas
deben
ser
denidas
en
un
mbito
donde
las
deniciones
de
mtodo
son
permi^das
(Scala
2.10)
Permiten
agregar
nuestros
propios
mtodos
a
objetos
sin
tener
que
extenderlos
Clases
Implcitas
package
com.meetup.u^ls
object
U^lidades{
implicit
class
IncrementarCaracter(val
s:String){
def
incrementar
=
s.map(c
=>
(c
+1).toChar)
}
}
package
foo.bar
import
com.meetup.u^ls.U^lidades._
object
Main
extends
App{
println(ABC.incrementar)
}
Nmeros
Char
-16
bit
unsigned
Byte
-
8
Bit
signed
value
Short
16
bit
signed
value
Int
32
bit
signed
value
Long
-
64
bit
signed
value
Float
32
bit
IEEE
754
single
precision
oat
Double
64
bit
IEEE
754
single
precision
oat
Nmeros
100.toInt
-
Usar
mtodos
to
para
cas^ng
100.toFloat
.
Scala
no
^ene
operadores
++
ni
val
es
inmutable
Scala
>
var
a
=
1
Nmeros
scala>
val
a
=
1
a:
Int
=
1
scala>
a
+=
1
<console>:22:
error:
value
+=
is
not
a
member
of
Int
a
+=
1
^
scala>
var
b
=
1
b:
Int
=
1
scala>
b+=1
scala>
b
res11:
Int
=
2
Nmeros
val
r
=
scala.u^l.Random
r.nextInt
Podemos
limitar
la
generacin
r.nextInt(100)
Nmeros
val
r
=
1
to
100
val
j
=
1
to
100
by
2
val
x
=
(1
to
10).toList
val
z
=
(1
to
100).toArray
Estructuras
de
Control
If/then/else
es
similar
a
Java
Pueden
regresar
un
resultado
val
x
=
if(a)
y
else
b
scala>
val
x
=
if("a"=="a")
9
else
7
x:
Int
=
9
Estructuras
de
Control
for
y
foreach
Nos
sirven
para
hacer
ciclos
y
sobre
todo
iterar
en
colecciones
(List,
Array,
Range)
scala>
val
samp
=
List("isra","memo","paco")
samp:
List[String]
=
List(isra,
memo,
paco)
scala>
for(n
<-
samp)
yield
n.capitalize
res20:
List[String]
=
List(Isra,
Memo,
Paco)
Estructuras
de
Control
scala>
samp.foreach(println)
isra
memo
Paco
Si
se
requiere
ms
lineas
samp.foreach{
e=>
|
val
nuevo
=
e.toUpperCase
|
println(nuevo)
|
}
Estructuras
de
Control
Es
muy
importante
saber
como
los
ciclos
son
trasladados
por
el
compilador
for
loop
que
itera
sobre
una
coleccin
se
transforma
en
foreach
for
loop
con
un
guard
se
traslada
a
una
secuencia
de
withFilter
seguida
de
un
foreach
for
loop
con
un
yield
se
traslada
a
un
map
e
la
coleccin
Estructuras
de
Control
scala>
val
i
=
5
i:
Int
=
5
scala>
val
month
=
i
match{
|
case
1
=>
"enero"
|
case
2
=>
"febrero"
|
case
3
=>
"marzo"
|
case
4
=>
"Abril"
|
case
5
=>
"Mayo
|
case
_
=>
Mes
invlido
|
}
month:
String
=
Mayo
Mtodos
Los
mtodos
los
denimos
como
def
scala>
def
square(x:Int):
Int
=
x
*
x
square:
(x:
Int)Int
scala>
square(5)
res33:
Int
=
25
Colecciones
Las
colecciones
en
escala
son
amplias
y
debemos
aprender
a
u^lizarlas
dependiendo
el
contexto
de
nuestro
requerimiento
List,
Array,
Map
y
Set
Mtodos
como
lter,
foreach,
map
y
reduceLe
aplican
a
las
colecciones
^enen
loops
dentro
de
sus
algoritmos
El
predicado
es
un
mtodo
o
funcin
annima
que
toma
uno
o
ms
parmetros
y
regresa
un
valor
booleano
Colecciones
Ej:
(i:int)
=>
i
%
2
==
0
//funcin
annima
_
%
2
==
0
val
list
=
List.range(1,20)
val
events
=
list.lter(_
%
2
==
0)
Colecciones
Traversable
Iterable
Seq
IndexedSeq
Set
LinearSeq
Map
Colecciones
Sequence
:
es
una
coleccin
lineal
de
elementos
que
sern
indexados
Map:
Con^ene
una
coleccin
key/value
como
un
Java
Map,
Ruby
Hash
o
un
diccionario
en
Python
Set
:es
una
coleccin
que
con^ene
elementos
sin
duplicar
Colecciones
Escoger
un
Sequence..La
secuencia
debe
ser
indexada
o
implementada
como
una
linked
list?
Queremos
una
coleccin
mutable
o
inmutable?
Imutables:List,
Queue,
Range,Stack,
Stream,
String,
Vector
Mutables:Array,
ArrayBuer,ArrayStack,
LinkedList,ListBuer,
MutableLIst,
Queue,
Stack,
StringBuilder
Colecciones
Escoger
Map
es
ms
sencillo
Puedo
escoger
un
SortedMap
que
almacenar
elementos
ordenados
por
llave
LinkedHashMap
para
almacenar
elementos
en
orden
de
insercin
HashMap,LinkedHashMap,ListMap,Map,Sorte
dMap,TreeMap,WeakHashMap
Colecciones
Escoger
un
set
es
similar
a
un
map
Existen
clases
mutables
e
inmutables
BitSet,HashSet,LinkedHashSet,ListSet,TreeSet,
Set,SortedSet
Algunas
otras
colecciones
(Enumera^on,Iterator,Op^on,Tuple)
Colecciones
Un
mtodo
de
transformacin
es
un
mtodo
que
construye
una
coleccin
a
par^r
de
una
existente.
Esta
incluye
mtodos
como
map,
lter,
reverse
etc.
Existen
colecciones
strict
y
lazy.
Strict
aloja
los
elementos
inmediatamente
en
memoria
Lazy
no
aloja
los
elementos
inmediatamente
y
las
transformaciones
no
construyen
nuevos
elementos
hasta
que
se
ejecutan.
Colecciones
Mtodos
de
ltrado:
collect,di,dis^nct,drop,dropWhile,lter,lterNot,nd,foldLe,fo
ldRight,head,headOp^on.
Mtodos
de
transformacin:
di,dis^nct,collect,atMap,map,reverse,sortWith,takeWhile,zip,
zipWithIndex
Mtodos
de
agrupacin:
groupBy,par^^on,sliding,span,splitAt,unzip
Mtodos
matem^cos
y
de
informacin:
contains,containsSlice,count,endWith,exist,nd,forAll,indexOf
max,min,product,size,sum.
Colecciones
scala>
days.zipWithIndex.foreach{
|
case(day,count)
=>
println(s"$count
es
$day")
|
}
0
es
Lunes
1
es
Martes
2
es
Mircoles
3
es
Jueves
4
es
Viernes
Colecciones
scala>
val
frutas
=
List("pera","manzana","pltano","mango","uva")
frutas:
List[String]
=
List(pera,
manzana,
pltano,
mango,
uva)
scala>
frutas.lter(_.length
<
6).map(_.toUpperCase)
res28:
List[String]
=
List(PERA,
MANGO,
UVA)
Colecciones
scala>
val
listas=List(List(1,2),List(3,4))
listas:
List[List[Int]]
=
List(List(1,
2),
List(3,
4))
scala>
val
resultado
=
listas.aGen
resultado:
List[Int]
=
List(1,
2,
3,
4)
Colecciones
scala>
def
toInt(in:String):Op^on[Int]={
|
try{
|
Some(Integer.parseInt(in.trim))
|
}
|
catch{
|
case
e:Excep^on
=>
None
|
}
|
}
toInt:
(in:
String)Op^on[Int]
scala>
fms.atMap(toInt)
res32:
List[Int]
=
List(1,
2,
5)
Colecciones
Ejercicios:
- Filtrar
los
mayores
a
4
- Filtrar
los
mayores
a
5
- Sumar
los
elementos
de
la
coleccin
Mayor
informacin
:
hGp://www.scala-lang.org/api/2.10.4/
index.html#scala.collec^on.Seq
Programacin
Funcional
Se
construyen
programas
usando
funciones
puras
Las
funciones
no
^enen
efectos
colaterales
Modicar
una
variable,
una
estructura,
establecer
un
campo
en
un
objeto,
arrojar
una
excepcin,
imprimir
en
la
consola,
leer
o
escribir
un
archivo,
dibujar
en
pantalla
Programacin
funcional
es
una
restriccin
en
COMO
escribimos
programas
pero
no
en
lo
QUE
nuestros
programas
pueden
expresar.
Y ahora
Spark
101
Map
reduce
es
el
modelo
de
programacin
y
el
corazn
de
Hadoop
Toma
datos
de
manera
masiva
y
los
divide
a
travs
de
un
nmero
de
nodos
en
un
clster
Tiene
dos
fases
la
fase
Map
y
la
fase
Reduce
Se
programa
en
Java
y
se
enva
de
manera
distribuida
al
clster
(tambin
se
puede
en
Python,
R,
.NET
a
travs
de
Hadoop
Streaming)
Mapper
Reducer
Spark 101
Driver
Spark 101
Spark
Spark
Spark
Resilient
Distributed
Datasets
(RDDs)
-Abstraccin
de
programacin
de
SPARK
-Se
desarrollan
programas
en
trminos
de
transformaciones
y
acciones
(Dataows)
-Coleccin
de
objetos
que
pueden
ser
almacenados
en
memoria
o
en
disco
a
travs
de
un
clster
-Estan
desarrollados
para
transformaciones
en
paralelo
(map,
lter,
etc)
-
Los
RDDs
pueden
ser
almacenados
en
memora,
en
disco
u
ambos.
-Tolerancia
a
fallos
Spark
//Spark
context
sc
variable
especial
de
contexto
//RDD
Base
scala>
var
data
=
sc.textFile(sample-syslog.log")
//Transformacin
=
las
transformaciones
son
lazy
val
info
=
data.lter(_.contains("INFO"))
info.cache()
//Acciones
=
Hasta
aqu
se
ejecutan
las
val
n1=
info.lter(_.contains(Alice).count())
Val
n2=info.lter(_.contains(Chuck).count())
Spark
Formatos:
Archivos
de
texto,
JSON,CSV,TSV,SequenceFiles,
ObjectFiles,Formatos
de
entrada/salida
de
Hadoop
Amazon
S3,HDFS,Avro,Parquet,Cassandra,
Hbase,Mongo,Elas^cSearch
etc.
Spark
RDDS
^enen
dos
^pos
de
operaciones
TRANSFORMACIONES:
Las
transformaciones
siempre
me
regresarn
un
nuevo
RDD
y
no
son
procesadas
inmediatamente
ACCIONES:Las
acciones
siempre
me
devolvern
un
resultado
(se
regresan
al
driver)
Spark
Spark
Clster
Worker
Bloque
1
Driver
Worker
Bloque
2
Worker
Bloque
3
Spark
scala>
var
data
=
sc.textFile(sample-syslog.log")
//Transformacin
=
las
transformaciones
son
lazy
val
info
=
data.lter(_.contains("INFO"))
info.cache()
//Acciones
=
Hasta
aqu
se
ejecutan
las
val
n1=
info.lter(_.contains(Alice).count())
Val
n2=info.lter(_.contains(Chuck).count())
Driver
Cache
1
Worker
Bloque
1
Worker
Bloque
2
Worker
Bloque
3
Procesar
y
poner
en
cache
Cache
2
Procesar
y
poner
en
cache
Cache
3
Procesar
y
poner
en
cache
Spark
scala>
var
data
=
sc.textFile(sample-syslog.log")
//Transformacin
=
las
transformaciones
son
lazy
val
info
=
data.lter(_.contains("INFO"))
info.cache()
//Acciones
=
Hasta
aqu
se
ejecutan
las
val
n1=
info.lter(_.contains(Alice).count())
Val
n2=info.lter(_.contains(Chuck).count())
Driver
Worker
Bloque
1
Worker
Bloque
2
Worker
Bloque
3
Spark
WORD
COUNT
scala>
val
f
=
sc.textFile("Readme.md")
scala>
val
wc=f.atMap(l
=>
l.split(
)).map(word=>(word,1)).reduceByKey(_
+
_)
scala>
wc.saveAsTextFile("salida1")
Spark
En
procesos
ETL
es
muy
comn
juntar
dos
conjuntos
de
registros
Los
RDDs
pueden
juntarse
o
hacer
union.
Tener
en
cuenta
los
Pairs
RDDS
que
son
RDDs
especiales
Spark
scala>
val
format
=
new
java.text.SimpleDateFormat("yyyy-MM-dd")
format:
java.text.SimpleDateFormat
=
java.text.SimpleDateFormat@f67a0200
scala>
case
class
Register(d:
java.u^l.Date,uuid:String,cust_id:String,lat:Float,lng:Float)
dened
class
Register
scala>
case
class
Click(d:java.u^l.Date,uuid:String,landing_page:Int)
dened
class
Click
scala>
val
reg
=
sc.textFile("reg.tsv").map(_.split("\t")).map(
|
r
=>
(r(1),
Register(format.parse(r(0)),
r(1),
r(2),
r(3).toFloat,
r(4).toFloat))
|
)
scala>
val
clk
=
sc.textFile("clk.tsv").map(_.split("\t")).map(
|
c
=>
(c(1),
Click(format.parse(c(0)),
c(1),
c(2).trim.toInt))
|
)
scala>reg.join(clk).collect()
Spark
Enviar
aplicaciones
Para
pruebas
el
shell
es
bueno
y
se
puede
reu^lizar
mucho
cdigo
En
ambientes
de
produccin
las
aplicaciones
se
envan
a
travs
de
bin/sparksubmit
Se
debe
tener
instalado
SBT
para
aplicaciones
en
Scala
y
poder
compilar
y
empaquetar
Maven
en
el
caso
de
Java
Spark
package com.vitatronix!
!
!
import org.apache.spark.SparkContext!
import org.apache.spark.SparkContext._!
import org.apache.spark.SparkConf!
!
object SimpleApp {!
!
!def main(args: Array[String]) {!
!
!
!val logfile="/Users/israelgaytan/Documents/Lambda/spark1.3/README.md"!
!
!val conf= new SparkConf().setAppName("Spark Stand Alone")!
!
!val sc= new SparkContext(conf)!
!
!!
!
!val input = sc.textFile(logfile)!
!
!
!val words = input.flatMap(line => line.split(" "))!
!
!
!var counter= words.count()!
!
!
!
!val counts = words.map(word=>(word,1)).reduceByKey{case (x,y) => x+y}!
!
!//counts.saveAsTextFile("finish.txt")!
!
!
!
!
!}!
}!
Spark
1.-
Crear
build.sbt
2.-
Crear
lib,project,src
y
target
3.-
Dentro
de
src
crear
main
4-
Dentro
de
main
crear
java,
resources
y
scala
mkdir p src/{main,test}/{java,resources,scala}!
mkdir lib project target!
Spark
Crear
en
la
raz
build.sbt
name := "Spark Meetup Wordcount!
!
version := "1.0!
!
scalaVersion := "2.10.4!
!
libraryDependencies ++= Seq(!
"org.apache.spark" %% "spark-core" % "1.3.0" % "provided",!
"org.apache.spark" %% "spark-streaming" % "1.3.0" % "provided"!
)!
Spark
Ejecutamos
sbt
para
que
cree
el
proyecto
MacBook-Pro-de-Israel:scala-wsh
israelgaytan$
sbt
[info]
Loading
project
deni^on
from
/Users/israelgaytan/Documents/Lambda/scala-wsh/project/project
[info]
Loading
project
deni^on
from
/Users/israelgaytan/Documents/Lambda/scala-wsh/project
[info]
Set
current
project
to
Spark
Meetup
Wordcount
(in
build
le:/Users/israelgaytan/Documents/Lambda/
scala-wsh/)
EMPAQUETAMOS
>package
Spark
Spark
Y
POR
LTIMO
ENVIAMOS
!
!
!
bin/spark-submit --class "com.vitatronix.SimpleApp" --master local[*] /
Users/israelgaytan/Documents/Lambda/scala-wsh/target/scala-2.10/sparkmeetup-wordcount_2.10-1.0.jar!
!
Le pasamos en los parmetros en nombre de la clase, el cluster en este caso
master local[*] tomar todos los cores de la mquina y finalmente el Jar
que empaquetamos con SBT!
SPARK
SERVIDOS
CHATOS
Recursos
hGps://databricks.com/spark/developer-resources
Func^onal
Programming
in
Scala
Paul
Chiusano
Rnar
Bjarnason
(Manning)
Learning
Spark
Holden
Karau
(O`Reilly)
Advanced
Analy^cs
With
Spark
Sandy
Reza
,
Uri
Laserson
(O`Reilly)
Scala
for
the
Impa^ent
Cay
S
Horstmann
Scala
Cookbook
Alvin
Alexander
(O`Reilly)
Scala
for
the
intrigued
-
hGps://www.youtube.com/watch?
v=grvvKURwGNg&list=PLrPC0_h8PkNOtAr4BRTFf46Gwctb6kE9f
GRACIAS
@isragaytan
israel.gaytan@vitatronix.net
isragaytan@gmail.com