CAPÍTULO 4: MÉTRICAS DEL SNA – GRAPHX
4.1 Métricas del SNA
4.1.5 Coeficiente de agrupamiento
Esta medida evalúa la posibilidad de que dos nodos adyacentes a un nodo específico sean vecinos entre sí.
4.1.6 Densidad.
La densidad de una red es la relación existente entre el número de lazos existentes y el número de lazos posibles.
En las redes desigualmente conectadas, la densidad hace posible medir las áreas más o menos ligadas o enlazadas de la red, y detectar el vecindario de
un nodo dado, como los grupos y ―cliques‖, los cuales son reconocidos por su
cohesión de acuerdo con la proporción de relaciones entre los nodos. (Polanco, 2008)
54 4.2 SNA – GraphX.
GraphX ofrece la posibilidad de aplicar muchas de estas métricas en el análisis de grafos. La tabla 2 muestra un resumen de algunas de las métricas que están implementadas en GraphX.
Tabla 2. Métricas implementadas en Graphx.
Fuente: El Autor.
Métrica Implementada en Graphx
Autovector (Eigen Vector) Sí
Cercanía (Closeness) Sí
Intermediación (Betweenness) Sí
Densidad (Density) Sí
Puente (Bridge) No
Coeficiente de agrupamiento (Clustering) Sí
Cohesión (Cohesion) Sí Homofilia (Homophily) No Multiplicidad (Multiplicity) No Reciprocidad (Reciprosity) No Distancia (Distance) No Transitividad (Transitivity) Sí Modularidad (Modularity) Sí Eficiencia (Efficiency) No Diámetro (Diameter) No Equivalencia estructural No
PageRank es un algoritmo conocido que determina la importancia de un vértice en un grafo. Fue ofrecido por Google en 1998 y se ha utilizado para clasificar los resultados de búsqueda.
55 La búsqueda de componentes conectados es el algoritmo para buscar subconjuntos de actores en un grafo. Hay un camino entre dos vértices de un subconjunto específico. Al mismo tiempo, no hay camino entre los vértices de los diferentes subconjuntos.
Además de lo anterior, GraphX ofrece conteo de triángulos, clustering, búsqueda de cliques, etc.
La mayoría de los algoritmos son iterativos, por lo tanto, GraphX se desempeña bien en este contexto, ya que almacena los datos en memoria. (Krot, 2015)
4.2.1 Casos de aplicación.
Predicción de enlace
En un grafo, a medida que pasa el tiempo van apareciendo cada vez nuevas relaciones, por ende es necesario poder de alguna manera predecir qué relaciones aparecerán en el futuro; precisamente se trata de sistemas recomendadores, que para cada par de actores (aleatorios) asumen la probabilidad de que aparezca una relación que los una.
Detección de Comunidades
Mauricio Monsalve menciona al respecto que:
La detección de comunidades, grupos, cliques (grupos exclusivos), etc. es tema de alto interés en redes sociales. El asunto es complicado pues no es fácil definir un grupo. La definición es fácil cuando hablamos de una estructura formal, cuando existe un grupo definido y un grupo de adherentes que dice ser parte del grupo. Por ejemplo, Chile y los chilenos. Pero todo se vuelve complicado, oscuro, hasta esotérico cuando hablamos de la estructura informal. Un grupo de amigos es un montón de gente que son todos o casi todos amigos
56 entre sí, pero ellos a su vez tienen varios amigos comunes... ¿Cuáles pertenecen al grupo y cuáles no? (Moreno, 2008)
La determinación de líderes de opinión en la Red
Por ejemplo, suponga que necesitamos promover un nuevo servicio o producto; para optimizar el presupuesto de publicidad nos gustaría seleccionar a las personas que están, en algún sentido, en el centro de atención, para que sean ellos quienes difundan toda la información referente al nuevo producto o servicio que se quiere prestar, ya que a través de ellos se puede llegar a muchas más personas sin tener que pagar por una publicidad radio-televisiva. En nuestros términos, esas personas vienen a ser vértices de un grafo, que tienen una gran importancia en la red. Con la estructura correcta del grafo, este problema se reduce al PageRank. (Krot, 2015)
57 CONCLUSIONES
Una vez finalizado el proyecto, habiendo conseguido una instalación y ejecución exitosa de Spark-GraphX, se puede llegar a las siguientes conclusiones:
Se logró realizar una instalación limpia de Spark y la aplicación de su algoritmo para el procesamiento de grafos en paralelo GraphX, tanto en Linux (Ubuntu 14) como en Mac OS. La instalación en Mac no difiere mucho con respecto a la instalación en Ubuntu, excepto en la sintaxis de los comandos. También se pudo constatar que para ambas plataformas se requiere exactamente de los mismos componentes, para poder instalar Spark (ver sección 2.4).
Se hizo varias iteraciones, en cada una de ellas se fue variando el hardware asignado para el clúster y los datos a analizar. Uno de los aspectos que también se consideró (aunque no era el foco central del proyecto) fue la velocidad de procesamiento de Graphx; evidentemente, a mayor disponibilidad de hardware, mayor velocidad de procesamiento (ver Anexo G, Tabla 3); este aspecto también depende de factores como:
o Cantidad de nodos disponibles para el clúster.
o Número de cores y memoria RAM disponibles (por nodo). o Tamaño de la información a analizar.
o Algoritmo a ejecutar.
Con base en la experiencia obtenida, se deduce que no existen requerimientos de hardware ―específicos‖ para implementar Spark, todo depende de la magnitud de lo que se quiera hacer, específicamente de la cantidad de información que se desee procesar.
No es necesario que todos los nodos del clúster tengan las mismas características de hardware, al final GraphX es quien se encarga de hacer la distribución equitativa de la carga de trabajo.
58 Se llegó a implementar dos tipos de Cluster-Manager: Standalone (integrado en Spark) y YARN (Single-Node). GraphX solo fue ejecutado sobre Standalone Cluster, no se llegó a ejecutar sobre YARN. Con respecto a YARN, solo se llegó a su instalación y conexión con Spark en Mac OS, es decir que, se logró levantar el Shell de Spark sobre un clúster (YARN) en funcionamiento. Queda pendiente implementar YARN Multi-Node, para determinar cómo se comporta a la hora de administrar los recursos para la ejecución de los algoritmos de GraphX y ver qué tanto podría ayudar a mejorar su desempeño.
Se llegó a construir un grafo en GraphX mediante la importación de dos tipos de datasets: el primero contenía la información de los nodos, el segundo contenía información de las relaciones (ID origen – ID destino) entre los nodos. Luego se ejecutaron los algoritmos de GraphX sobre el grafo.
Uno de los datasets que se analizó contenía información referente a universidades, que hacían referencia a otras universidades. Se ejecutó un PageRank sobre aquellos datos, de ese resultado se extrajo las 10 universidades con más alto grado de importancia (Ranks) de entre todas, basado en las referencias de otras universidades hacia ellas. También se aplicaron algoritmos como Triangle Counting y Connected Components; dichos algoritmos corresponden a métricas de centralidad y clustering, que es el fuerte de GraphX.
La interpretación de los resultados obtenidos de este análisis, queda a criterio del investigador que desee poner en marcha esta tecnología a partir de este trabajo de fin de titulación, y quiera llegar más allá de su sola implementación.
59 RECOMENDACIONES
Luego de haber finalizado el proyecto y de haber llegado a varias conclusiones, se pone a consideración del lector algunas recomendaciones para futuros trabajos que pretendan surgir a partir de éste:
Spark puede ser probado en una sola máquina, incluso se puede montar un clúster usando máquinas virtuales, pero no es muy recomendable ya que Spark está diseñado para trabajos a gran escala y para la utilización de gran cantidad de hardware, por lo que si se lo implementa en una sola máquina ésta puede verse afectada en su rendimiento.
Es importante tener en cuenta el hecho de que todos los nodos del clúster deben estar conectados a la misma red, en la misma VLAN, si no se toma en cuenta esto habrá problemas de comunicación al intentar agregar un nodo esclavo al clúster.
Lo ideal para trabajar con Spark es contar con un ―Resource Manager‖ al cual apunten todos los nodos y de donde puedan consumir los recursos necesarios. Esto se puede conseguir mediante la implementación de Cluster-Managers como Mesos y YARN (que sí se llegó a implementar), de esta manera se evitará la incómoda replicación de los datasets en cada uno de los nodos del clúster y se tendrá mayor seguridad.
Para la construcción de un Grafo en Graphx se requirió como datos de entrada archivos de texto plano (.txt), que contenían la información de los nodos y sus relaciones, pero no se probó con archivos XML o CSV; sería interesante determinar si es posible importar datos en esos formatos de archivos.
Presentar los resultados de GraphX gráficamente (con la ayuda de algún software, como por ejemplo: Gephi) y tener la información un poco más legible (como para usuarios no avanzados), ya que todos los resultados de los
60 algoritmos aplicados se mostraban con mensajes del servidor incluidos, y en consola.
La manera en que se implementó Graphx en este trabajo de fin de titulación no es la única existente, y no necesariamente la mejor; lo interesante sería poder aplicar un procesamiento de este tipo, conectando Spark-Graphx a una base de datos en producción (como Neo4j por ejemplo) y aplicar minería de datos directamente sobre la base de datos y no sobre datasets exportados.
61 BIBLIOGRAFÍA
Aguirre, J. L. (Diciembre de 2011). Introducción al Análisis de Redes Sociales. Obtenido de http://www.pensamientocomplejo.com.ar/docs/files/J.%20Aguirre.%20Introducci%F3 n%20al%20An%E1lisis%20de%20Redes%20Sociales.pdf
Apache Spark. (2015). Spark SQL and DataFrame Guide. Obtenido de
http://spark.apache.org/docs/latest/sql-programming-guide.html#dataframes Apache Spark. (2015). Spark Streaming Programming Guide. Obtenido de
http://spark.apache.org/docs/latest/streaming-programming-guide.html Chen, R. (junio de 2015). Obtenido de https://github.com/realstolz/powerlyra
Dato-Code. (s.f.). PowerGraph. Obtenido de https://github.com/dato-code/PowerGraph Esteban, P. C. (02 de 08 de 2010). Introducción a los Clusters. Obtenido de
http://www.lintips.com/?q=node/117
Grupo TRC. (s.f.). Conceptos Básicos de Big Data. Obtenido de http://www.trc.es/pdf/descargas/big_data.pdf
Ian Robinson, J. W. (2015). Graph Databases.Beiji g: O’Reilly Media, I c., 5 Grave stei
Highway North.
IBM. (18 de Junio de 2012). ¿Qué es Big Data? Obtenido de
https://www.ibm.com/developerworks/ssa/local/im/que-es-big-data/
IDATHA. (Diciembre de 2014). BIG DATA – Conceptos Generales: White Paper - IDATHA.
Obtenido de http://www.idatha.com/es/whitepapers/Whitepaper-BigData.pdf INSNA. (s.f.). What is Social Network Analysis? Obtenido de
http://www.insna.org/what_is_sna.html
Ipiña, D. L. (8 de Noviembre de 2012). Bases de Datos No Relacionales (NoSQL). Obtenido de http://es.slideshare.net/dipina/bases-de-datos-no-relacionales-nosql
J. Aguilar, E. L. (2004). Introducción a la Computación Paralela. Merida.
Krot, A. (25 de Marzo de 2015). Social Network Analysis. Spark GraphX. Obtenido de http://kukuruku.co/hub/algorithms/social-network-analysis-spark-graphx
Kuntamukkala, A. (s.f.). Apache Spark, An Engine for Large-Scale Data Processing. Obtenido de https://dzone.com/refcardz/apache-spark
Lantares. (s.f.). Velocidad, variedad y volumen, las 3 magnitudes clave de Big Data. Obtenido de http://www.lantares.com/blog/velocidad-variedad-y-volumen-las-3-magnitudes- clave-de-big-data
Malak, M. S. (2015). En M. S. Malak, Spark GarphX in Action (pág. 25). Manning Publications. Maribel Tirados. (1 de Octubre de 2014). Bases de datos orientadas a grafos. Obtenido de Big
Data Hispano: http://www.bigdatahispano.org/noticias/bases-de-datos-orientadas-a- grafos/
62 Martin Odersky, L. S. (10 de 12 de 2008). Programming in Scala, First Edition. Obtenido de
http://www.artima.com/pins1ed/a-scalable-language.html
Menéndez, L. S. (Julio de 2003). Análisis de redes sociales: o cómo representar las estructuras sociales subyacentes. Obtenido de http://digital.csic.es/bitstream/10261/1569/1/dt- 0307.pdf
Moreno, M. M. (11 de Diciembre de 2008). Análisis de redes sociales: un tutorial. Obtenido de http://homepage.cs.uiowa.edu/~mmonsalv/bio/SNA.pdf
Nasca, A. A. (12 de Agosto de 2014). Introducción a NoSQL - Graph DataBase Neo4j. Obtenido de https://prezi.com/xaitejgkpqsv/introduccion-a-nosql-graph-database-neo4j/ ORACLE. (2015). Obtenido de
http://www.oracle.com/technetwork/java/javase/overview/index.html
Polanco, X. (27 de Junio de 2008). An´alisis de redes: introducci´on. Obtenido de https://hal- pasteur.archives-
ouvertes.fr/file/index/docid/218397/filename/XP_Analisis_de_redes_2006.pdf Research, F. (22 de 12 de 2011). Relationship graph analysis is almost inherently "Big Data".
Obtenido de http://blogs.forrester.com/james_kobielus/11-12-19-
the_year_ahead_in_big_data_big_cool_new_stuff_looms_large#comment-15468 SS8. (s.f.). Social Network Analysis. Obtenido de https://wikileaks.org/spyfiles/files/0/207_SS8-
SOCIALNETANALYS-201110.pdf
Stanley Wasserman, K. F. (2013). Análisis de redes sociales, métodos y aplicaciones. Madrid. The Apache Software Foundation. (25 de 10 de 2014). Welcome to Apache Giraph! Obtenido
de http://giraph.apache.org
The Apache Software Foundation. (25 de 10 de 2014). Welcome to Apache Giraph! Obtenido de http://giraph.apache.org
The Apache Software Foundation. (18 de 07 de 2015). Obtenido de Welcome to Apache Maven: https://maven.apache.org
63 ANEXOS
64 ANEXO A: INSTALACIÓN DE SBT.
Para la instalación de SBT (Simple Build Tools) se debe seguir los siguientes pasos:
a. Descargar SBT, lo puede hacer desde su sitio web oficial. b. Mover el archivo .jar a la carpeta ―bin‖.
c. Seguidamente, ir a la carpeta ―bin‖ y crear un archivo de texto con el siguiente
script:
d. Hacer el script ejecutable mediante el siguiente comando:
Otra manera de instalar SBT es ejecutandoo la siguiente cadena de comandos:
En caso de tener algún error ejecute el comando:
SBT_OPTS="-Xms512M -Xmx1536M -Xss1M -
XX:+CMSClassUnloadingEnabled -XX:MaxPermSize=256M"
chmod u+x /bin/sbt
echo "deb http://dl.bintray.com/sbt/debian /" | sudo tee -a /etc/apt/sources.list.d/sbt.list
sudo apt-get update sudo apt-get install sbt
65 ANEXO B: INSTALACIÓN DE SCALA.
Para instalar SCALA debe ejecutar la siguiente cadena de comandos en una terminal:
En caso de tener algún error ejecute el comando:
wget http://www.scala-lang.org/files/archive/scala-2.11.4.deb sudo dpkg -i scala-2.11.4.deb
sudo apt-get update
sudo apt-get install scala
66 ANEXO C: INSTALACIÓN DE MAVEN.
Para instalar Maven primeramente debe descargarlo desde su sitio web oficial, luego acceder al directorio de descarga, descomprimir y proceder a establecer las variables de entorno para el correcto funcionamiento de Maven.
Desde una terminal acceder al directorio donde descomprimió Maven y ejecutar las siguientes líneas de comando:
Figura 25. Variables de entorno para Maven. Fuente: El Autor.
67 ANEXO D: INSTALACIÓN DE JDK.
La instalación de JDK se detalla en los siguientes pasos:
a. Descargar Oracle Java JDK para Linux. Asegúrese de seleccionar los
binarios “correctos” para la arquitectura de su sistema, 32-bit o 64-bit.
Información importante: Los binarios de 64-bit Oracle Java no funcionan en Ubuntu Linux 32-bit, sólo aparecerán muchos errores.
b. Copie los binarios en el directorio de /usr/local/java. En la mayoría de los casos, los binarios de Oracle Java se descargan en:
/home/"nombre_de_usuario"/Downloads.
32-bit Oracle Java en 32-bit Ubuntu Linux, instrucciones de instalación:
64-bit Oracle Java en 64-bit Ubuntu Linux, instrucciones de instalación:
Nota: Si salta un error de que no existe el directorio ―/usr/local/java/‖ se debe crear la carpeta java dentro del directorio ―/usr/local/‖.
c. Ejecute los siguientes comandos en los archivos tar.gz descargados. Asegúrese de hacerlo como root para poder hacer que se ejecuten para todos
cd /home/"nombre_de_usuario"/Downloads
sudo mv jdk-8u25-linux-i586.tar.gz /usr/local/java/ cd /usr/local/java
cd /home/"nombre_de_usuario"/Downloads
sudo mv jdk-8u25-linux-x64.tar.gz /usr/local/java/ cd /usr/local/java
68 los usuarios en su sistema. Para abrir la terminal de root teclee ―sudo su‖,
tendrá que proporcionar la contraseña de inicio de sesión.
32-bit Oracle Java en 32-bit Ubuntu Linux, instrucciones de instalación:
64-bit Oracle Java en 64-bit Ubuntu Linux, instrucciones de instalación:
d. Descomprimir los binarios Java, en el directorio /usr/local/java
32-bit Oracle Java en 32-bit Ubuntu Linux, instrucciones de instalación:
64-bit Oracle Java en 64-bit Ubuntu Linux, instrucciones de instalación:
e. Revise sus directorios. Hasta ahora deberá tener dos directorios binarios en /usr/local/java para el Java JDK/JRE:
jdk1.8.0_25
f. Editar el archivo PATH del sistema /etc/profile y agregar las siguientes variables de sistema al PATH. Usar nano, gedit o cualquier otro editor de texto, como root, para abrir /etc/profile.
O
sudo chmod a+x jdk-8u25-linux-i586.tar.gz
sudo chmod a+x jdk-8u25-linux-x64.tar.gz
sudo tar xvzf jdk-8u25-linux-i586.tar.gz
sudo tar xvzf jdk-8u25-linux-x64.tar.gz
ls -a
sudo gedit /etc/profile
69 g. Desplácese hacia abajo hasta el final del archivo usando las teclas de
flechas y agregue las siguientes líneas al final de su archivo /etc/profile.
h. Guarde el archivo /etc/profile file y salga.
i. Informe a su sistema de Ubuntu Linux dónde está ubicado el Oracle Java JDK/JRE. Esto le dirá a tu sistema que hay una nueva versión de Oracle Java.
Este comando notifica al sistema que Oracle Java JRE está listo para usarse.
Este comando notifica al sistema que Oracle Java JDK está listo para usarse.
Este comando notifica al sistema que Oracle Java Web Start está listo para usarse.
j. Informe a su sistema que Oracle Java JDK/JRE debe ser el Java por defecto.
Este comando configurará el JRE para el sistema.
JAVA_HOME=/usr/local/java/jdk1.8.0_25 PATH=$PATH:$HOME/bin:$JAVA_HOME/bin export JAVA_HOME
export PATH
sudo update-alternatives --install "/usr/bin/java" "java" "/usr/local/java/jdk1.8.0_25/bin/java" 1
sudo update-alternatives --install "/usr/bin/javac" "javac" "/usr/local/java/jdk1.8.0_25/bin/javac" 1
sudo update-alternatives --install "/usr/bin/javaws" "javaws" "/usr/local/java/jdk1.8.0_25/bin/javaws" 1
70 Este comando configurará el Javac Compiler para el sistema.
Este comando configurará el Java Web Start para el sistema.
k. Una instalación exitosa de 32-bit Oracle Java mostrará:
Este comando muestra la versión de Java que está en su sistema. Deberá recibir el siguiente mensaje:
Este comando deja saber que ya podrá compilar programas Java para la terminal. Deberá recibir un mensaje que diga:
l. Una instalación exitosa de Oracle Java 64-bit mostrará lo siguiente:
Este comando mostrará la versión de Java que está en su sistema. Deberá recibir un mensaje que diga:
sudo update-alternatives --set javac /usr/local/java/jdk1.8.0_25/bin/javac
sudo update-alternatives --set javaws /usr/local/java/jdk1.8.0_25/bin/javaws
java -version
java version "1.8.0_25"
Java(TM) SE Runtime Environment (build 1.8.0_25-b17)
Java HotSpot(TM) Client VM (build 25.25-b02, mixed mode)
javac -version
javac 1.8.0_25
java -version
java version "1.8.0_25"
Java(TM) SE Runtime Environment (build 1.8.0_25-b17)
71 Este comando hace saber que ahora podrás compilar programas Java desde la terminal. Deberá recibir un mensaje que diga:
m. Ahora reinicie el sistema. Después de eso, su sistema estará completamente configurado para correr y desarrollar programas Java.
javac -version
72 ANEXO E: APLICACIÓN DE EJEMPLO – GRAPHX.
Este algoritmo es una aplicación en la que se implementa un PageRank sobre determinados datasets.
Es posible reutilizarla con sus propios datos, siguiendo el proceso descrito en la sección 3.3.
import org.apache.spark._
import org.apache.spark.graphx._ import org.apache.spark.rdd.RDD
val graph = GraphLoader.edgeListFile(sc, "graphx/data/twrel.txt") // Run PageRank
val ranks = graph.pageRank(0.0001).vertices
val users = sc.textFile("graphx/data/twett.txt").map { line => val fields = line.split(",")
(fields(0).toLong, fields(1)) }
val ranksByUsername = users.join(ranks).map {
case (id, (username, rank)) => (username, rank) }
// Print the result
73 ANEXO F: CAPTURAS GRAPHX
Ilustración 1. Primera aplicación en el clúster. Fuente: El Autor
Ilustración 2. Datos de aplicación finalizada. Fuente: El Autor.
74 Ilustración 3. Levantamiento del máster y localhost como nodo.
Fuente: El Autor.
Ilustración 4. Nodo externo agregado correctamente. Fuente: El Autor.
75 ANEXO G: DESPLIEGUE DE GRAPHX SOBRE STANDALONE-CLUSTER
Para realizar este ejercicio se debe hacer lo siguiente:
1. Lo primero que hay que hacer es levantar el clúster Standalone, como se vio en la sección 3.2.
2. Los datasets utilizados corresponden a 2 archivos de texto (extensión .txt):
a. El primero contiene la información de los nodos, los campos están separados ya sea por un espacio tabular o por una coma. En este caso el grafo corresponde a usuarios de Twitter y su estructura se muestra en la figura 26.
Figura 26. Dataset – Nodos. Fuente: El Autor.
b. El segundo contiene las relaciones, id de origen - id de destino,