Download Desarrollo de un entorno basado en MapReduce para la ejecución
Document related concepts
no text concepts found
Transcript
UNIVERSIDADE DA CORUÑA FACULTAD DE INFORMÁTICA Departamento de Electrónica y Sistemas PROYECTO FIN DE CARRERA DE INGENIERÍA INFORMÁTICA Desarrollo de un entorno basado en MapReduce para la ejecución distribuida de algoritmos genéticos paralelos -.Consideraciones técnicas.- Autor: Alberto Luengo Cabanillas Directores: Xoán Carlos Pardo Martínez Patricia González Gómez A Coruña, 21 de Septiembre de 2010 Índice general I Índice general CONSIDERACIONES TÉCNICAS ____________________________________________________1 1. INSTALACIÓN DEL SOFTWARE ____________________________________________________1 1.1 Prerrequisitos ____________________________________________________________1 1.2 Cygwin__________________________________________________________________1 1.3 Entorno virtualizado con Hadoop _____________________________________________2 1.4 Instalando VMWare Player __________________________________________________3 1.4.1 Configurando el Entorno Virtual ____________________________________________________ 4 1.4.2 Cuentas de usuario de la máquina virtual ______________________________________________ 5 1.4.3 Ejecutando un trabajo Hadoop ______________________________________________________ 5 1.4.5 Accediendo a la máquina virtual mediante ssh__________________________________________ 6 1.4.6 Apagando la máquina virtual _______________________________________________________ 7 1.5 Preparando Eclipse ________________________________________________________7 1.5.1 Descarga e instalación ____________________________________________________________ 7 1.5.2 Instalación del plugin Hadoop MapReduce ____________________________________________ 8 1.5.3 Haciendo una copia de Hadoop _____________________________________________________ 8 1.5.4 Ejecutando Eclipse _______________________________________________________________ 8 1.5.5 Configurando el plugin Hadoop MapReduce ___________________________________________ 9 1.6 PigPen: Plugin de Pig Latin para Eclipse______________________________________11 1.7 Interactuando con el HDFS_________________________________________________12 1.7.1 Usando la línea de comandos ______________________________________________________ 12 1.7.2 Usando el plugin MapReduce para Eclipse ___________________________________________ 13 1.8 Lanzando un programa de prueba____________________________________________13 1.8.1 Creación del Proyecto____________________________________________________________ 14 1.8.2 Creación de los archivos fuente ____________________________________________________ 14 1.8.3 Lanzando el trabajo contra el HDFS_________________________________________________ 15 2. MANUAL DE USUARIO DEL PROYECTO MRPGA _____________________________________19 3. MANUAL DE PROGRAMADOR DEL PROYECTO MRPGA ________________________________23 Índice de capturas III Índice de capturas CAPTURA 1: MÁQUINA WINDOWS VIRTUALIZANDO MÁQUINA LINUX ........................................................3 CAPTURA 2: INSTALACIÓN VMWARE PLAYER .........................................................................................4 CAPTURA 3: LISTADO DE SERVIDORES MAPREDUCE EN ECLIPSE 3.5........................................................10 CAPTURA 4: PLUGINS DE PIG Y HADOOP INSTALADOS EN ECLIPSE 3.5 .....................................................12 CAPTURA 5: CÓDIGO JAVA CLASE WORDCOUNTMAPPER .......................................................................16 CAPTURA 6: CÓDIGO JAVA CLASE WORDCOUNTREDUCER......................................................................17 CAPTURA 7: CÓDIGO JAVA CLASE WORDCOUNT ....................................................................................18 CAPTURA 8: RESULTADO EJECUCIÓN TRABAJO MR WORDCOUNT ...........................................................19 CAPTURA 9: MENÚ JAVA BUILD PATH EN ECLIPSE 3.5............................................................................20 CAPTURA 10: EDICIÓN DE PARÁMETROS DE LA APLICACIÓN EN ECLIPSE 3.5 ............................................21 CAPTURA 11: RESULTADOS DE EJECUCIÓN DEL PROYECTO MRPGA EN ECLIPSE 3.5 ................................22 Consideraciones Técnicas Página | 1 Consideraciones Técnicas A lo largo de este documento se abarcarán las cuestiones más técnicas del desarrollo del sistema, desde su configuración e instalación hasta su ejecución y uso. En la primera sección se procede a desarrollar un breve tutorial con los pasos necesarios para configurar el entorno adecuado de ejecución para la aplicación. En la sección 2 se incluye un manual de usuario en el que se explica la manera de ejecutar un AG determinado en el framework que se ha implementado y por último, en la tercera sección se incluye un breve manual para el programador que desee modificar alguna de las decisiones de implementación llevadas a cabo (p.ej. diferente operador de cruce o selección, diferente codificación de la población, etc.). 1. Instalación del Software A continuación se detallan los pasos seguidos para poder replicar el entorno en el que se ha desarrollado la aplicación. 1.1 Prerrequisitos Desarrollar programas para Hadoop requiere un entorno de programación Java. Se puede descargar un kit de http://java.sun.com/javase/downloads/index.jsp) desarrollo para una Java (JDK) multitud de (desde sistemas operativos. Hadoop requiere la versión 6 de Java Standard Edition (Java SE) que es la más actual a la hora de escribir estas líneas. 1.2 Cygwin Para poder conectarse a la máquina virtual sobre la que está montada nuestra distribución de Hadoop es necesario tener un nombre de usuario conforme a alguno de los existentes en la máquina virtual. Dicha comprobación la realiza el plugin conector de Eclipse cuando necesite conectarse al HDFS remoto, mediante el valor que devuelve el comando Unix whoami. Dicho comando no es nativo de Windows, por lo que se vuelve necesario tener un entorno Unix dentro de Windows desde el que lanzar Eclipse para que se comporte correctamente. Página | 2 La Consideraciones Técnicas solución más sencilla pasa por descargar e instalar Cygwin (http://www.cygwin.com/) a la máquina local. Este proceso es sumamente sencillo: solo hace falta descargar el instalador setup.exe de su página web y ejecutarlo para que se inicie el asistente que guiará al usuario durante todo el proceso de instalación. Hadoop funciona razonablemente bien en Cygwin, pero, oficialmente, es solo para propósitos de investigación. Hadoop en Cygwin puede ser inestable, e instalar el propio Cygwin puede resultar incómodo ya que no posee un asistente de instalación al uso. 1.3 Entorno virtualizado con Hadoop Esta sección explica cómo configurar una máquina virtual que ejecute Hadoop dentro del ordenador anfitrión. Los usuarios de Linux, MacOS, u otros entornos de estilo Unix son capaces de instalar Hadoop y ejecutarlo en una o más máquinas sin necesidad de más software a mayores que Java. Si el lector está interesado en esta opción, existen instrucciones disponibles en la página web de Hadoop en la sección de quickstart documentation (http://hadoop.apache.org/common/docs/r0.20.1/quickstart.html). Para facilitar la primera aproximación a Hadoop a los programadores, es interesante contar con una imagen de una máquina virtual que traiga una distribución de Hadoop preconfigurada. La imagen virtual se ejecutará dentro de un entorno sandbox en el que se podrá ejecutar otro sistema operativo. El SO dentro del sandbox no sabe que existe otro entorno operativo exterior a él; actúa como si estuviese en su propio ordenador. Este entorno sandbox es conocido como “máquina cliente”, ejecutando un sistema operativo cliente. La máquina física que ejecuta el software de virtualización se llama “máquina anfitrión” y ejecuta el sistema operativo anfitrión. La máquina virtual facilita otras aplicaciones de tal forma que simula que existe otra máquina física en la misma red. Las aplicaciones que se ejecutan en la máquina anfitrión ven la máquina virtual como una máquina aparte con su propia dirección IP, y pueden interactuar con los programas dentro de la máquina virtual de esta forma (véase Captura 1). Para finalizar, comentar que la máquina virtual también se puede ejecutar siendo Linux el sistema anfitrión, con las mismas características de conexión que en el caso anterior. Instalación del Software Página | 3 Captura 1: Máquina Windows virtualizando máquina Linux 1.4 Instalando VMWare Player La máquina virtual descargada en el apartado anterior está diseñada para ejecutarse en VMWare Player (http://www.vmware.com). Se pueden descargar copias del instalador de VMWare Player tanto para Linux en formato rpm, bundle o para Windows. En particular en el caso de Windows, se ejecuta como un asistente de instalación cualquiera. Si se está utilizando un sistema operativo distinto, o se prefiere descargar una versión más reciente de VMWare Player, una instalación alternativa consiste en acceder a http://info.vmware.com/content/GLP_VMwarePlayer y registrarse para solicitar un virtualization starter kit. A partir de ahí, se recibirá un e-mail con un enlace de descarga con sus instrucciones correspondientes. Página | 4 Consideraciones Técnicas 1.4.1 Configurando el Entorno Virtual Una vez descargada la máquina virtual en un directorio del disco duro de la máquina anfitrión, habrá que descomprimirla y hacer doble click sobre el fichero hadoop-appliance-0.18.0.vmx. Cuando se arranca la máquina virtual por primera vez, VMWare Player reconocerá que la imagen de la máquina virtual no está en la misma localización en la que solía estar, como se puede apreciar en la Captura 2; habrá que indicarle que se ha copiado y no que se ha movido. VMWare Player generará entonces nuevos identificadores de sesión para esta instancia. Si posteriormente se mueve a una localización diferente del disco duro, se le debería indicar a VMWare Player dicha operación. Una vez se elija una opción, se arrancará Linux de manera normal, asignándole una dirección IP sin usar en la red y mostrando un prompt para que el usuario se autentique. Captura 2: Instalación VMWare Player Instalación del Software Página | 5 1.4.2 Cuentas de usuario de la máquina virtual La máquina virtual viene configurada con dos usuarios: hadoop-user (con contraseña hadoop) y root (con contraseña root). La cuenta del primero tiene permisos sudo para ejecutar funciones de administración del sistema, tales como apagar la máquina virtual. Es muy recomendable arrancar Hadoop con este usuario y no como root, ya que puede haber algún problema de autenticación con el HDFS. Una vez autenticados, las primeras tareas a realizar serían las siguientes: Cambiar la distribución del teclado al idioma español: mediante el comando sudo dpkg-reconfigure console-setup. Cambiar la hora del sistema: mediante los comandos date y hwclock Igualmente, si hiciese falta, y antes de arrancar Hadoop, se debería actualizar éste a la versión que interesase –generalmente, a la del plugin de Eclipse con el que se va a comunicar. Las directivas para llevar a cabo esto se encuentran en la wiki del proyecto Hadoop: http://wiki.apache.org/hadoop/. 1.4.3 Ejecutando un trabajo Hadoop Una vez arrancada la máquina virtual como usuario hadoop-user, lo primero que se debe hacer es arrancar Hadoop mediante el siguiente comando: hadoop-user@hadoop-desk:~$ ./start-hadoop Si, por lo contrario, se ha instalado Hadoop en la máquina anfitrión, la secuencia de comandos sería la siguiente (asumiéndose que se ha instalado en ~/hadoop): usuario@maquina:~$ cd hadoop usuario@maquina:~/hadoop$ bin/start-all.sh Aparecerán una serie de mensajes indicando si la operación ha ido bien o mal. Si pregunta si es correcto conectarse a la máquina anfitrión actual, se debe contestar afirmativamente. Hecho esto, se procederá a ejecutar un programa ejemplo para asegurarse que el sistema está correctamente configurado: Página | 6 Consideraciones Técnicas hadoop-user@hadoop-desk:~$ cd hadoop hadoop-user@hadoop-desk:~/hadoop$ bin/hadoop jar hadoop0.18.0-examples.jar pi 10 1000000 La salida debería ser similar a lo siguiente: Wrote input for Map #1 Wrote input for Map #2 Wrote input for Map #3 ... Wrote input for Map #10 Starting Job INFO mapred.FileInputFormat: Total input paths to process: 10 INFO mapred.JobClient: Running job: job_200806230804_0001 INFO mapred.JobClient: map 0% reduce 0% INFO mapred.JobClient: map 10% reduce 0% ... INFO mapred.JobClient: map 100% reduce 100% INFO mapred.JobClient: Job complete: job_200806230804_0001 ... Job Finished in 25.841 second Estimated value of PI is 3.141688 Esta tarea lleva a cabo una simulación para estimar el valor de Pi basándose en un muestreo de puntos. El programa primero mapea una serie de puntos a unos ficheros, uno por tarea map. Luego calcula una estimación de Pi basándose en esos puntos, en la propia tarea MapReduce, obteniendo los resultados arriba mostrados. 1.4.5 Accediendo a la máquina virtual mediante ssh En vez de utilizar directamente el terminal de la máquina cliente, se puede autenticar el usuario en el sistema de forma remota mediante ssh desde la máquina anfitrión. Usando un cliente ssh como Putty (http://www.putty.org/) (bajo Windows), solo hace falta configurar la IP de la máquina cliente (visible al arranque de la misma o mediante el comando ifconfig, en el campo innet_addr). Nos pedirá el nombre de usuario y contraseña y se podrá interactuar con esta máquina virtual como si existiese otra máquina Linux en la red. Esto solo se puede hacer desde la máquina anfitrión. La imagen de VMWare Player está configurada por defecto para recibir peticiones únicamente de la máquina anfitrión a través de su interfaz de red. Por motivos de seguridad, la máquina virtual no Instalación del Software Página | 7 aparece en la red externa actual. Sin embargo, si se quisiese cambiar esto, se podría reconfigurar la máquina virtual para permitir acceso por red a cualquier máquina a través de su IP. En este caso, se deberían cambiar las contraseñas asociadas a las cuentas de la máquina virtual para impedir que usuarios desautorizados pudiesen hacer login con la contraseña por defecto. 1.4.6 Apagando la máquina virtual Una vez se haya acabado de trabajar con ella, la máquina virtual se puede apagar mediante el comando sudo poweroff, deteniéndose automáticamente todos los demonios Hadoop que se estuviesen ejecutando. 1.5 Preparando Eclipse Eclipse es uno de los entornos de desarrollo de aplicaciones basadas en Java más utilizados del mundo. Es un entorno integrado de desarrollo (IDE) de código abierto. Soporta múltiples lenguajes a través de la instalación de complementos o plugins. En esta sección se verá cómo obtener, configurar y usar Eclipse. 1.5.1 Descarga e instalación El sitio web de descargas de Eclipse (http://www.eclipse.org/) ofrece una gran variedad de versiones de descarga, basándose sobre todo en el perfil de programador que lo va a utilizar. La última revisión estable a la hora de escribir estas líneas es la 3.6, con el nombre en clave “Helios”. Sin embargo, debido al tiempo de desarrollo del proyecto no se utilizó dicha revisión, sino la anterior (versión 3.5.2, nombre en clave “Galileo”), la cual es compatible con el plugin de Hadoop que se mostrará a continuación (aunque la anterior versión 3.4 –nombre en clave “Ganímedes”- es incompatible). De entre las que se encuentran disponibles para descarga, se debería escoger para descargar bien Eclipse classic 3.5.2, o bien Eclipse IDE for Java developers. Al estar escrito en Java, Eclipse se puede migrar fácilmente de una plataforma a otra, por lo que está disponible tanto en Windows, como en MacOS, como en Linux. Instalar Eclipse es casi inmediato: viene comprimido en un fichero .zip que se descomprimirá en un directorio y se instalará de forma habitual, creando un acceso Página | 8 Consideraciones Técnicas directo a su ejecutable en caso de Windows o tecleando eclipse desde una consola de Linux. 1.5.2 Instalación del plugin Hadoop MapReduce Dentro del directorio hadoop-0.18.0/contrib/eclipse-plugin en el sistema de ficheros de la máquina virtual instalada se encuentra el fichero hadoop0.18.0-eclipse-plugin.jar que se deberá copiar al subdirectorio plugins/ del directorio de instalación de Eclipse. Si el lector descubre que el plugin en cuestión no funciona con su versión de Eclipse, puede optar por buscarlo en el repositorio de código de Google asociado a este proyecto (http://code.google.com/p/mrpga/) –en el que se pueden encontrar varios plugins compilados específicamente correspondientes a distintas versiones de Hadoopo, si se dispone de la herramienta de gestión de proyectos Ant (http://ant.apache.org/), compilar uno nuevo manualmente mediante el comando ant - Declipse.home=<dir de instalación de Eclipse> clean package (situándose en la carpeta raíz del directorio con el código fuente de Hadoop). 1.5.3 Haciendo una copia de Hadoop Mientras se están ejecutando los trabajos MapReduce en la máquina cliente, éstos se compilan en la máquina anfitrión, por lo que va a ser necesario tener una copia de Hadoop en un directorio del disco duro local. Esta copia o bien se puede obtener desde un repositorio o bien mediante clientes SCP para Windows como WinSCP (http://winscp.net/). 1.5.4 Ejecutando Eclipse Para arrancar Eclipse, primero es necesario ejecutar Cygwin, ya que de esta manera se podrá conectar el plugin de Hadoop al HDFS de la máquina cliente con un nombre de usuario adecuado. El sistema de rutas en Cygwin varía con respecto al de Windows, convirtiendo el árbol de directorios en una estructura similar a los sistemas Unix. Por ello, para ejecutar Eclipse, al igual que todas las aplicaciones Windows habrá que acceder a la ruta de instalación que será del estilo /cygdrive/c/eclipse. Ya Instalación del Software Página | 9 dentro del directorio, se arrancará Eclipse a través del comando ./eclipse.exe – clean. La primera vez que se ejecute Eclipse, pedirá especificar un directorio como workspace, en el que almacenará datos de configuración, ficheros objeto, etc. Una vez introducido, se accederá a una pantalla de bienvenida en la que se podrá empezar a trabajar. 1.5.5 Configurando el plugin Hadoop MapReduce En este apartado se verá cómo activar la perspectiva MapReduce dentro de Eclipse y cómo conectarse a la máquina virtual de Hadoop. Para ello, se deben seguir los siguientes pasos: 1. Arrancar Hadoop y la máquina virtual si no se ha hecho todavía de las formas anteriormente descritas. 2. Desde la parte superior derecha del área de trabajo, pulsar el botón “Open Perspective” (el que tiene forma de cuadro con una estrella en su esquina superior derecha) seguido de “Other...” para que explore todas las perspectivas disponibles en el sistema (ya que, por defecto, no cargará la perspectiva MapReduce). De momento, nada parece cambiar, pero desde el menú “Window->Show view-->Other” se abrirá un menú con todas las vistas cargadas. Debajo de “MapReduce Tools” se deberá elegir “Map/Reduce locations”, lo que hará que aparezca un nuevo panel visible en el fondo de la pantalla, cercano a “Console”. 3. En “Window-->Preferences”, dentro del apartado “Hadoop Map/Reduce” se indicará el directorio donde esté almacenada la copia local de la distribución correspondiente de Hadoop. 4. En el panel “Map/Reduce locations” recién creado, se debe hacer click sobre el logo del elefante para añadir un nuevo servidor MapReduce a Eclipse, como se muestra en la Captura 3. En este paso será necesario introducir un número de parámetros identificativos del servidor, los cuales en el caso de querer conectarse a la imagen virtualizada son: Location name: (Any descriptive name you want; e.g., "VMware server") Página | 10 Consideraciones Técnicas Map/Reduce startup) Map/Reduce DFS Master User name: Master Host: (The IP address printed at Master Port: 9001 Port: 9000 hadoop-user Captura 3: Listado de servidores MapReduce en Eclipse 3.5 El paso siguiente es ir a la pestaña “Advanced”, donde hay dos parámetros que es necesario cambiar: hadoop.job.ugi. Contiene las credenciales de login actuales de Windows. Hace falta reemplazar el primero de los valores –el nombre del usuario actual – por hadoop-user. mapred.system.dir: Hay que cambiarlo por /hadoop/mapred/system Una vez configurados estos parámetros aparecerá una nueva entrada bajo el árbol DFS Locations en el explorador de Proyectos de Eclipse. Haciendo click sobre el símbolo “+” se expandirá el árbol de directorios del HDFS remoto pudiendo ver su estructura si se ha configurado correctamente. Instalación del Software 1.6 Página | 11 PigPen: Plugin de Pig Latin para Eclipse PigPen es un plugin de Eclipse que ayuda a los usuarios a crear scripts en Pig Latin, probarlos usando el generador de ejemplos y enviarlos a un clúster Hadoop. El plugin en formato .JAR está disponible en la wiki del conector PigPen: http://wiki.apache.org/pig/PigPen. Asimismo, es recomendable descargar una distribución de Pig completa desde los repositorios habilitados a tal efecto (http://hadoop.apache.org/pig/releases.html) y el proyecto PigPen completo (disponible en el repositorio Google de código de este proyecto: http://code.google.com/p/mrpga/). Obsérvese por último que no todas las versiones de las distribuciones de Pig son compatibles con todas las versiones de Hadoop, por lo que se debe elegir con cuidado. El jar descargado se debe situar en el subdirectorio /plugins del directorio de instalación de Eclipse. Una vez hecho esto, hay que ejecutar Eclipse y dirigirse a "Help ->Install new software", introducir la ruta local de la carpeta de la distribución de Pig y desmarcar la casilla "Group items by category" (hay que estar conectado a Internet para que se resuelvan las dependencias que faltan). Ahora hay que configurar la variable "ClassPath" que apunte al directorio de PigPen y el jar de Pig al directorio anterior. Hecho esto, si se ha importado el plugin correctamente, aparecerá una nueva perspectiva “Pig Latin” (accesible desde el menú “Window-->Open Perspective->Other...”) y un nuevo conjunto de botones en la parte superior izquierda con los logos de dos cerdos y un elefante amarillo, tal y como muestra la Captura 4. El uso más habitual en entornos de producción es embeber Pig en una aplicación Java para que se conecte Pig al HDFS. Para ello, crearemos un fichero que contenga un script Pig Latin sencillo (se pueden encontrar varios en http://wiki.apache.org/pig/PigLatin) hay que pinchar con el botón derecho sobre el fichero ejemplopig.java que hayamos creado, irse a "Run Configurations" y de ahí a la pestaña "ClassPath". En esa pestaña, pinchar en "User Entries", pulsar "Advanced" y elegir "Add external folder". Finalmente, elegir la carpeta de Pig que contenga los ficheros pig.properties y hadoop-site.xml. Si todo ha ido bien, ya se podrá ejecutar el proyecto como "Run as Java Application". El último paso de configuración es indicar la ubicación del fichero pig.jar, para ello, dentro del menú “Window-->Preferences”, en el apartado “Pig”, se indicará la ruta local a dicho fichero (y si no existe, se deberá crear). Página | 12 Consideraciones Técnicas Para finalizar, si ahora se quisiera probar el "Example Generator" que trae PigPen y aparece un mensaje de error es porque el código Pig debe estar libre de errores (un pequeño truco: si parece que el script no tiene en apariencia ningún error, probar a introducir un retorno de carro después de la última línea). Captura 4: Plugins de Pig y Hadoop instalados en Eclipse 3.5 1.7 Interactuando con el HDFS Existen dos maneras principales de interactuar con el HDFS teniendo correctamente configurado el entorno de trabajo. 1.7.1 Usando la línea de comandos Un programa MapReduce un poco complejo requerirá de información externa para procesar: archivos de log, resultados de análisis de webs, etc. Pero antes de poder utilizar esta información, hay que cargarla en el sistema de ficheros distribuido. Para cargar información en el HDFS de la máquina virtual, existen varias opciones, entre ellas: 1. Hacer un scp de los archivos locales a la máquina virtual y luego utilizar el comando bin/hadoop fs –put... para subirlos al HDFS. Para esto, si se Instalación del Software Página | 13 está bajo un entorno Windows, se puede utilizar Cygwin o WinSCP; bajo entornos Unix este comando ya es nativo. 2. Sacar la información directamente de la máquina local a través de un comando put leyendo de la entrada estándar stdin. 3. Instalar las herramientas Hadoop en la máquina anfitrión y configurarla para que se comunique directamente con la máquina cliente. Para ello, se necesita copiar a un directorio de la máquina local la carpeta hadoop 0.20.1/ incluida en el directorio “resources” del DVD. Después de esto, se pueden personalizar los distintos ficheros de configuración (presentes en la carpeta conf/) para utilizar la máquina virtual como el sistema de ficheros distribuido por defecto. Si después se ejecutase el comando bin/hadoop fs –put en la máquina local, interactuarían con el HDFS servido por la máquina virtual. 1.7.2 Usando el plugin MapReduce para Eclipse Una forma más simple de manipular ficheros y directorios del HDFS es hacerlo a través del plugin de Eclipse. En el visor de localizaciones de DFS (DFS location viewer) de Eclipse se muestra el contenido del sistema de ficheros, pudiendo hacer click con el botón derecho del ratón sobre cualquier parte del mismo para desplegar todas las acciones contextuales: crear nuevos subdirectorios, subir ficheros individuales o subdirectorios enteros, o descargar todos los ficheros al disco local. Por ejemplo, si el directorio /user/hadoop-user no existe, se debe crear primero, ya que será nuestro espacio de trabajo en el HDFS; para ello, basta con pulsar con el botón derecho del ratón sobre el directorio raíz, especificar “Create new directory” y darle un nombre (user, en este caso). A continuación, para poder ver el nuevo directorio, hace falta pulsar el botón derecho del ratón y pulsar en la opción “Refresh”. Este procedimiento se repetirá hasta conseguir la estructura de directorios deseada. 1.8 Lanzando un programa de prueba En los primeros capítulos de la memoria principal ya se ha introducido el modelo de programación MapReduce, así como los elementos constituyentes del mismo. Página | 14 Consideraciones Técnicas En esta sección se va a ilustrar la ejecución de un problema muy simple sobre la máquina virtual que se ha montado. El programa en cuestión es una utilidad de conteo de palabras. Leerá el contenido de los ficheros que se hayan subido previamente al HDFS y determinará cuántas veces aparece cada palabra en los ficheros. Si todavía no se ha hecho, arránquese la máquina virtual, Eclipse y cámbiese a la perspectiva MapReduce 1.8.1 Creación del Proyecto En el menú principal de Eclipse, pulsar “File-->New...--> Project” y elegir “MapReduce Project” de la lista disponible. A continuación, pulsar en “Next”. A continuación se elegirá un nombre para el proyecto. Cualquier nombre es bueno, como por ejemplo “WordCount”. También se necesita especificar la ruta de instalación de la librería de Hadoop. Esta ruta debería ser donde se realizó la copia del directorio hadoop-0.20.1/ del DVD. Ya que de momento no está configurada esta parte de Eclipse, se procederá a hacerlo ahora pulsando en la opción “Configure Hadoop install directory...” y eligiendo la ruta al archivo hadoop-0.20.1.jar que está incluido en el directorio anterior. El hecho de crear un proyecto del tipo MapReduce y no hacerlo como uno genérico Java hace que Eclipse añada automáticamente los ficheros jar necesarios a la ruta de construcción del proyecto. En cambio si se crease como un proyecto Java, deberíamos añadir el archivo hadoop-0.20.1.jar y sus dependencias de manera manual. Al completar los pasos, se debe hacer click en “Finalizar”. 1.8.2 Creación de los archivos fuente El programa necesita tres clases para ejecutarse: una map, una reduce y una driver (o master). La driver básicamente le dice a Hadoop cómo ejecutar el trabajo MapReduce mientras que las clases map y la reduce trabajan sobre los datos. Pulsando con el botón derecho del ratón sobre la carpeta de fuentes que se habrá creado (“src”), se desplegarán una serie de opciones entre las que habrá que elegir “New-->Others...” Dentro ahora de la carpeta “Map/Reduce” se podrán crear clases map, reduce y driver. Se recomienda, por tanto, crear tres clases: WordCountMapper, Instalación del Software Página | 15 WordCountReducer y WordCount que hereden respectivamente las tres clases padres anteriores. El código para cada una de estas clases se muestra en las Capturas 5, 6 y 7. 1.8.3 Lanzando el trabajo contra el HDFS Una vez se hayan codificado las clases, es la hora de ejecutarlas contra el HDFS. Si no se ha hecho, es necesario crear un directorio “input” bajo “/user/hadoop-user”, que será donde se almacenen los ficheros que la aplicación leerá. Hecho esto, en el explorador de proyectos de Eclipse, hay que hacer click con el botón derecho del ratón sobre la clase “WordCount.java” que se acaba de crear y elegir la opción “Run As->Run On Hadoop”. A continuación aparecerá una ventana pidiendo elegir una localización de Hadoop sobre la que ejecutarse. Se deberá elegir la IP de la máquina virtual que se configuró anteriormente y pulsar el botón “Finish”. Si todo ha ido bien, y no ha habido errores de compilación ni de ejecución, el progreso del trabajo MapReduce debería mostrarse en la consola de Eclipse con un formato parecido al que muestra la Captura 8. Si ahora a continuación se pulsa con el botón derecho del ratón sobre la estructura de directorios del HDFS en Eclipse y se elige la acción “Refresh”, se debería ver un directorio “output” que contendrá un único fichero llamado “part-r-00000” que es el nombre por defecto de la salida del trabajo. Haciendo doble click en él podremos visualizarlo directamente en Eclipse. El fichero contendrá, separado por tabulaciones, dos campos por línea: la palabra en sí y su frecuencia de apariciones en los ficheros (quizás aparezca una advertencia si el fichero es superior en tamaño a 1 Mb). Si se desea volver a ejecutar el trabajo, es necesario borrar el directorio “output” antes, mediante la opción “Delete”, desde el propio explorador de HDFS de Eclipse. Página | 16 Consideraciones Técnicas package src; import java.io.IOException; import java.util.StringTokenizer; import org.apache.hadoop.io.IntWritable; import org.apache.hadoop.io.Text; import org.apache.hadoop.mapreduce.Mapper; public class WordCountMapper extends Mapper<Object, Text, Text, IntWritable> { private final IntWritable one = new IntWritable(1); private Text word = new Text(); public void map(Object key, Text value, Context context) throws IOException,InterruptedException { String line = value.toString(); StringTokenizer itr = new StringTokenizer(line.toLowerCase()); while(itr.hasMoreTokens()) { word.set(itr.nextToken()); context.write(word, one); } } } Captura 5: Código Java clase WordCountMapper Instalación del Software Página | 17 package src; import java.io.IOException; import org.apache.hadoop.io.IntWritable; import org.apache.hadoop.io.Text; import org.apache.hadoop.mapreduce.Reducer; public class WordCountReducer extends Reducer<Text,IntWritable,Text,IntWritable> { private IntWritable result = new IntWritable(); public void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException { int sum = 0; for (IntWritable val : values) { sum += val.get(); } result.set(sum); context.write(key, result); } } Captura 6: Código Java clase WordCountReducer Página | 18 Consideraciones Técnicas package src; import java.io.IOException; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs.FileSystem; import org.apache.hadoop.fs.Path; import org.apache.hadoop.io.IntWritable; import org.apache.hadoop.io.Text; import org.apache.hadoop.mapreduce.Job; import org.apache.hadoop.mapreduce.lib.input.FileInputFormat; import org.apache.hadoop.mapreduce.lib.output.FileOutputFormat; public class WordCount { public static void main(String[] args) throws Exception { Configuration conf = new Configuration(); FileSystem fs = FileSystem.get(conf); Job job = new Job(conf, "new word count"); job.setJarByClass(NewWordCount.class); job.setMapperClass(WordMapper.class); job.setCombinerClass(WordReducer.class); job.setReducerClass(WordReducer.class); job.setOutputKeyClass(Text.class); job.setOutputValueClass(IntWritable.class); FileInputFormat.addInputPath(job, new Path("input")); Path outputPath = new Path("output"); try { if (fs.exists(outputPath)) { //remove the directory first fs.delete(outputPath,true); } } catch (IOException ioe) { System.err.println("Error deleting output dir"); System.exit(1); } FileOutputFormat.setOutputPath(job, outputPath); System.exit(job.waitForCompletion(true) ? 0 : 1); } } Captura 7: Código Java clase WordCount Manual de Usuario del proyecto MRPGA 08/06/25 12:14:22 INFO input paths to process 08/06/25 12:14:23 INFO job_200806250515_0002 08/06/25 12:14:24 INFO 0% 08/06/25 12:14:31 INFO 0% 08/06/25 12:14:33 INFO 0% 08/06/25 12:14:42 INFO 100% 08/06/25 12:14:43 INFO job_200806250515_0002 08/06/25 12:14:43 INFO 08/06/25 12:14:43 INFO 08/06/25 12:14:43 INFO tasks=4 08/06/25 12:14:43 INFO reduce tasks=1 08/06/25 12:14:43 INFO map tasks=4 08/06/25 12:14:43 INFO Framework 08/06/25 12:14:43 INFO records=211 08/06/25 12:14:43 INFO records=1609 08/06/25 12:14:43 INFO bytes=11627 08/06/25 12:14:43 INFO bytes=16918 08/06/25 12:14:43 INFO input records=1609 08/06/25 12:14:43 INFO output records=682 08/06/25 12:14:43 INFO groups=568 08/06/25 12:14:43 INFO records=682 08/06/25 12:14:43 INFO output records=568 Página | 19 mapred.FileInputFormat: Total : 3 mapred.JobClient: Running job: mapred.JobClient: map 0% reduce mapred.JobClient: map 50% reduce mapred.JobClient: map 100% reduce mapred.JobClient: map 100% reduce mapred.JobClient: Job complete: mapred.JobClient: Counters: 12 mapred.JobClient: Job Counters mapred.JobClient: Launched map mapred.JobClient: Launched mapred.JobClient: Data-local mapred.JobClient: Map-Reduce mapred.JobClient: Map input mapred.JobClient: Map output mapred.JobClient: Map input mapred.JobClient: Map output mapred.JobClient: Combine mapred.JobClient: Combine mapred.JobClient: Reduce input mapred.JobClient: Reduce input mapred.JobClient: Reduce Captura 8: Resultado ejecución trabajo MapReduce WordCount 2. Manual de Usuario del proyecto MRPGA Una vez configurado el entorno Eclipse y lanzado el problema “WordCount” de forma exitosa para comprobar la correcta conexión con el HDFS (véase la sección Página | 20 Consideraciones Técnicas anterior), el siguiente paso será montar la aplicación implementada para este proyecto. Para ello, una vez arrancado Eclipse, nos dirigiremos al menú “File -->New...->Project...-->Java Project” para indicar que queremos crear un nuevo proyecto Java con el código fuente extraído de la carpeta “src/distribuido” del DVD, con el nombre que deseemos (por ejemplo MRPGA). Hecho esto, tendremos que configurar el “build path” del proyecto. Para ello, haremos click con el botón derecho sobre el proyecto recién creado y nos iremos al apartado “Properties...”. Dentro de la pantalla que se acaba de abrir, nos deberemos dirigir a dos sub-menús de gran importancia: Java Build Path: Aquí, dentro de la pestaña “Libraries”, indicaremos todas las librerías –aparte del JRE que incluye Eclipse por defecto- que necesitamos para compilar la aplicación. En concreto, pulsaremos sobre el botón “Add External JARs...” y escogeremos añadir todo el contenido de la carpeta “lib” del DVD. La Captura 9 muestra dicho sub-menú. Captura 9: Menú Java Build Path en Eclipse 3.5 Run/Debug Settings: Si todavía no existe ninguna, podremos crear una nueva configuración de ejecución, indicando que la clase principal es la clase “Cliente” del paquete “common” y, dentro de la pestaña “Arguments”, especificar los Manual de Usuario del proyecto MRPGA Página | 21 distintos parámetros con los que se lanzará la aplicación, tal y como se aprecia en la Captura 10. El número y explicación de cada uno de ellos viene aclarado en el fichero README.txt del DVD. Finalizada la configuración, bastará con aceptar los cambios para que queden guardados. Captura 10: Edición de parámetros de la aplicación en Eclipse 3.5 A continuación, dentro del paquete “problems” de la carpeta “src” que deberemos estar viendo en nuestro nuevo proyecto, se han incluido dos ficheros de ejemplo correspondientes a dos posibles implementaciones de las clases map y reduce del problema de la “frase objetivo”. Estos ficheros pueden ser tomados como referencia para posibles futuras implementaciones. El DVD también contiene una carpeta llamada “config” que contiene varios ficheros XML de configuración específicos de los problemas de la “frase objetivo” (TargetPhrase.xml), “OneMAX” y “P-Picos”. Esta carpeta también tendrá que formar parte del proyecto en Eclipse situándola al mismo nivel que la carpeta “src” (copiándola entera o haciendo click con el botón derecho sobre el nombre del proyecto y creando una nueva carpeta con el mismo nombre). Será en esta carpeta donde almacenaremos los distintos ficheros XML de configuración de parámetros específicos del problema a resolver. Este fichero también puede servir de modelo para los siguientes. Página | 22 Consideraciones Técnicas Para finalizar y suponiendo que ya tenemos correctamente configurado los parámetros necesarios de Hadoop y Pig –tal y como se explica en el apartado anterior-, solo resta pulsar con el botón derecho del ratón sobre la clase “Cliente.java” y lanzar la aplicación con “Run As --> Run on Hadoop”. Inmediatamente empezará a aparecer el traceback de depuración del HDFS en la consola de Eclipse, hasta que se cumpla el criterio de terminación de la aplicación (véase Captura 11). Captura 11: Resultados de ejecución del proyecto MRPGA en Eclipse 3.5 Otra opción que tenemos es generar un fichero JAR para poder lanzar la aplicación directamente desde el clúster con el comando de ejecución de Hadoop: hadoop. Para ello, copiaremos la carpeta “lib” y el fichero “build.xml” del DVD y los pegaremos en el directorio donde hayamos generado el proyecto. A continuación, abriríamos una consola, nos situaríamos en el anterior directorio y ejecutaríamos el comando ant compile jar para compilar el código fuente y generar el fichero JAR. Con el fichero generado (“mrpga_cluster.jar”), deberemos copiarlo a algún directorio sobre el que tengamos permisos adecuados y -tras asegurarnos que el directorio raiz de Hadoop y de Pig está en nuestro PATH- lanzarlo con el comando hadoop jar mrpga_cluster.jar <lista_argumentos>. Como se comentó anteriormente, la lista de argumentos viene detallada tanto en la Manual de Programador del proyecto MRPGA Página | 23 documentación Javadoc de la clase “Cliente.java” proporcionada en el directorio “docs” como en el fichero README.txt, ambos incluidos en el DVD. 3. Manual de Programador del proyecto MRPGA Las clases proporcionadas en el DVD como ejemplo pueden servir como base para futuras implementaciones de nuevos problemas, pero obviamente pueden ser mejoradas y ampliadas. Desde el punto de vista del programador que quiere implementar su propio problema de AGs básicos, existen varios aspectos a destacar: 1. Lo primero que debería hacer el programador es construir un fichero XML dentro del directorio “config” del proyecto que siguiese el esquema del proporcionado como ejemplo, recordando por una parte que puede añadir todas las etiquetas (parámetros) que necesite para resolver su problema, pero respetando siempre la restricción de que es obligatorio que contenga por lo menos dos: “<targetFitness>” y “<bestFitness>”. La clase Cliente se ocupará de generar un fichero para que las clases map y reduce puedan tener accesibles estos parámetros durante la ejecución del trabajo MapReduce. 2. A continuación debería tomar como base la clase “TargetPhraseMapper.java” y codificar la suya propia, respetando la firma de los métodos. En la primera de ellas, tendrá la libertad de redefinir a su gusto el método de evaluación de fitness de los individuos de su problema, teniendo a su disposición tanto los parámetros específicos del problema (parámetro “problemParams”) como los generales que introdujo desde línea de comandos (“generalParams”). Asimismo, podrá realizar la inicialización de estructuras o variables que necesite en el método problemSetup(...), teniendo en cuenta que este método será llamado desde el método setup(...) de un nodo map (el cual se ejecuta una única vez, a diferencia del método map(...)). Por último, podrá apoyarse en tantos métodos privados como necesite 3. En la clase reduce del problema que quiera implementar el programador tendrá libertad de elegir la codificación que desee de los métodos de cruce y mutación de individuos. Tal y como se comentó en la sección 3 del Capítulo 3 de la memoria, existen muchas implementaciones distintas de ambos métodos. En la Página | 24 Consideraciones Técnicas clase ejemplo proporcionada “TargetPhraseReducer.java” se utilizó un cruce de doble punto y una mutación probabilística –lo cual no quiere decir que necesariamente sean las mejores decisiones a adoptar. 4. El programador debería asegurarse de contar con los permisos adecuados para el directorio de Entrada/Salida temporal que se crea durante la ejecución del sistema (el cual se indica también como parámetro por consola). 5. Como ya se dijo en el Capítulo 4 de la memoria del proyecto, las clases pertenecientes al paquete “common” son las que componen el núcleo principal de la aplicación. Si por ejemplo, el usuario desease implementar un AG que se alejase de la estructura explicada en la sección 3 del Capítulo 3 de la memoria principal, debería modificar las clases “Coordinador.java” y “MRPGAReducer.java” que son las que encapsulan el comportamiento fundamental del AG (una itera y filtra los resultados y la otra genera poblaciones mediante cruces, torneos, reducciones y mutaciones). 6. La clase “RandomDoublePartitioner.java” es una implementación concreta de la clase “Partitioner” de Hadoop. Con ella se intenta conseguir un reparto uniforme de individuos entre los distintos nodos map y reduce de un trabajo MapReduce, sin embargo, su método principal getPartition(...) acepta diferentes implementaciones. Esta clase es llamada desde el método main(...) de la clase “MRPGAMaster.java”. 7. La implementación actual soporta codificación de individuos en formato binario y alfanumérico, ya que son las dos representaciones más utilizadas. Si el usuario quisiese implementar alguna “CustomChromosome.java” más, sólo que debería extendiese crear una la clase clase “Chromosome.java” dentro del paquete “common”. 8. Las posibilidades que ofrece el script Pig Latin embebido en el código Java de la clase “PigFunction.java” es limitado y que esta herramienta ofrece capacidades de análisis mucho mayores que quizás sea interesante explotar de cara al futuro. La clase “Coordinador.java” llama a esta clase para preparar los individuos de cara a la siguiente iteración. 9. Para construir la versión secuencial del sistema (incluida dentro del directorio “src/secuencial”, montaríamos un proyecto Java normal en Eclipse pasándole los parámetros adecuados) y descomentaríamos en la clase “Main.java” un Manual de Programador del proyecto MRPGA Página | 25 conjunto de parámetros u otro (ya están indicados) en función del problema que quisiésemos ejecutar. 10. Existen varias anotaciones a lo largo del código, muchas de ellas son simples comentarios, pero otras parseXMLFile(...) (tales de la como clase la presente Cliente en o en el método la clase “MRPGAMaster.java”) deben ser tenidas en cuenta, ya que son modificaciones necesarias para poder ejecutar la aplicación tanto empaquetada en un JAR como directamente desde Eclipse. A mayores de estos puntos y teniendo en cuenta la dificultad de depurar una aplicación distribuida de manera remota, es importante recordar que Hadoop proporciona varias interfaces web en las que se pueden consultar el estado y los distintos resultados de nuestros programas (para más información, consúltese la web principal del proyecto Hadoop: http://hadoop.apache.org/). De entre ellas, destacaremos la siguiente: http://<ip_máquina_hadoop>:50070/logs/userlogs Bajo esta URL se encuentran los distintos trabajos MapReduce que vamos ejecutando, divididos en tareas map (con nombres del estilo “nombre_tarea_m_000x”) y reduce (“nombre_tarea_r_000x”). Cada una de estas tareas contiene tres directorios: stderr, syslog y stdout que contendrán los distintos mensajes de error e informativos que podamos emplear para facilitar la depuración de nuestra aplicación.