lunes, 23 de enero de 2012

Arquetipo Maven para proyectos con Hadoop

Últimamente, he tenido que realizar un proyecto con Hadoop. Para facilitar esta tarea tenemos a nuestra disposición un arquetipo maven que nos simplifica enormemente el trabajo en estos proyectos. Para comenzar con un proyecto maven para Hadoo solo tenemos que utilizar la siguiente línea de comandos:
mvn archetype:generate -DarchetypeCatalog=http://dev.mafr.de/repos/maven2/

Selecciona hadoop-job-basic y completa los datos según se vayan pidiendo (artifactId, groupId, version) y tendrás un proyecto con el ejemplo tradicional de Hadoop WordCount.

Genera el proyecto de la manera tradicional con maven:
mvn install

Una vez generado, el fichero interesante es el artifactId-version-job.jar. Este fichero está autocontenido, con lo ejecutarlo en Hadoop es bastante sencillo:
hadoop jar artifactId-version-job.jar argumentos



martes, 17 de enero de 2012

Depurar node.js con Google Chrome (o Webkit)

Chrome, el navegador de Google, tiene una fantástica herramienta de depuración para aplicaciones web. Esta herramienta es genial para ayudar a evaluar que puede estar pasando en el código javascript del navegador (para arrancarlo el acceso rápido es Ctrl+Mayús+I en Windows y ⌥⌘I en Mac)

Dado que nodejs utiliza el mismo motor de javascript V8 que Chrome, la conclusión lógica es intentar utilizar esta herramienta para depurar aplicaciones nodejs, ¿no? Bien, pues resulta que es posible y sencillísimo.

Nota: me gusta desarrollar con TDD, es decir, en general no me gusta utilizar el depurador para desarrollar. Si se puede evitar, mejor que mejor. Sin embargo, como verás más abajo, con el depurador puedes inspeccionar todas la librerías que utiliza tu aplicación nodejs, lo cual considero treméndamente interesante para entender que pasa más allá de tu código.

Veamos cómo:

1. Instalamos node-inspector
Node Inspector (npm: node-inspector) es un interfaz de depuración para nodejs para poder utilizar el inspector de Chrome.
Como lo utilizaremos para depurar cualquier aplicación de nodejs, lo instalamos de manera global:
npm install -g node-inspector

Para arrancar node-inspector y dejarlo en segundo plano ejecutamos:
node-inspector &

En la consola veremos algo como:
info  - socket.io started
visit http://0.0.0.0:8080/debug?port=5858 to start debugging

Sobre windows: para arrancar node-inspector tuve que poner la ruta completa y lanzarlo directamente con node. Hice una instalación en c:\node-inspector, con lo que quedó así:
node C:\node-inspector\node_modules\node-inspector\bin\inspector.js



2. Montemos una aplicación de ejemplo para depurar.
Para el ejemplo montaremos una aplicación sencillota con express.
npm install express

Creamos un servidor "hola mundo" en el fichero server.js:
var express = require('express'),
    app = express.createServer();
app.get('/', function(req, res){
    res.send('Hello World');
});
app.listen(3000);

3. Y a depurar...
Arrancamos el servidor en modo depuración:
node --debug server.js

Con Google Chrome accedemos a http://0.0.0.0:8080/debug?port=5858 ( http://127.0.0.1:8080/debug?port=5858 ).

Y veremos la consola:



Desde aquí podemos poner puntos de interrupción, evaluar expresiones, interaccionar con la consola, ver el stack de llamadas, etc.


Y podemos inspeccionar todos los ficheros que utiliza node para realizar las tareas, con lo que conseguiremos hacer desaparecer la "automagia" de node y trabajar sobre seguro.

El listado de scripts desplegado:



Fragmento de http.js:



Inspección de objetos (esta captura la saco desde mac, que las anteriores eran en windows :) ):