Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                

Introducción A Scala

Descargar como pdf o txt
Descargar como pdf o txt
Está en la página 1de 72

Apache

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 (Historia)


Ecosistema Big Data




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)

Spark 101 (WordCount)

Mapper

Reducer

Spark 101

Driver

Spark 101

Es dicil programar en Map Reduce


Cuellos de botellas de performance
Existen abstracciones como Hive y Pig
An as es complicado desarrollar

Spark

Spark es un motor de cmputo DISTRIBUIDO


Op^mizado para velocidad, fcil uso e implementacin de anlisis
sos^cado.
Es un proyecto open source de APACHE
APIS en Python, Java y Scala R en Spark 1.4!
Lo u^lizamos para tareas de ciencia en datos
Lo u^lizamos para aplicaciones de procesamiento a gran escala
(terabytes o petabytes de datos = BIG DATA)

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 tras bambalinas


Spark traza una grafo lineal de
transformaciones y acciones
El driver se encarga de enviar nuestra
aplicacin a todos los nodos con este grafo
Se enviaran instrucciones a los workers para
ser ejecutadas (archivos de texto, hdfs etc)
Cada worker leer los datos y har
transformaciones y har cache de los datos

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

El driver se encarga de enviar nuestra


aplicacin a todos los nodos (workers)

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

Una vez que los procesa los pone en


cache por cada worker

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

Se efecta la accin count y se hace en paralelo.


Adicionalmente por cada worker sern agregados
los resultados y enviados de vuelta al driver.

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")!
!
!
!
!
!}!
}!

!println(s"Finished and counting word $counter")!

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

Apache Spark Meetup


Introduccin a Scala
#ApacheSparkMX

@isragaytan
israel.gaytan@vitatronix.net
isragaytan@gmail.com

También podría gustarte