apache-ambari-project

Han pasado casi 6 años desde los artículos de Mordiendo Hadoop: Mordiendo Hadoop: Instalación y primeras pruebasMordiendo Hadoop: Instalación en Cluster y Mordiendo Hadoop: Desarrollo de aplicaciones MapReduce. En ese tiempo el ecosistema de Hadoop se ha enriquecido, su arquitectura ha cambiado y su uso se ha extendido, convirtiéndose en la referencia de tecnología para Big Data. En estos años hemos realizado varias instalaciones de Hadoop en el grupo de Ingeniería de Información de la universidad, tanto para los cursos de maestría como para proyectos de pregrado y postgrado.

Desde hace poco más de 3 años, usamos la distribución de HortonWorks, HDP, por su facilidad de instalación (a través de ambari), por ser de código abierto y por su estabilidad. Cada vez es más fácil realizar la instalación, pero todo depende de la configuración previa de los nodos. En este artículo describiré la instalación de HDP, los pasos preliminares y las lecciones aprendidas que pueden ser aplicadas a nuevas instalaciones ( una traducción-resumen de la documentación oficial, con algunos consejos).

Preparación

Antes de iniciar la instalación de la plataforma HDP, debemos asegurarnos de cumplir con unos prerrequisitos:

  1. Tener instalado en los nodos un sistema operativo soportado (Recomendados para HDP 2.3: Centos 6.x o 7.x). Consejo: Instalar el sistema operativo en inglés, ambari en ocasiones tiene problemas con la codificación de caracteres cuando el sistema operativo tiene un idioma diferente.
  2. Desde la que será la máquina host de ambari el usuario root debe poder autenticarse sin contraseña a las otras máquinas del cluster.
  3. Todas las máquinas deberían tener la hora sincronizada (usando ntp), el servicio de ntp debe estar configurado para iniciar al iniciar el sistema operativo.
  4. Todas las máquinas deben ser alcanzables por nombre de dominio. (DNS es la mejor opción, si no es posible se puede lograr agregándolas al /etc/hosts de todas las máquinas).
  5. Cada máquina debe tener correctamente configurado su FQDN (es una continuación del punto anterior). En especial, si la máquina tiene más de una interfaz de red debemos asegurarnos que siempre resuelva su nombre de dominio con la misma dirección IP (y que sea la que está en el segmento del cluster).
  6. El número máximo de descriptores de archivos abiertos (el número máximo de archivos abiertos de forma simultanea) debe ser de, como mínimo, 10000 (el recomendado es 65536 ). Se puede verificar usando ulimit -Snulimit -Hn (Límite suave y fuerte respectivamente) y se puede cambiar usando ulimit -n 10000.
  7. Desactivar SELinux  y configurar el firewall para que las máquinas del cluster puedan comunicarse entre ellas por los puertos apropiados, y permitir el acceso de los usuarios a los servicios.  Se recomienda desactivar el firewall durante el proceso de instalación, e iniciarlo y configurarlo apropiadamente una vez la instalación esté completa.
  8. Debemos tener una idea de cómo vamos a distribuir los servicios en el cluster (en qué máquinas tendremos los servicios maestros y en cuáles tendremos los esclavos y los clientes).

Instalación

Antes de iniciar la instalación debemos determinar cuál será la máquina dedicada como host de Ambari. En esta máquina debemos:

  1. Configurar el repositorio:
    wget -nv http://public-repo-1.hortonworks.com/ambari/centos7/2.x/updates/2.1.0/ambari.repo -O /etc/yum.repos.d/ambari.repo
    
  2. Instalar ambari-server:
    yum install ambari-server
  3. Configurar ambari-server:
    ambari-server setup
    1. Seleccione el JDK deseado (Oracle JDK 1.8 es una buena opción). Debe aceptar la licencia para continuar con la instalación.
    2. Si desea tener una manejador de bases de datos diferente a postgres para ambari, seleccione la configuración avanzada. En caso contrario acepte el valor por defecto (En ese caso se creará en Postgres una base de datos llamada ambari; El usuario por defecto será ambari y contraseña bigdata).
  4. Inicie el servidor ambari:
    ambari-server start
  5. Desde un navegador web ingresar al servidor de ambari, http://<fqdn del servidor de ambari>:8080
    • Ingresar con el nombre de usuario y contraseña por defecto (admin /admin).Bienvenida de ambari
    • Al ingresar podrá crear un nuevo cluster usando el asistente, manejar los usuarios y grupos que pueden acceder a ambari y desplegar vistas.
    • Al iniciar el asistente para la creación de un nuevo cluster le solicitará un nombre. Debe ser descriptivo, porque es la forma de identificar el cluster en ambari.
      ambari2
    • El segundo paso del asistente es seleccionar la versión de HDP a instalar.  Si las máquinas tendrán conexión a Internet durante la instalación sólo es necesario indicar la versión, en caso contrario es necesario abrir las opciones avanzadas y configurar la dirección del repositorio local que se utilizará.
      ambari3
    • En el siguiente paso se agregan los nombres de las máquinas que harán parte del cluster, una por línea o utilizando expresiones.  También debe indicar la llave privada ssh autorizada para acceder a los nodos del cluster.  (Si realizó correctamente el paso 2 de la preparación, la llave privada probablemente estará en /root/.ssh/id_rsa del host de ambari)
      ambari4Si utilizó expresiones aparecerá una ventana confirmando los nombres
      ambari4.1
    • En el siguiente paso se instalará el agente de ambari en los hosts seleccionados y se pueden eliminar nodos que no se quieran incluir en el cluster.
      ambari5
    • A continuación es necesario seleccionar los servicios que se desean en el cluster.
      ambari6
    • Luego debemos seleccionar dónde quedaran los componentes maestros de estos servicios.
      ambari8
    • También seleccionar en qué nodos quedarán los componentes esclavos y los clientes de los servicios.
    • Antes de la revisión final y la instalación, debemos personalizar la configuración de los servicios. Ambari hace recomendaciones de acuerdo a las características de los nodos, que pueden ser usados como valores por defecto, sin embargo conviene revisarlas y es necesario completar las configuraciones que aparecen marcadas en rojo (para las cuales no hay un valor pre-establecido).
      ambari9
    • Luego se realiza una revisión final y se procede a la instalación, configuración y prueba de los servicios.
      ambari10
      ambari11
      El proceso de instalación puede tomar varios minutos, pero es completamente automático. Si hay una falla en alguno de los procesos se puede hacer clic en el mensaje para obtener el log (para determinar la causa). Son comunes los problemas de conexión con los servidores espejo, por lo que la solución más común es reintentar la instalación. Al finalizar verá el resumen de la instalación y podrá ir al tablero de control, en el cual puede ver cuáles servicios están activos, cuáles inactivos, los recursos utilizados, ver las alertas y realizar tareas de administración (por ejemplo, agregar un nuevo servicio al cluster, iniciar o detener un servicio y modificar la configuración).
      ambari12
      ambari13
      ambari14

El proceso de instalación es sencillo, semiautomático y permite tener rápidamente un entorno funcional. Sin embargo, se debe tener en cuenta que esta instalación es sólo un punto de arranque y se deben definir políticas para el uso de los recursos (generalmente más de un usuario utilizará el cluster) e ir ajustando la configuración de acuerdo a las métricas obtenidas.

 

Camino

Cuando era pequeño, en la casa de mi abuela, en un libro que nunca volví a encontrar y que no sé cómo llegó a mis manos, leí sobre una interpretación del universo (probablemente influenciada por doctrinas filosóficas de India) que afirmaba que la verdadera forma de los seres humanos es el alma inmortal y su objetivo es alcanzar la sabiduría y, a través de ella, la iluminación.

Camino

Según esa interpretación la existencia en este mundo es una forma de aprender. El alma encarna tantas veces como sea necesario para aprender de sus vivencias y llegar a la sabiduría.  Almas jóvenes conviven con almas que han pasado por varias vidas y que han acumulado conocimiento, pero también corrupción. En todas las vidas se aprende, pero este conocimiento puede llevar a la iluminación o a la perversión. En ocasiones, algunos seres que han alcanzado la iluminación deciden volver para enseñarle el camino a aquellos que quedan atrás.

Hace poco estaba pensando que, según este modelo, el mundo va en decadencia: es un curso lleno de estudiantes problemáticos, en la que la voz de los guías se pierde entre el ruido.

Cluetrain Manifesto

Hace unos días tuve algunas conversaciones con un tema en común: el uso de las redes sociales por parte de las empresas. Me parece interesante que muchos de los errores que se cometen en las redes sociales en realidad son los mismos que se vienen cometiendo por no entender los cambios que se produjeron gracias a Internet, en especial con la llegada de la Web 2.0, y que en 1999 llevaron a la publicación de las 95 tesis (esp) del Cluetrain Manifesto (que fueron extendidas en el libro homónimo publicado en el 2000).

Los problemas siguen siendo los mismos: tratar de usar la red como un medio masivo, sin escuchar, sin comprender que los mercados son conversaciones y que se necesitan una voz humana; tratar de poner barreras a la información sin considerar que los contenidos no se generan únicamente en el departamento de marketing, ahora todos los empleados y todos los usuarios tienen voz; olvidar que un comunicado de prensa no es una conversación.

 La solución no está en contratar a aquel usuario de redes sociales con muchos seguidores, que no sabe nada sobre el funcionamiento de la empresa y no puede generar conversaciones valiosas sobre los productos o servicios. Podemos encontrar las voces adecuadas dentro de la organización, que conozcan el dominio y puedan actuar de manera rápida, atendiendo las peticiones de los usuarios. Los directivos de la organización también deberían comunicarse usando los medios sociales, hay algunos ejemplos notables, la gente quiere escuchar lo que tienen que decir.

En la red los usuarios tienen el poder, no hay público cautivo. Los contenidos publicados deben aportar valor y generar conversaciones para conseguir y mantener un lugar en los timelines.

La información debe fluir rápidamente, no se puede tapar el sol con un dedo. Esto es especialmente cierto cuando se presentan problemas, el tratar de ocultarlos en un entorno en el que no hay una única fuente de información sólo hace que se pierda la confianza.

El impacto en las redes sociales no se debe medir con el número de seguidores o likes sino, entre otras cosas, con la satisfacción de los clientes que se comunican usando estos canales.

 Para las empresas es mucho más cómodo pensar en medios masivos, públicos cautivos e información controlada, pero esto es sólo una ilusión y cuanto más se mantenga más daño hará y será más difícil recuperar la confianza y la comunicación con los clientes. 15 años debería ser tiempo suficiente para aprender esta lección.

Foto por Blake Bronstad, https://stocksnap.io/photo/KDW6ROR4WF, licencia CC0

Foto por Blake Bronstad, https://stocksnap.io/photo/KDW6ROR4WF, licencia CC0

Estamos rodeados por pantallas, parlantes y multitudes, que nos roban el silencio. Es poco el tiempo en el que en realidad estamos solos, y la mayor parte de ese tiempo estamos buscando la forma de evitarlo. Conversar con un autor a través de un libro, perdernos en una historia o en la música, muchas veces es sólo una excusa para no sentirnos encerrados en nuestros pensamientos. Nos roban el silencio… y lo agradecemos.

Es un miedo aprendido. Hemos perdido la habilidad de hablar con nosotros mismos, tenemos un temor inmenso de lo que podríamos decirnos. “Conócete a ti mismo”, pero no mucho, corres el riesgo de descubrir que no te soportas.

Este temor nos lleva a depender de las relaciones con otros, relaciones que están basadas en una proyección de nuestra identidad a través del prisma de las expectativas comunes.

Escucharnos nos permitiría tener una idea de quienes somos, dejando de lado las valoraciones hechas por una sociedad que busca uniformarnos y de tribus a las que tendemos a adaptarnos. Tendríamos una idea clara de qué nos hace felices y cómo lo que hacemos va a favor o en contra de esa felicidad.

No todo nos gustará, veremos las sombras, los demonios, los miedos, todo aquello que hace parte de nuestra identidad. Es más fácil luchar contra un enemigo conocido.

Los niños hablan solos, viven en su propio universo, pero poco a poco empiezan a asociar ese comportamiento con algo inadecuado. El mundo nos roba el silencio y con él la identidad.

Shelter

No es raro verlo sentado observando el horizonte, contemplativo. Esta vez, sin embargo, tiene un aire diferente, un aura de tristeza lo envuelve. Es una escena que parece existir en un plano diferente, cercano pero inalcanzable. Sentado a pocos metros de la puerta de la casa, en el pasto, pero viviendo en un mundo lejano habitado únicamente por sus pensamientos que, a su vez, giran en torno a un único ser.

Su madre, que lo observa un poco preocupada desde la cocina, está lejos de imaginarse el porqué de este repentino marasmo. En la mañana había estado feliz, tanto como para notarlo a pesar de que nunca ha sido muy expresivo. Había estado leyendo, como de costumbre, aunque con una libreta en su mano escribiendo en ocasiones. Después del almuerzo había salido a caminar por la vereda, lo que se había hecho costumbre en el último mes. Hoy volvió más temprano y desde entonces está allí.

Todas las vacaciones llegaban a esta casa, en una pequeña zona rural lejos del ruido y el frío de la ciudad. Pronto se acabarán los dos meses de descanso. Él disfrutaba la tranquilidad del lugar, le gustaba leer y pasear por los alrededores de la casa. Hace un mes se alejó un poco más que en las ocasiones anteriores y encontró una pequeña cabaña deshabitada, que era usada por los trabajadores en época de cosecha.

Shelter

Se convirtió en su refugio, un lugar dónde olvidarse del mundo y descubrir mundos nuevos. Además, aunque no lo admitirá fácilmente, estaba fascinado por la vista: todas las tardes una niña, más o menos de su edad, se veía bailando, sola y sin música, en una casa cercana y el tenía el mejor asiento para disfrutar de la función. Todas las tardes él venía a la cabaña y, sin falta, ella ejecutaba su, cada vez más sublime, interpretación. Hay quien dice que la danza es la más pura forma de comunicación, para él sin duda era así, sentía que la conocía desde siempre a pesar de nunca haber hablado.

 Hace una semana decidió que debía hablarle, pero no sabía qué decirle. Esa aproximación sería una nueva experiencia, así que decidió planearla de manera cuidadosa. Sus palabras le parecían inadecuadas, las comparaba con aquellos personajes de novela que siempre tienen la palabra precisa para cada momento. Decidió que escribiría una carta, pero la leería al presentarse con ella. Continuaba asistiendo a la cita tácita, escribir se volvía mucho más fácil cuando la veía. Nunca parecía estar terminada.

Esta mañana decidió que estaba listo. Después del almuerzo tomó su carta y caminó, un poco nervioso, hasta la cabaña. Esperó la hora habitual pero la función, que había tenido una puntualidad ejemplar,  no empezaba. Esperó un poco más, mientras observaba la cabaña. De repente vio un pequeño papel, pegado al lado de una de las ventanas:

“Ha sido un privilegio contar con un público tan fiel. Lamentablemente la gira de verano ha terminado y debo regresar a la sede de la programación permanente, en la ciudad. Espero que, en una próxima oportunidad, pueda conocer un poco más de cerca al espectador que disfruta la danza tanto como yo.

 

A.”

lod-cloud_colored

Una pequeña lista de data sets  y colecciones de data sets de diferentes dominios y para diversos propósitos. La mayoría son de uso libre, sin embargo vale la pena consultar la licencia de cada uno.

Es una lista en construcción, se aceptan sugerencias 🙂

Colecciones

NombreDescripciónEjemplosObservaciones
AWS Public Data SetsData sets alojados en Amazon AWS (en S3 o instantaneas EBS)Google Books Ngrams
Million Song Dataset
Para descargar los datasets almacenados como instantáneas es necesario tener una cuenta AWS
Data.govData sets de las diferentes entidades de Estados UnidosDatos de precipitación, por hora, en Estados UnidosFormatos diversos
Linked Open Data CloudUna imagen svg con enlaces a datasets que han sido publicados en formato RDF (y cumplen las condiciones para ser considerados Linked Data)DBPedia
GeoNames
DBLP
Un buen punto de partida para ver el potencial de Linked Data
UCI Machine Learning RepositoryUn repositorio de datasets para aprendizaje de máquinaBag of words
Arrhythmia Data Set
Iris Dataset
Diferentes formatos y dominios, preparados para tareas de aprendizaje de máquina. Se encuentran los ejemplos clásicos y otros datasets que pueden ser útiles para múltiples aplicaciones.
Yahoo! WebscopeDatos liberados por Yahoo! para investigaciones académicas.Datasets de imágenesAlgunos de los datasets requieren aprobación para usarlos. Alguna vez realicé el proceso y tomó poco más de una semana.
Existe un límite de 5 datasets por semestre.
Algunos datasets están almacenados en AWS.
Stanford Large Network Dataset CollectionDatasets de redesOrkut
Amazon product co-purchasing network
La mayoría de los datos están en el formato de tabla de enlaces.
World BankDatasets del Banco Mundial.World Development Indicators
Europa Open-DataSitio web mantenido por la comisión europea para la publicación de datos abiertosErasmus mobility statistics 2011-12Tiene disponible un endpoint de sparkql en "https://open-data.europa.eu/sparqlep"

Datasets

NombreFormatoObservaciones
DBPediaOntología en formato owl
Tripletas RDF en formato N-Triples, N-Quads y Turttle
Los dumps son generados periodicamente. Para acceder a información actualizada es mejor usar el endpoind de sparql
Wikipedia DumpDumps de la base de datos: XML.
Otros datasets están disponible en formato HTML, OpenZim y CSV
StackExchange Data DumpsXMLDumps de todos los sitios de Stack Exchange (entre los que se encuentran, por ejemplo, StackOverflow y ServerFault)

Si se quiere realizar una consulta puntual es mejor usar StackExchange Data Explorer
FreeBaseData Dumps: N-Triples
APIs (Json): Búsqueda, MQL, por tema.
Freebase se volverá de solo lectura el 30 de marzo de 2015 y el API será retirada en junio 30. La idea es soportar el proyecto WikiData.
WikidataRDF/XML
N-Triples
JSON
HTML
Tiene una interfaz Linked Data, que permite seleccionar el formato de la respuesta usando negociación de contenido. Como alternativa se pueden usar extensiones para seleccionar el formato.
Se puede acceder a los dumps de la base de datos en formato JSON y RDF/XML
network

Gracias a Internet cada día compartimos más información, incluso sin darnos cuenta. ¿Qué tanto pueden llegar a saber las empresas de mí? Algunas herramientas pueden ayudar a hacernos una idea:

  • WolframAlpha Personal Analytics for Facebook– Un análisis de la red social personal, las aplicaciones usadas, patrones de uso, entre otras cosas. En uno de los post sobre la herramienta nos podemos hacer a una idea de lo que nos puede decir sobre nuestra cuenta, pero al probarla podemos descubrir cosas interesantes.

    WolframAlpha
    WolframAlpha
  • LinkedIn dejó de soportar,  hace relativamente poco, InMaps, una herramienta que permitía visualizar la red social y detectar comunidades, algo interesante especialmente por la naturaleza de las conexiones.  Con algo de conocimiento de programación, usando el API de LinkedIn y Gephi, podemos hacerlo.
  • El correo electrónico se ha vuelto parte de nuestras vidas, y se ha resistido a dejar de serlo aunque hayan varias propuestas para reemplazarlo. Immersion del MIT nos permite visualizar los intercambios de correo que hemos realizado y, usando sólo los metadatos, nos permite descubrir información interesante. Especialmente me parece útil ver los cambios que se tienen en las relaciones en el tiempo.
  • Gracias a Google Dashboard podemos ver todos los servicios que usamos de Google en una sola página. Es muy útil, pero no es todo lo que sabe Google sobre nosotros, también podemos revisar cómo nos ve Google Ads (en lo que se basa para mostrarnos publicidad), el historial de búsquedas y el historial de ubicaciones. También podemos exportar los datos usando Google Takeout.
  • Búsqueda de Google y Google Alerts. ¿Qué encontrará quien busque mi nombre en Google? El resultado puede, pero no debería, sorprendernos. Utilizar una alerta de Google para saber qué aparece sobre nosotros en el buscador puede ser una buena idea.
  • Cada vez que visitamos una página no sólo la empresa que visitamos recibe información. Ghostery, una extensión para Google Chrome, y Lightbeam, una extensión para Firefox, nos permiten conocer quién nos rastrea. La visualización que nos ofrece Lightbeam es especialmente atractiva.
Bet GB - Flickr https://flic.kr/p/6EFChY
Licencia Creative Commons

Resaltar lo obvio mientras hacemos lo imposible se ha convertido en nuestro juego favorito.

“Están locos”, al menos en algo había consenso. Esta opinión era generalizada entre quienes conocían su historia; los protagonistas también la compartían. Vivían en un mundo imaginario, todo lo que ocurriera fuera de él no importaba, descubrieron que ese era el secreto de la felicidad.

Su historia inició por casualidad, como todas las buenas historias. Un frió día de noviembre, el ruido y el desorden de la ciudad se escondían bajo la lluvia. Diana había salido de la universidad, después de presentar su último examen de la carrera, se disponía a disfrutar de un café en su lugar favorito. Paredes blancas, en las que se podían ver rimas de Bécquer,  contrastaban con la barra roja y las mesas de madera un poco rústicas; la música suave completaba el ambiente perfecto para perderse en los pensamientos. Diana leía “Amor eterno”, como  lo había hecho cientos de veces,  le gustaba cómo se veían las palabras en la pared bajo el dibujo de un pequeño árbol, como si fueran hojas que habían caído por el otoño.

Francisco entró para resguardarse de la lluvia, lo tomó por sorpresa mientras caminaba por la zona. Quedó gratamente sorprendido cuando observó el lugar después de respirar un poco. Sólo la mesa en la que estaba Diana estaba ocupada, se veía tan cómoda y feliz que parecía hacer parte del lugar. No podría imaginarlo sin ella, perdería su propósito. Aunque temía romper aquel equilibrio, e iba en contra de su comportamiento habitual, decidió acercarse para hablar con ella.  Diana, un poco sorprendida, aceptó.

Hablaron por horas, tenían en común el gusto por la literatura, en especial la poesía. Al caer la noche concertaron una cita para el siguiente día. Se despidieron. Diana estaba sorprendida por la conexión que habían logrado en tan poco tiempo. Esa noche Francisco no durmió.

Desde que era muy pequeño Francisco había tenido clara su vocación. Su familia era muy apegada a las tradiciones y cercana a la iglesia, todos estaban orgullosos de la decisión de Francisco de entrar al seminario para convertirse en sacerdote. Ahora, por primera vez, titubeaba. Estaría sólo una semana en la ciudad, antes de volver al internado. Una semana para aclarar sus dudas.

Pasaron juntos todo el tiempo posible. Al final de la semana Francisco no tenía dudas. ¿Cómo decirlo a las familias? El problema no era sólo la familia de Francisco, la familia de Diana no vería con buenos ojos que abandonara el seminario por ella.

Decidieron olvidar las opiniones de los demás. Se amaban, nada más importa. Vivían en su mundo imaginario, nadie más podía entrar.

Materializar el mundo imaginario costó un poco más. Abandonaron todo lo que conocían. Una ciudad distinta sirve como escenario para la historia. Un profesor de latín y una joven diseñadora, tomados de la mano, completan el paisaje.

 

 

Spark

Apache Spark es un framework de computación en paralelo, que promete velocidades hasta 100 veces mayores a las de Hadoop Map Reduce. Puede correr de manera local (en uno o varios hilos) o en cluster sobre Apache Mesos, Hadoop YARN, o en modo Standalone.

En este pequeño ejemplo crearemos un proyecto en eclipse con las dependencias necesarias para Spark y desarrollaremos un contador de palabras. Spark tiene API nativas para Scala, Python y Java. En este ejemplo usaremos Java 8.

Lo primero que haremos será crear un proyecto Maven en Eclipse:

Nuevo proyecto Maven en Eclipse Luna

En este caso seleccionamos el arquetipo por defecto, e introducimos el id del grupo y el id del artefacto que deseemos para nuestra aplicación.

El siguiente paso es añadir las dependencias al archivo pom.xml, así:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
 <modelVersion>4.0.0</modelVersion>

 <groupId>uniandes.bigdata</groupId>
 <artifactId>sparkDemo</artifactId>
 <version>0.0.1-SNAPSHOT</version>
 <packaging>jar</packaging>

 <name>sparkDemo</name>
 <url>http://maven.apache.org</url>

 <properties>
 <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
 </properties>

 <dependencies>
 <dependency>
 <groupId>junit</groupId>
 <artifactId>junit</artifactId>
 <version>3.8.1</version>
 <scope>test</scope>
 </dependency>
 <dependency>
 <groupId>org.apache.spark</groupId>
 <artifactId>spark-core_2.10</artifactId>
 <version>1.0.1</version>
 <scope>provided</scope>
 </dependency>
 </dependencies>
</project>

La dependencia de spark tiene groupId org.apache.spark, artifactId spark-core_2.10 y versión 1.0.1. Utilizaremos el scope provided para que no se empaqueten las librerías en el jar que generaremos.

Nuestra clase WordCount tendrá la siguiente estructura,

package uniandes.bigdata.sparkDemo;

import java.util.Arrays;

import org.apache.spark.SparkConf;
import org.apache.spark.api.java.JavaPairRDD;
import org.apache.spark.api.java.JavaSparkContext;
import org.apache.spark.api.java.JavaRDD;

import scala.Tuple2;

/**
 * WordCount en Spark
 *
 */
public class WordCount
{
    /**
     * Recibe como parámetro la ruta del archivo de entrada.
     * Puede ser un archivo local o una ruta hdfs (hdfs://...)
     * */
    public static void main( String[] args )
    {
        String file=null;
        /**Recibir como parámetro el nombre del archivo
         **/
        if(args.length>0){
            file=args[0];
        }else{
            System.err.println("No se puede ejecutar sin un archivo");
            return;
        }
        //El nombre de la aplicación:
        SparkConf conf = new SparkConf().setAppName("PruebaSpark");
        //La aplicación se puede ejecutar en local para probar en desarrollo.
        //Cuando se ejecuta desde spark (usando spark-submit)
        //no se debe especificar el master:

        //conf.setMaster("local[*]");//Descomentar esta línea para probar localmente
        JavaSparkContext sc = new JavaSparkContext(conf);

        /*Lee un archivo de texto en el RDD. El archivo puede ser local, estar ubicado en el hdfs
          o en cualquier fuente soportada por Hadoop
        */
        JavaRDD<String> texto=sc.textFile(file);

        //Utilizamos las funciones de Spark, junto con las expresiones lambda de Java 8,
        //para crear una colección de palabras (usando flatMap),
        //crear un mapa con la palabra como llave y 1 como valor (mapToPair),
        //y reducirlo por llave de tal forma que obtenemos un mapa con la palabra como llave
        //y el número de apariciones como valor (reduceByKey)

        JavaPairRDD<String, Integer> byKey = texto.flatMap(l->Arrays.asList(l.split("\\s")))
                    .mapToPair(s->new Tuple2<String, Integer>(s.toLowerCase(),1))
                    .reduceByKey((a,b)->a + b);

        //Guardamos el resultado, como archivo de texto

        byKey.saveAsTextFile("salida");
    }
}

La aplicación se puede probar localmente descomentando la línea conf.setMaster(“local[*]”);. La cadena local[*] indica que se ejecute con tantos hilos como procesadores en la máquina local. Podemos especificar el número de hilos (e.g. local[2]), dar la ruta a un servidor Mesos o Spark, o especificar que use Hadoop YARN (usando “yarn-client” o “yarn-cluster”). Cuando se va a ejecutar la aplicación usando spark-submit, no se debe especificar en la aplicación la url del máster (se puede pasar como parámetro a spark-submit).

Instalar spark y ejecutar la aplicación

La instalación de spark se limita a descargar y descomprimir el paquete indicado. Si se desea usar Yarn, es necesario descargar los binarios compilados con compatibilidad para Hadoop 2, y asegurarse que las variables de entorno HADOOP_HOME, HADOOP_CONF y YARN_CONF están correctamente establecidas.

Después de generar el jar usando maven, podemos ejecutar la aplicación usando spark-submit:

spark-submit --verbose --master local --class uniandes.bigdata.sparkDemo.WordCount "rutaAljar\sparkDemo-0.0.1-SNAPSHOT.jar" "rutaAlArchivo\test.txt"

Un problema común en Windows, si no se tiene instalada la distribución de Hadoop de Hortonworks, es que la aplicación falle porque Spark no encuentra winutils.exe, que se debería encontrar en la carpeta %HADOOP_HOME%/bin. Este archivo se puede descargar del repositorio de HDP, como indican en uno de los foros de Azure.

 

Conclusiones

El no estar limitado al paradigma MapReduce, el uso de RDD (Resilient Distributed Dataset), junto con el uso de expresiones lambda (Java 8, Scala y python), hacen que el proceso de escribir una aplicación para Spark sea intuitivo. Algunas de las características de Spark se ven cuando se ejecutan varias tareas sobre un mismo dataset, dado que puede compartir datos en memoria entre diferentes trabajos.

Spark es una alternativa interesante, especialmente en aplicaciones que requieren iteraciones y reuso de los datos (como el análisis de grafos y aprendizaje de máquina). Proyectos como GraphX  y Spark Streaming, hacen aún más interesante este framework.

 

Licencia CC por el webmaster de Tierdoku.com

“El asesino es Delattre” dijo Bellard, sin el menor asomo de duda, lo que contrastaba con la expresión de todos los presentes. Daniel Delattre siempre ha demostrado ser una afectuoso, amable, dispuesto a ayudar a los demás aún más allá de sus posibilidades. No tenía sentido, no había nada que lo llevara a hacer algo como esto.

Bellard continuó con su relato. “Hace 2 días, después de asistir a una clase en su facultad, la hija de la víctima volvió a casa para encontrar el cuerpo de su padre en el recibidor, aproximadamente a las 10:00. Una hora más tarde me encontraba examinando la escena por primera vez. La puerta no había sido forzada, no había señales de lucha, la víctima no teñía una herida visible. Por la temperatura del cuerpo se concluyó que había muerto aproximadamente a las 9 de la mañana. El resultado de la autopsia demostró que había muerto de un paro cardíaco, causado por envenenamiento con una batracotoxina. El hecho de que fue envenenado por contacto hace muy poco probable el suicidio. La dificultad de tener un contacto accidental con esta sustancia, en la ciudad, apuntaba claramente a un homicidio.

Pierre Sicard era un contratista que hacía negocios principalmente con el gobierno. Unos días antes había logrado conseguir un gran contrato, por lo que alguna mafia podría no estar muy contenta. El tiempo de acción del veneno, que indicaba que fue administrado unos minutos antes de la hora de muerte, y el hecho de que las puertas no fueran forzadas ni existiera señal de lucha, indicaba que Sicard abrió la puerta y no sospechó de su asesino. Posiblemente lo conocía.

No había huellas, ni rastros del veneno fuera del cuerpo. El indicio más importante que teníamos en el momento era el tipo de toxina usado, no muchas personas tendrían acceso a ella. Esta pista hizo que se dirigieran las miradas a Nicolás Laurent, biólogo y ex-novio de la esposa de Sicard. Aunque ella había muerto un año antes, puede que Laurent nunca perdonara a Sicard a quien culpaba por el abandono.

Aunque Laurent tenía acceso a la toxina, su investigación se centraba en la familia Dendrobatoidea, la misma investigación lo liberaba de sospechas. Se encontraba como ponente en una conferencia en Alemania cuando ocurrieron los hechos.

Licencia CC por el webmaster de Tierdoku.com
Phyllobates terribilis

Como el único sospechoso hasta el momento tenía una coartada, volvíamos a estar como al principio. Bueno, no necesariamente, aunque la coartada lo liberaba como autor material, no lo hacía de cualquier responsabilidad. Empezamos entonces a evaluar las personas que podrían conectar a Laurent con Sicard. Los amigos y familiares de la esposa de Sicard entraban en este grupo. Daniel Delattre fue uno de sus amigos más cercanos.

Algunas personas habían visto a Delattre y a Laurent conversando unos meses antes. Esto apuntaba a Delattre, pero no tenía sentido. ¿Qué podía llevar a una persona como Daniel Delattre a hacer algo así?

Teniendo en cuenta el vínculo que unía a los involucrados, indagamos sobre la relación entre Sicard y su esposa. Después de 20 años de matrimonio se hicieron visibles los problemas, un año antes de la muerte de Marie. Delattre la conocía muy bien y culpaba a Sicard por su depresión, había perdido las ganas de vivir y se dejó derrotar por la enfermedad.

Revisamos el apartamento de Delattre y encontramos el <<arma>> homicida: Un guante.”