Machine Learning Spark
Machine Learning Spark
Machine Learning Spark
Trabajo de Diploma
Santa Clara
2017
“Año 59 de la Revolución”
Hago constar que el presente Trabajo de Diploma fue realizado en la Universidad Central
“Marta Abreu” de Las Villas como parte de la culminación de estudios de la especialidad
de Licenciatura en Ciencia de la Computación, autorizando a que el mismo sea utilizado
por la Institución, para los fines que estime conveniente, tanto de forma parcial como
total y que además no podrá ser presentado en eventos, ni publicados sin autorización de
la Universidad.
Los abajo firmantes certificamos que el presente trabajo ha sido realizado según acuerdo
de la dirección de nuestro centro y el mismo cumple con los requisitos que debe tener un
trabajo de esta envergadura referido a la temática señalada.
“Si se coloca el centro de gravedad de la vida no en la vida, sino en el «más allá» -en la
nada-, se le quita a la vida en general el centro de gravedad”.
i
DEDICATORIA
Al maestro.
ii
AGRADECIMIENTOS
A todos los que confiaron en mí, a mi familia, mi pareja, mis amigos. Al café.
iii
RESUMEN
creciente de la industria ha dado como consecuencia una evolución en el área del cómputo
distribuido, surgiendo así herramientas como Apache Hadoop y Apache Spark siendo éste
de regresión lineal con el fin de validar la metodología propuesta. Se realizaron una serie de
experimentos al software implementado que permitieron valorar las ventajas del framework
Apache Spark para reducir significativamente los tiempos de ejecución cuando este tipo
de algoritmo se somete al procesamiento de cantidades masivas de datos.
iv
ABSTRACT
The analysis of large amounts of data, as well as the extraction of useful knowledge of
these, is now a challenge as each day the volumes of information generated grow rapidly
and programs are needed that can perform this task in a short time.
For several years Open source frameworks have been used for the application of automated
learning techniques in small volumes of data, but the growing need of the industry has
Apache Hadoop and Apache Spark The latter being between 10 and 100 times faster than
its predecessor.
In this paper we propose a general procedure for the inclusion of new algorithms of au-
tomatic learning in the Apache Spark framework and a linear regression algorithm is
A series of experiments were performed on the implemented software that allowed to eva-
luate the advantages of the Apache Spark framework to significantly reduce execution
times when this type of algorithm is submitted to the processing of massive amounts of
data.
v
TABLA DE CONTENIDO
Página
PENSAMIENTO . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . i
DEDICATORIA . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ii
AGRADECIMIENTOS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . iii
RESUMEN . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . iv
ABSTRACT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . v
INTRODUCCIÓN . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
CAPÍTULO 1 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
1. Marco teórico . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 5
vi
1.6. Métodos Lineales - API basada en RDD . . . . . . . . . . . . . . . . . 18
1.6.1. Formulación matemática . . . . . . . . . . . . . . . . . . . . . . 18
1.6.2. Funciones de pérdida . . . . . . . . . . . . . . . . . . . . . . . . 19
1.6.3. Regularizadores . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
1.7. Optimización . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
1.7.1. Descenso de gradiente . . . . . . . . . . . . . . . . . . . . . . . . 21
1.7.2. Descenso de gradiente estocástico (SGD) . . . . . . . . . . . . . 21
1.7.3. Esquemas de actualización para SGD distribuido . . . . . . . . . 22
1.7.4. BFGS de memoria limitada (L-BFGS) . . . . . . . . . . . . . . . 23
1.8. Implementación en MLlib . . . . . . . . . . . . . . . . . . . . . . . . . 23
1.8.1. Descenso de gradiente y descenso de gradiente estocástico . . . . 23
1.8.2. L-BFGS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
CAPÍTULO 2 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
CAPÍTULO 3 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
CONCLUSIONES Y RECOMENDACIONES . . . . . . . . . . . . . . . . . . . . . 52
CONCLUSIONES . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
RECOMENDACIONES . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54
viii
INTRODUCCIÓN
Cada día la cantidad de información de cualquier tipo aumenta aceleradamente y así mis-
mo se hace necesario no solo almacenar esta información sino poder procesarla eficiente y
eficazmente para extraer conocimiento útil de esta. Hastie et al. (2003)
Construir modelos para detectar fraudes de tarjetas de crédito utilizando miles de carac-
terísticas y billones de transacciones; recomendar inteligentemente millones de productos
a millones de usuarios; estimar riesgos financieros utilizando simulaciones de portafolios
incluyendo millones de instrumentos y manipular datos del genoma humano para detectar
asociaciones genéticas con enfermedades eran tareas muy difíciles o imposibles de realizar
tratamiento de estas grandes cantidades de datos dada su facilidad para ser implementado
mediante sistemas de cómputo paralelos. Sistemas distribuidos como Apache Hadoop han
encontrado así su camino y han tenido una amplia aplicación en múltiples empresas.Ryza
et al. (2015)
1
INTRODUCCIÓN 2
nodo requieren ser repensados para la computación distribuida. Por ejemplo, porque los
datos deben estar particionados a lo largo de múltiples nodos en un clúster de compu-
tadoras, algoritmos que tenían amplias dependencias de datos sufrirían el hecho de que las
tasas de transferencia de la red son más lentas que el acceso a memoria. Así como que a
medida que aumentan la cantidad de computadoras trabajando en un problema, aumenta
la probabilidad de fallo.Ryza et al. (2015)
en desarrollo concebido para el trabajo con algoritmos de esta naturaleza, dentro de este,
siguientes:
así como las operaciones de bajo nivel que son inherentes al procesamiento de datos en
paralelo. De esta forma, es similar a otros frameworks de procesamiento distribuido como
5
MARCO TEÓRICO 6
procesamiento de datos a gran escala, así como para el aprendizaje automático y analísis
iterativos. Pentreath. (2015)
El modo local auto-sostenido, donde todos los procesos de Spark corren en la misma
Java Virtual Machine (JVM).
El modo clúster auto-sostenido, usando el framework de planificación de trabajo em-
bebido de Spark.
Usando Mesos, un popular framework de código abierto para cluster-computing.
Usando YARN (comunmente referido como NextGen MapReduce).
Pentreath. (2015)
Core, otras tienen consideraciones particulares. Un ejemplo de esto es que Spark SQL uti-
liza un motor de optimización de consultas diferente.
Spark SQL introduce dos tipos de datos semi-estructurados en forma de interfaces, DataFrames
ML y MLlib son los componentes de aprendizaje automático de Spark. MLlib fue escrito
junto con Spark. Spark ML está todavía en las primeras etapas de desarrollo y existe úni-
camente luego de la versión 1.2 de Spark. Spark ML provee una API de más alto nivel que
MLlib y tiene el objetivo de facilitar la construcción práctica de cadenas de procesos de
MARCO TEÓRICO 8
Spark Streaming está centrado en la manipulación de datos en flujo. Esta contiene dos
APIs, DStreams y otra basada en streaming estructurado que se encuentra en un estado
de desarrollo alpha la cual utiliza DataFrames de Spark SQL.Karau (2017)
Un clúster de Spark está constituido por dos tipos de procesos: un programa conductor y
múltiples ejecutores. En el modo local, todos estos procesos están corriendo en la misma
Spark puede ser utilizado desde varios lenguajes de programación, entre ellos Python, Java
y Scala. En este documento se utilizará Scala para las secciones de código y las anotaciones
generales de programación dada la claridad sintáctica que este presenta en este tipo de
programa.
Generalmente un programa en Spark se inicia con un dataset, que usualmente esta distri-
buido, utilizando por ejemplo Hadoop Distributed File System (HDFS) y usualmente esta
relacionado con los pasos:
posteriormente.
RDD es una colección de registros que están distribuidos o particionados a través múl-
tiples nodos en un clúster (para los propósitos del modo local de Spark esto puede ser
pensado de la misma manera). Un RDD en Spark es tolerante a fallos; esto significa que
si un nodo o una tarea falla (por alguna razón aparte de código erróneo del usuario, como
fallas de hardware, perdida de comunicación, entre otras), el RDD puede ser reconstruido
automáticamente desde los restantes nodos y el trabajo se mantendrá intacto, esto es po-
sible ya que los RDDs autocontienen toda la información necesaria para su reconstrucción
MARCO TEÓRICO 10
A diferencia de la API basada en RDD, las interfaces brindadas por Spark SQL proveen a
Spark mas información acerca de las estructuras tanto de los datos como del cómputo que
se está realizando. Internamente, Spark SQL utiliza esta información extra para realizar
optimizaciones en la manipulación de los datos.
Un Dataset es una colección de datos distribuida. Se introdujo en Spark 1.6 para pro-
veer los beneficios de los RDD(tipado fuerte y posibilidad de utilizar poderosas funciones
lambda) junto a los beneficios de el motor de ejecución optimizado de Spark SQL.
ser construidos desde una amplia colección de orígenes, como campos de datos estructu-
Las operaciones que se realizan sobre las colecciones distribuidas de Spark se pueden cla-
sificar en dos grupos: las transformaciones y las acciones. Una transformación aplica una
función sobre todos los registros de un RDD modificándolos de alguna manera, al estilo de
construcción de un grafo acíclico dirigido basado en las dependencias entre las transfor-
maciones de las particiones. Spark evalúa las acciones mediante el cómputo previo de las
transformaciones, en un cómputo retrospectivo.
recorrer los datos una vez ejecutando ambas operaciones combinadas en vez de ejecutar
estas operaciones por separado lo cual requeriría recorrer los datos varias veces.
necesario cálculos repetidos, esto es posible ya que Spark utiliza persistencia de datos en
memoria. Spark permite la opción de que los ejecutores conserven los datos cargados en
memoria en vez de acceder repetidas veces en el disco, lo cual reduce el tiempo de acceso
significativamente cuando estos datos son accedidos repetidas veces.
Spark provee tres opciones para el manejo de memoria, de manera serializada en memoria,
sin serializar en memoria y una tercera en disco. Cada una con sus particularidades de
rendimiento.
MARCO TEÓRICO 12
la partición de uso menos reciente, según la política LRU. No obstante este comporta-
miento puede ser configurado mediante la función persistancePriority() de la class
RDD.Karau (2017)
Spark contiene dos bibliotecas de aprendizaje automático, Spark MLlib y Spark ML con
1.5.1. MLlib vs ML
Una de las diferencias básicas de las APIs está en los tipos de datos con los que estas
trabajan, MLlib usa RDD y ML utiliza DataFrames y Datasets de Spark SQL, esta
diferencia no tiene una importancia marcada ya que estas APIs trabajan con RDD y Da-
tasets de Vectores respectivamente, los cuales son fácilmente transformables entre ellos.
Desde el punto de vista del diseño, Spark MLlib está enfocado en proveer un conjunto de
la biblioteca. Spark ML está enfocada en dar a conocer una API basada en el concepto
de Pipelines o tuberías las cuales no son más que secuencias de procesamientos que van
desde la preparación inicial de los datos hasta las etapas finales de selección y evaluación
de modelos.
1.5.2. DataFrame
El aprendizaje automático se puede aplicar a una amplia variedad de tipos de datos, co-
mo vectores, texto, imágenes y datos estructurados. Esta API adopta el DataFrame de
Spark SQL con el fin de soportar una variedad de tipos de datos. Además de los tipos
enumerados en la guía Spark SQL, un DataFrame también puede utilizar el tipo Vector.
Un DataFrame puede crearse implícita o explícitamente desde un RDD.
MARCO TEÓRICO 14
1.5.3. Transformers
1.5.4. Estimators
1.5.5. Pipeline
Spark ML representa este flujo de trabajo como un Pipeline , el cual consiste en una
secuencia de PipelineStages ( Transformer s y Estimator s) que se ejecutan en un
orden específico.
En la figura, la fila superior representa una Pipeline con tres etapas. Las dos prime-
tos que fluyen a través de la tubería, donde los cilindros indican DataFrames . El
método Pipeline.fit() se llama en el DataFrame original, que contiene docu-
mentos de texto plano y clases. El método Tokenizer.transform() divide los do-
cumentos de texto plano en palabras, añadiendo una nueva columna con palabras
al DataFrame . El método HashingTF.transform() convierte la columna de pa-
labras en vectores de características, añadiendo una nueva columna con los vec-
tores al DataFrame . Ahora, puesto que LogisticRegression es un Estimator ,
la tubería primero llama al método LogisticRegression.fit() para producir un
MARCO TEÓRICO 16
Pipeline original, pero todos los Estimators en el Pipeline original en este caso
son Transformers . Cuando el método transform() del PipelineModel es llamado
en un dataset de prueba, los datos son enviados en orden a través del Pipeline
ajustado. El método transform() de cada etapa actualiza el dataset y lo envía a la
próxima etapa.
Las Pipelines y los PipelineModels ayudan a asegurarse de que los datos de en-
trenamiento y prueba pasan a través de procesamientos de características idénticos.
Detalles
Las Pipelines se pueden constituir también en una topología no lineal, donde las
etapas no formen una línea directa, siempre y cuando formen un grafo acíclico dirigido
y en este caso las etapas deben ser especificadas siguiendo el ordenamiento topológico.
MARCO TEÓRICO 17
Como las Pipelines pueden operar en DataFrames con tipos variables, estas no
pueden usar chequeo de tipos en tiempo de compilación por lo que se utiliza chequeo
en tiempo de ejecución previo a que se ejecute realmente el Pipeline . Este chequeo
de tipos se realiza utilizando el esquema DataFrame , una descripción de los tipos de
datos de las columnas en el DataFrame .
Las etapas de las Pipelines deben ser instancias únicas. Ej, la misma instan-
cia myHashingTF no debería ser insertada dos veces en una Pipeline ya que las
etapas de las Pipelines tienen un ID único. Sin embargo, diferentes instancias
myHashingTF1 y myHashingTF2 (ambas de tipo HashingTF ) pueden ser inserta-
das en la misma Pipeline ya que diferentes instancias se crean con diferentes IDs.
1.5.6. Parámetros
1∑ n
f (w) = λR(w) + L(w; xi , yi ).
n i=1
Los vectores xi ∈ Rd son los datos de entrenamiento, para 1 ≤ i ≤ n, y yi ∈ R son sus
clases correspondientes, las que se desea predecir. Se dice que el método es lineal si
L(w; x, y) puede ser expresado como una función de wT x y y. Varios de los algoritmos
de clasificación y regresión de spark.mllib caen en esta categoría.
del modelo y la pérdida, que da una medida del error del modelo en los datos de
entrenamiento. La función de pérdida L(w; .) es típicamente una función convexa en
w. El parámetro de regularización ajustado λ ≥ 0 define la relación entre las dos
finalidades de minimizar la pérdida (esto es, el error de entrenamiento) y minimizar
la complejidad del modelo (esto es, evitar el sobreajuste).
MARCO TEÓRICO 19
−yx si ywT x < 1,
hinge loss max{0, 1 − ywT x}, y ∈ −1, +1
0 en otro caso.
( )
pérdida logística log(1 + exp(−ywT x)), y ∈ −1, +1 −y 1 − 1
1+exp(−ywT x)
x
pérdida cuadrática 1 T
2 (w x − y)2 , y ∈ R (wT x − y)x
1.6.3. Regularizadores
L2 1
2
∥w∥22 w
L1 ∥w∥1 sign(w)
Donde sign(w) es el vector consistente de los signos (±1) de todas las entradas de w.
Los problemas regularizados con L2 son generalmente más fáciles de resolver que los
pequeños y más interpretables lo cual puede ser útil para la selección de rasgos. Red
Los métodos lineales utilizan optimizaciones convexas para optimizar las funciones
objetivo. spark.mllib utiliza dos métodos, SGD y L-BFGS. Actualmente, la mayo-
ría de las API de algoritmos soportan Descenso de Gradiente Etocástico (SGD por
sus siglas en inglés), y algunos otros soportan L-BFGS.
MARCO TEÓRICO 21
El método más simple para resolver problemas de optimización de la forma minw∈Rd f (w)
de pérdida.
Los problemas de optimización cuya función objetivo f está escrita como una suma es-
1∑ n
f (w) = λR(w) + L(w; xi , yi ). (1.1)
n i=1
esto es especialmente natural, ya que la pérdida total esta escrita como un promedio
de las pérdidas individuales provenientes de cada punto.
Un subgradiente estocástico es una elección aleatoria de un vector, que puede ser
probablemente el subgradiente real de la función objetivo. Tomando un punto i ∈ [1..n]
uniformemente aleatorio, obtenemos un subgradiente estocástico de (1) respecto a w
MARCO TEÓRICO 22
de la siguiente forma:
′
fw,i = L′w,i + λRw′ ,
′
w(t+1) := w(t) − γfw,i (1.2)
ción por defecto se escoge decreciente con la raíz cuadrada del contador de iteraciones,
esto es γ := √s en la t-ésima iteración, con el parámetro de entrada s (longitud de
t
(distribuido) de los ejemplos de datos. Recuérdese que la pérdida como parte del
∑n ∑n
problema de optimización (1) es 1
n i=1 L(w; xi , yi ), y por tanto 1
n i=1 L′w,i podría
ser el verdadero subgradiente. Dado que esto requeriría acceso total al dataset, el
parámetro miniBatchFraction especifica cual fracción del total de datos usar en
1 ∑ ′
L ,
|S| i∈S w,i
MARCO TEÓRICO 23
aproxima localmente la función objetivo como cuadrática, sin evaluar la segunda de-
rivada parcial para construir la matriz Hessiana. La matriz Hessiana se aproxima por
evaluaciones previas del gradiente, por lo que es permisible la escalabilidad vertical
y L2.
• stepSize es un valor escalar que denota el tamaño inicial del paso para el
El resultado es una tupla que contiene: como primer elemento, una matriz columna
que contiene los pesos de cada característica y el segundo elemento es un arreglo que
contiene la pérdida calculada para cada iteración.
CAPÍTULO 2
Capítulo 2
IMPLEMENTACIÓN DE UN MODELO DE
REGRESION LINEAL PERSONALIZADO
UTILIZANDO SPARK ML
mera es implementar los algoritmos utilizando transformaciones a los RDD siguiendo las
convenciones de Spark MLlib y seguir a partir de ahí, para Spark ML este acercamiento
es válido también pero se pierden características integradas muy útiles, incluyendo la po-
Para agregar un nuevo algoritmo a una pipeline se necesita implementar ya sea Estimator
o Transformer , las cuales implementan a su vez la interfaz PipelineStage . Para los al-
goritmos que no necesitan entrenamiento, se puede implementar la interfaz Transformer ,
Además de las funciones transform o fit , todas las etapas de una pipeline necesitan
proveer transformSchema y un constructor copy o implementar una clase que realice
esta tarea. copy es utilizado para clonar la etapa actual, con cualquier parámetro adicio-
nal que se desee agregar.
27
Implementación de un modelo de Regresion Lineal personalizado utilizando Spark ML 28
La API de Spark puede ser de cierta forma vista desde dos perspectivas la API pública y
la API privada. Estas están delimitadas por el paquete declarado en los archivos de código
donde están implementadas las clases.
Las clases recomendadas para la extensión de Spark ML ( Estimator y Transfomer )
pueden ser heredadas de manera natural desde un proyecto de usuario siempre que se
tengan las respectivas dependencias a la biblioteca estándar de Spark. Por otra parte,
los desarrolladores de Spark implementan las nuevas funcionalidades dentro de los pa-
quetes internos de Spark, en este caso org.apache.spark.ml que al mismo tiempo se
Dada la homogeneidad estructural presentada por la API de Spark ML, las potencialidades
res que se encuentran en una intensa labor de extensión de esta API se decidió utilizarla
que se desee implementar utilizando los beneficios de esta API. Básicamente estos pasos
son:
∑
n
h(x) = θi xi = θT x,
i=0
siendo n el número de variables de entrada. Un método utilizado para escoger los paráme-
tros θ es definir una función que estime qué tan cerca están los valores de h(x(i) ) respecto
a los valores correspondientes de y (i) . Sea la función de costo:
1∑ m
J(θ) = (hθ (x(i) ) − y (i) )2 .
2 i=1
θ = (X T X)−1 X T y,
X T Xθ = X T y
Implementación de un modelo de Regresion Lineal personalizado utilizando Spark ML 31
La resolución de la ecuación normal como método para calcular los valores de los pa-
rámetros θ incluye el cómputo de la multiplicación de matrices. Este procedimiento es
implementado por varias bibliotecas locales de álgebra lineal dada la frecuencia de su uti-
lización. Para un correcto aprovechamiento de las capacidades del cómputo distribuido
en este frecuente procedimiento algebraico se hace necesario plantear la multiplicación de
matrices de manera tal que las matrices puedan ser fraccionadas a lo largo de un clúster
de computadoras así como poder computar porciones de la matriz resultado de manera
distribuida.
Sea:
a1,1 a1,2 · · · a1,m b1,1 b1,2 ··· b1,n
a a2,2 · · ·
a2,m b b2,2 ··· b2,n
2,1 2,1
An,m =
. ..
, Bm,n =
.. . .. ..
.. .. .. ..
. . . . . .
an,1 an,2 · · · an,m bm,1 bm,2 · · · bm,n
se define como:
∑
(A · B)i,j = ai,k bk,j
k
Implementación de un modelo de Regresion Lineal personalizado utilizando Spark ML 32
a1,1 b1,1 . . . a1,1 b1,m a1,2 b2,1 . . . a1,2 b2,m a1,m bm,1 . . . a1,m bm,m
(A·B) =
a2,1 b1,1 ... a2,1 b1,m
+ a2,2 b2,1 ... a2,2 b2,m +. . .+
a2,m bm,1 ... a2,m bm,m
am,1 b1,1 . . . am,1 b1,m am,2 b2,1 . . . am,2 b2,m am,m bm,1 . . . am,m bm,m
Si utilizamos la definición de producto tensorial ⊗ la suma anterior puede ser escrita como:
∑
(A · B) = ai ⊗ b⃗i )
(⃗
i
map y reducir los accesos a los datos por lo que el almacenamiento necesario para una
Clase Instance
Representa una instancia de entrenamiento que contiene un atributo label que representa
de la instancia.
Clase CustomLinearRegression
dido a partir de las instancias, recibe como parámetro un Dataset de Spark SQL con los
datos de entrenamiento.
Implementación de un modelo de Regresion Lineal personalizado utilizando Spark ML 34
vector θ.
Clase CustomLinearRegressionModel
contiene un método transform que recibe un Dataset de Spark SQL como datos de
entrada, en este caso, instancias para las cuales se desea predecir el valor de la clase me-
diante la evaluación de una función lineal que utiliza los valores de las características y
devuelve un DataFrame de Spark SQL que contiene los valores arrojados por la predicción.
Implementación de un modelo de Regresion Lineal personalizado utilizando Spark ML 35
Entrada: Dataset que contiene las instancias para las cuales se desea predecir la
variable continua y de la clase a partir del vector de características de cada una y el
También se implementaron varias funciones necesarias para las tareas de cálculo algebraico
Función rmse
zada por la función lineal respecto a los valores reales de la variable y para instancias de
las cuales se conoce este dato. De manera que esta medida de error puede ser utilizada
vectores y matrices, así como de las estructuras distribuidas de Spark son inmutables e
implementan eficientemente el paradigma map-reduce. En el caso de la implementación de
las estructuras de Spark este modelo de programación permite la paralelización implícita
por lo que las operaciones de la naturaleza map están implementadas para ser escalables
por definición.
gramación de Spark ML este está condicionado para ser integrado como parte de una
Pipeline y ser utilizado como parte de una cadena de procesamientos sucesivos de datos.
Implementación de un modelo de Regresion Lineal personalizado utilizando Spark ML 37
En esta sección se describen los pasos a seguir para la creación de la aplicación final
utilizando Spark mediante su API en Scala, así como su preparación para la ejecución en
un clúster.
5. Instalar el IDE.
6. Agregar el plugin de Scala mediante la opción: File >Settings >Plugins >Install plugin
from disk
7. Crear un proyecto nuevo de Scala.
8. Agregar las dependencias externas de Spark mediante la opción: File >Project Struc-
ture >Libraries >+ >Seleccionar los archivos .jar del directorio jars de Spark excluyendo
los relacionados con Scala
9. Agregar el SDK de Scala en otra biblioteca mediante los pasos anteriores utilizando
los archivos relacionados con Scala.
10. Asociar la biblioteca de Scala como el SDK de Scala del proyecto actual.
39
HERRAMIENTAS, TÉCNICAS Y VALIDACIÓN DE LOS RESULTADOS 40
3.1.2. Compilación y creación del archivo .jar para ser lanzado en un clúster
de Spark mediante la herramienta spark-submit
Para la creación del archivo .jar en el IDE IntelliJ IDEA es necesario crear un artefacto
de compilación mediante el menú: File >Project Structure >Artifacts >+ >Crear un ar-
tefacto de compilación de tipo jar, excluir las dependencias. Es importante resaltar que
no se deben incluir las dependencias locales de Spark pues la aplicación debe utilizar la
3.1.3. Carga de los datasets hacia el clúster de Spark con HDFS y ejecución
del programa en el clúster
Para almacenar los datasets en el sistema de archivos distribuido de Hadoop se debe prime-
ramente copiar el dataset a un directorio local en el clúster, esto puede hacerse mediante
la herramienta WinSCP, luego que el dataset esté completamente copiado hacia ese direc-
torio se debe utilizar el comando hadoop fs -copyFromLocal <localFile><HDFS-dir>
de Hadoop.
–-master yarn Para especificar que se desea utilizar YARN como manejador de
clúster.
–-driver-memory 4096m para especificar el tamaño de memoria de la JVM del pro-
grama driver en este caso 4 GiB.
–-executor-memory 4096m análogamente para la memoria en los ejecutores.
–-num-executors 3 para especificar la cantidad de ejecutores a utilizar.
–-executor-cores 3 para especificar la cantidad de núcleos en cada ejecutor, en
–-num-executors 7
–-driver-memory 1024m
–-executor-memory 1024m
–-executor-cores 2 ejemplo.jar
Csie.ntu.edu.tw (2017)
Características del dataset:
Prueba 1.1:
Historial de eventos en el clúster de Spark:
zado por los desarrolladores de Spark para definir el tamaño máximo de los vectores de
los desarrolladores:
El algoritmo de regresión lineal contenido en Spark tiene en cuenta el tamaño de los datos
de entrada y toma decisiones de solución diferentes (Normal equation, SGD, L-BFGS), en
este algoritmo se utiliza una optimización en las operaciones reduce más costosas, esta
esta vez se implementó utilizando treeAgreggate como intento de optimización para no so-
Csie.ntu.edu.tw (2017)
Localización:
https://www.csie.ntu.edu.tw/~cjlin/libsvmtools/datasets/regression.html
Prueba 1.3:
Cantidad de Nodos: 10
Configuración de YARN:
Nodo:
CPU:
Todas las pruebas se realizaron utilizando la herramienta spark-submit con los siguien-
tes parámetros en común:
–-master yarn
–-driver-memory 4098m
–-executor-memory 4098m
–-executor-cores 3
Las ideas que a continuación se expondrán resultan una síntesis de los aspectos fundamen-
tales trabajados en la investigación.
herramienta.
Se llevó a cabo la implementación de un algoritmo de regresión lineal, utilizando la
53
RECOMENDACIONES
Para darle continuidad y perfeccionar esta investigación se proponen las siguientes reco-
mendaciones:
54
REFERENCIAS BIBLIOGRÁFICAS
8-May-2017].
Karau, Warren (2017). High Performance Spark. O’REILLY.
55