Sep

03

Introducción a Apache Oozie

Posted by : hopcroft | On : 03/09/2013

oozie-logoDentro de la serie de post acerca Hadoop y todo su ecosistemas de librerías surgidas alrededor de él, hoy vamos a ver Apache Oozie. Apache Oozie es una librería que nos permite definir una secuencia de ejecución de jobs Hadoop. Con Oozie se va a definir en un fichero de configuración un flujo de trabajo que definirá esta secuencia, en la cual se irán ejecutando las tareas Hadoop que indiquemos. Además podremos definir que hacer en caso de que las tareas se ejecuten de manera exitosa o no. Este fichero de configuración será un fichero XML.

Estructura de un diagrama de flujo en Oozie

Este fichero de configuración no es otra cosa que un grafo aciclico directo de acciones formado por distintos nodos. Tiene bastante parecido en cuanto al formato de los diagramas de flujo a Spring Webflow, ya que podemos definir nodos de acción y las transiciones asociadas al resultado de la salida de esas acciones. Un ejemplo de flujo de ejecución de una tarea WordCount con Hadoop controlado por Oozie es la siguiente:

oozie_workflow

Los nodos de este grafo podrán ser de dos tipos:

  • Nodos de control de flujo
  • Nodos de acción

Mediante los nodos de control de flujo podremos indicar si queremos que el flujo de trabajo comience o finalice. Igualmente podremos indicar si el flujo ha sido fallido o exitoso. También podremos bifurcar el flujo para que sean dos nodos de acción los que se encarguen de ejecutar las tareas. Podemos ver más información acerca de los nodos de control de flujo siguiendo este enlace.

Las acciones de este grafo pueden ser de diversos tipos. Podemos definir acciones para tareas simples, tareas MapReduce con Hadoop, tareas Pig, HDFS ó SSH entre otras. En el caso de nodos de acción para MapReduce tenemos que configurar en primer lugar tanto cual va a ser el jobtracker como el namenode que se van a utilizar para correr la tarea MapReduce. Lo siguiente que debemos configurar son las propiedades Hadoop que permiten definir las clases que implementarán nuestros Mappers y Reducers como son mapred.mapper.classmapred.reducer.class. Además podremos definir otra serie de propiedades como el directorio de entrada y de salida para Hadoop. Un ejemplo de ficheros de configuración lo podemos encontrar a continuación:

<workflow-app xmlns="uri:oozie:workflow:0.2" name="map-reduce-wf">
    <start to="mr-node"/>
    <action name="mr-node">
        <map-reduce>
            <job-tracker>${jobTracker}</job-tracker>
            <name-node>${nameNode}</name-node>
            <prepare>
                <delete path="${nameNode}/user/${wf:user()}/${examplesRoot}/output-data/${outputDir}"/>
            </prepare>
            <configuration>
                <property>
                    <name>mapred.job.queue.name</name>
                    <value>${queueName}</value>
                </property>
                <property>
                    <name>mapred.mapper.class</name>
                    <value>org.apache.oozie.example.SampleMapper</value>
                </property>
                <property>
                    <name>mapred.reducer.class</name>
                    <value>org.apache.oozie.example.SampleReducer</value>
                </property>
                <property>
                    <name>mapred.map.tasks</name>
                    <value>1</value>
                </property>
                <property>
                    <name>mapred.input.dir</name>
                    <value>/user/${wf:user()}/${examplesRoot}/input-data/text</value>
                </property>
                <property>
                    <name>mapred.output.dir</name>
                    <value>/user/${wf:user()}/${examplesRoot}/output-data/${outputDir}</value>
                </property>
            </configuration>
        </map-reduce>
        <ok to="end"/>
        <error to="fail"/>
    </action>
    <kill name="fail">
        <message>Map/Reduce failed, error message[${wf:errorMessage(wf:lastErrorNode())}]</message>
    </kill>
    <end name="end"/>
</workflow-app>

En el caso que vemos arriba algunas de las propiedades están almacenadas en un fichero de propiedades:

nameNode=hdfs://localhost:9000
jobTracker=localhost:9001
queueName=default
examplesRoot=examples/src/main

oozie.wf.application.path=${nameNode}/user/${user.name}/${examplesRoot}/apps/map-reduce
outputDir=map-reduce

Podemos ver más información sobre nodos de acción en Oozie pinchando en el siguiente link.

 

Consola web oozie

Además de seguir la guía oficial de Apache Oozie para empezar a trabajar con Oozie recomiendo seguir las instrucción indicadas en esta página.

Una vez instalado Oozie (y Hadoop) en nuestro equipo podemos arrancar nuestros propios flujos de trabajo o bien utilizar uno de los que viene como ejemplos. Una de las maneras más sencillas de realizar seguimiento a nuestros flujos de trabajo es a través de la consola web de Oozie. Para ello iremos a la url http://localhost:11000/oozie

oozie-console

Aquí veremos todos los flujos de trabajo que hemos ejecutado. Si pinchamos sobre uno de ellos podremos ver en detalle su ejecución.

detalle-tareas-oozie

 

Por ejemplo podemos ver si las transiciones y los nodos de acción han sido o no exitosos.

dag-oozie

 

Otros enlaces de este blog

  1. Introducción a Big Data y Hadoop
  2. Introducción a MapReduce
  3. Introducción a HDFS
  4. Fases en Big Data y su relación con librerías Hadoop
  5. Introducción a Hive
  6. Apache Flume y Apache Sqoop