Blog de la Comunidad de PHD 2014 Consultores - Big Data e Inteligencia de Negocios.

www.phd2014consultores.com

martes, 20 de mayo de 2014

Mini Proyecto de Playlist, Parte 2


Ejercicio #1: Crear un Keyspace y tablas para la aplicación Playlist

  1. Iniciamos Cassandra y nos conectamos usando CQL shell.

  2. Creamos un Keyspace llamado “playlist”. Tenemos que usar un factor de replicación de 1.

cqlsh> create keyspace playlist with replication = {'class': 'SimpleStrategy', 'replication_factor': 1};

  1. Establecemos como predeterminado este Keyspace para esta sesión.

cqlsh> use playlist;
cqlsh:playlist>




Ejercicio #2: Crear y Cargar la tabla Artist

  1. Recordemos que tenemos una tabla en la que podemos buscar por la primera letra de un artista. Vamos a crear una tabla con sólo 2 columnas, la primera letra y el nombre del artista. El nombre del artista es único, así que éste será nuestra clave primaria (primary key).

cqlsh:playlist> create table artists_by_first_letter (first_letter text, artist text, primary key (first_letter, artist));



La clave primaria - primary key - compuesta nos permitirá hacer consultas por la primera letra.


  1. Ahora vamos a cargar los datos. Primero descomprimimos el archivo "session2.zip". En él encontraremos un directorio llamado también “session2” que contiene un archivo de artistas (nombre y primera letra). El delimitador es el caracter “|”. Se puede encontrar en el directorio “session2/scripts/”. Cargue este archivo en la nueva tabla con el comando COPY. Asegúrese de poner la ruta correcta al archivo.

cqlsh:playlist> copy artists_by_first_letter (first_letter, artist) from '/home/<nombre_usuario>/Desktop/Laboratorios/session2/scripts/artists.csv' with delimiter = '|';
3605 rows imported in 7.892 seconds.

  1. Ejecutamos algunas consultas sobre la tabla para verificar que se ha cargado la data correctamente:

cqlsh:playlist> select * from artists_by_first_letter limit 5;

 first_letter | artist
--------------+---------------------------------
            C |                  C.W. Stoneking
            C |                            CH2K
            C | CHARLIE HUNTER WITH LEON PARKER
            C |                   Calvin Harris
            C |                          Camané

(5 rows)

Podemos notar que la columna “first_letter” no está ordenada alfabéticamente, pero la columna “artist” está agrupada por la clave primaria.


Ejercicio #3: Iniciar la aplicación en Eclipse y ver los Artistas.

1. Abrimos Eclipse e importamos el Proyecto de la misma manera que se hizo en la sesión 1. 


Podemos ejecutar o hacer "Debug" de la aplicación como una aplicación Java (Java Aplication). Debemos elegir la clase StartJetty como la clase principal.



2. Visitamos la dirección http://localhost:8080/playlist. Hacemos click en “VISIT THE SONG DATABASE”. Luego hacemos click en cualquier letra para ver los artistas cuyo nombre comienza por esa letra.




3. Si hacemos click en cualquiera de los enlaces de género no se obtendrá ninguna canción. Vamos a añadir esa funcionalidad en los ejercicios posteriores.





Ejercicio #4: Crear y Cargar la tabla track_by_artist.

  1. Creamos una tabla denominada “track_by_artist”.

cqlsh:playlist> create table track_by_artist (track text, artist text, track_id UUID, track_length_in_seconds int, genre text, music_file text, primary key (artist));

  1. Importamos los datos:

cqlsh:playlist> copy track_by_artist (track_id, genre, artist, track, track_length_in_seconds, music_file) from '/home/<nombre_usuario>/Escritorio/Laboratorios/session2/scripts/songs.csv' with delimiter ='|' and header=true;
59600 rows imported in 1 minute and 12.824 seconds.



Ejercicio #5: Implementar un Prepared Select statement.


Hacemos click en la opción “VISIT THE SONG DATABASE”, haga click en 'P' y luego seleccione 'Pagan's Mind'. Esto causa una CQLException.




   La última línea de la excepción muestra que estamos en una clase llamada TracksDAO en el método listSongByArtist, antes de hacer una llamada al Driver DataStax Java. Esta es la clase del modelo que se encarga de recuperar la información de los tracks desde Cassandra.

Veamos ese archivo en Eclipse:





Modifiquemos las siguientes líneas:


String queryText = "SELECT * FROM track_by_artist WHERE artist = '" + artist + "'";
ResultSet results = getSession().execute(queryText);


Por:

PreparedStatement statement = getSession().prepare(
                                      "SELECT * FROM track_by_artist "
                                      + "WHERE artist = ?");
BoundStatement boundStatement = new BoundStatement(statement);
ResultSet results = getSession().execute(boundStatement.bind(artist ) );


El código completo queda:

public static List<TracksDAO> listSongsByArtist(String artist) {

    // TODO - This bombs if the artist name contains a single-quote.
    // TODO - Replace the next two lines of this method
    // TODO - with code which uses a prepared statement and bound statement

    //String queryText = "SELECT * FROM track_by_artist WHERE artist = '" + artist + "'";
    //ResultSet results = getSession().execute(queryText);
                PreparedStatement statement = getSession().prepare("SELECT * FROM track_by_artist WHERE artist = ?");
                BoundStatement boundStatement = new BoundStatement(statement);
                ResultSet results = getSession().execute(boundStatement.bind(artist));
               

    // TODO - Done replacing code

    List<TracksDAO> tracks = new ArrayList<>();

    for (Row row : results) {
      tracks.add(new TracksDAO(row));
    }

    return tracks;
  }


Reiniciamos la aplicación, ahora ya podemos hacer click en los artistas que tienen comilla simple en su nombre.


Ejercicio #6: Consultando por Género.

  1. Para consultar por género tendremos que crear una nueva tabla y cargar los datos:

cqlsh:playlist> create table track_by_genre (track text, artist text, track_id UUID, track_length_in_seconds int, genre text, music_file text, primary key (genre));


cqlsh:playlist> copy track_by_genre (track_id, genre, artist, track, track_length_in_seconds, music_file) from '/home/<nombre_usuario>/Escritorio/Laboratorios/session2/scripts/songs.csv' with delimiter ='|' and header=true;
59600 rows imported in 1 minute and 12.824 seconds.


  1. Ahora modificamos el método listSongByGenre() de la clase TracksDAO.
    El método debería verse así:

public static List<TracksDAO> listSongsByGenre(String genre) {

    ResultSet results = null;
   
    List<TracksDAO> tracks = new ArrayList<>();

    // TODO - implement the code here to retrieve the songs by genre in the "results" variable
    PreparedStatement statement = getSession().prepare("SELECT * FROM track_by_genre WHERE genre = ?");
                BoundStatement boundStatement = new BoundStatement(statement);
                results = getSession().execute(boundStatement.bind(genre));
               
   
   
    if (results != null) {
      for (Row row : results) {
        tracks.add(new TracksDAO(row));
      }
    }

    return tracks;
  }


Reiniciamos la aplicación, ya se puede visualizar las canciones por un género en particular.




 Ejercicio #7: Consultando por Género.

En este ejercicio vamos a ver como se utilizan los UUID como identificadores únicos para las canciones de la próxima sesión.

Cada canción tiene un track_id único que es de tipo UUID. Cada vez que creamos una nueva pista, tenemos que generar un nuevo UUID para el track_id. Esto se hace en el constructor del objeto TracksDAO.


public TracksDAO(String artist, String track, String genre, String music_file, int track_length_in_seconds) {
    this.track_id = UUID.randomUUID();  // We can generate the new UUID right here in the constructor
    this.artist = artist;
    this.track = track;
    this.genre = genre;
    this.music_file = music_file;
    this.track_length_in_seconds = track_length_in_seconds;
  }

Debemos notar que hay un constructor adicional a partir de una fila encontrada en Cassandra. No necesitamos generar un UUID, pues ya lo tenemos de la fila encontrada.

1.      Hacemos click en el link “Añadir Song” y agregamos una nueva canción. Luego hacemos click en el enlace de Género para el género de la canción que acabamos de agregar y validamos que esté en la lista. Si no está en la lista hay que examinar el método TraksDAO.add() y hacer los cambios pertinentes.

Nota: el método TraksDAO.add() solo insertará en la tabla track_by_artist, se puede hacer modificaciones para agregar también en la tabla track_by_genre (esto último sería lo ideal).

Solo hace falta agregar las siguientes líneas:

preparedStatement = getSession().prepare("INSERT INTO track_by_genre (genre, track_id, artist, track, track_length_in_seconds) VALUES (?, ?, ?, ?, ?)");
    boundStatement = preparedStatement.bind(this.genre, this.track_id, this.artist, this.track, this.track_length_in_seconds);
    getSession().execute(boundStatement);








sábado, 17 de mayo de 2014

Instalando Oracle Java 8 en Debian, Ubuntu o Canaima Linux

Para utilizar Apache Cassandra y otros programas desarrollados en Java, necesitamos instalar el kit de deasarrollo Oracle JDK. 

La versión de Java por defecto de éstas distribuciones de Linux, OpenJDK, actualmente tiene limitaciones que no permiten trabajar adecuadamente con el software que necesitamos. 


Instalación:


Añadimos los repositorios con:
sudo add-apt-repository ppa:webupd8team/java
Actualizamos los repositorios con:
sudo apt-get update
E instalamos la versión de Java que necesitemos:
  • Java 8:
sudo apt-get install oracle-java8-installer
Para comprobar que la instalación ha tenido éxito, ejecuta en una terminal el comando para saber la versión de Java que utiliza tu Ubuntu:
java -version
La terminal te debe devolver algo parecido a esto:
java version "1.8.0" Java(TM) SE Runtime Environment (build 1.8.0-b132) Java HotSpot(TM) 64-Bit Server VM (build 25.0-b70, mixed mode)

Si por algún motivo se refleja el uso de otra máquina virtual de java, como la Open Java, insertamos el siguiente comando:

sudo update-java-alternatives -s java-8-oracle

miércoles, 23 de abril de 2014

Mini Proyecto de Playlist, Parte 1



Mini Class Project (Linux)

            El Class Project consiste en una aplicación web de Playlist. Se ejecuta con una versión independiente del servidor de aplicaciones Jetty, y no necesita un servidor externo para ejecutarlo. Una vez que se esté ejecutando, podemos visitar la aplicación usando un navegador web.

  1. Descomprimimos el archivo session1.zipen “/home/<nombre_usuario>/Desktop/Laboratorios/”. Luego vamos al subdirectorio “target”.

$> cd /home/<nombre_usuario>/Desktop/Laboratorios/session1/target

  1. En el directorio se encuentra el archivo “playlist-1.0-SNAPSHOT.jar”que contiene una clase principal que hace una llamada StartJetty. Además todas las dependencias de bibliotecas necesarias están el directorio “lib”.

  2. Para ejecutar el programa:

$> java -cp 'playlist-1.0-SAPSHOT.jar:lib/*' StartJetty

La salida debería ser la siguiente:

0 [main] INFO StartJetty  - Web Resources Directory: jar:file:/home/luiscarl/Escritorio/Laboratorios/session1/target/playlist-1.0-SNAPSHOT.jar!/webapp
464 [main] INFO org.eclipse.jetty.server.Server  - jetty-8.1.12.v20130726
1374 [main] INFO org.eclipse.jetty.server.AbstractConnector  - Started SelectChannelConnector@0.0.0.0:8080

  1. Visitamos la aplicación Playlist en el navegador web introduciendo la dirección http://localhost:8080/playlist. Ésta se conectará a Cassandra e imprimirá información de clúster.






5. Si Cassandra no se está ejecutando, o no se pudo realizar la conección, se arrojará la excepción: NoHostAvailableException. Debemos iniciar Cassandra y refrescar el navegador.



Ejercicio #4: Abriendo el Proyecto en Eclipse

            Una vez instalado el eclipse, debemos seguir los siguientes pasos:

  1. Instalamos MAVEN. Para eso descomprimimos el archivo “apache-maven-3.2.1-bin.tar.gz” en el directorio “/home/<nombre_usuario>/app/”.


$> sudo cp -r /home/<nombre_usuario/Downloads/apache-maven-3.2.1-bin.tar.gz /home/<nombre_usuario/app/
$> sudo tar -xvzf /home/<nombre_usuario>/app/apache-maven-3.2.1-bin.tar.gz
$> sudo rm /home/<nombre_usuario>/app/*.tar.gz

  1. Configuramos el PATH:

$> PATH=/home/<usuario>/app/apache-maven.3.2.1/bin:$PATH ; export PATH

  1. Verificamos la instalación

$> mvn -version
Apache Maven 3.2.1 (ea8b2b07643dbb1b84b6d16e1f08391b666bc1e9; 2014-02-14T13:07:52-04:30)
Maven home: /home/luiscarl/app/apache-maven-3.2.1
Java version: 1.7.0_51, vendor: Oracle Corporation
Java home: /usr/local/java/jdk1.7.0_51/jre
Default locale: es_ES, platform encoding: UTF-8
OS name: "linux", version: "3.11.0-18-generic", arch: "amd64", family: "unix"

  1. Antes de continuar copiamos la carpeta “session1” en el directorio “/home/<nombre_usuario>/Desktop/Laboratorios/” y luego ejecutamos:

$> cd /home/<nombre_usuario>/Desktop/Laboratorios/session1/
$> mvn eclipse:eclipse

  1. Luego Abrimos el eclipse e importamos el proyecto:

$> cd /home/<nombre_usuario>/app/eclipse/
$> ./eclipse &


  1. Para importar el proyecto hacemos click: “File → New → Java Project”.
    Debemos seleccionar el directorio:
    “/home/<nombre_usuario>/Desktop/Laboratorios/session1”.
    Y colocar “session1” como nombre del proyecto.



  2. Sin embargo, Maven no encuentra las dependencias. Para solucionar esto se debe utilizar una variable de classpath que se debe añadir al workspace de eclipse. Para ello hacemos clic en: “Windows → Preferences” y en la caja de búsqueda escribimos “classpath” para encontrar la opción.





  1. Click en “New” y como ruta añadimos la del repositorio local: “/home/<nombre_usuario>/.m2/repository”.






  2. Al hacer clic en ok, eclipse volverá a compilar el proyecto y ya podrá encontrar las dependencias.

  3. Ya se puede ver el proyecto sin errores. En el archivo “CassandraData.java” podemos revisar el método que crea el objeto de Sesión con Cassandra. El objeto se guarda en una variable static y se puede manejar la sesión con comodidad.



  1. Ahora se puede hacer debug del proyecto y familiarizarse con él. Clic derecho sobre el proyecto y “Debug As → Java Application”. Seleccionamos el nombre de la clase principal “StartJetty”. Luego vamos a http://localhost:8080/playlist. en nuestro navegador.