2010-08-09 8 views
8

Estoy tratando de usar la compilación JIT en clojure para generar clases de asignador y reductor sobre la marcha. Sin embargo, estas clases no están siendo reconocidas por el JobClient (es la ClassNotFoundException habitual).¿Cómo distribuye el método RunJar de Hadoop los archivos clase/jar a través de los nodos?

Si AOT compila el asignador, el reductor y la herramienta, y ejecuta el trabajo con RunJar, todo parece estar bien. Después de mirar a través del source, parece que está desempaquetando el jar y creando un URLClassLoader personalizado que usa para cargar la implementación "principal". Lo que no veo es cómo se distribuye el contenedor entre los nodos o incluso cómo se usa en un clúster de un nodo.

¡Cualquier ayuda sería muy apreciada!

Respuesta

2

Clojure tiene algo en común con otros métodos de scripting de Java como Beanshell, Groovy y Ant ... en eso, cuando ejecuta el script, si usa las características de carga de clases del lenguaje de script, cuando el script lo inicia se desacopla del cargador de clases predeterminado y luego su JVM se ejecuta en el cargador de clases personalizado para el motor de scripting. No tengo idea de qué es lo que está causando el error, pero debes tener en cuenta que si haces CUALQUIER COSA en tu script que haga que un cargador de clases personalizado abandone el cargador de clases predeterminado de JVM, entonces podría explicar algunas cosas.

En mi experiencia no pude superar estos problemas y, por ejemplo, con Beanshell, tuve que dejar de usar las opciones del cargador de clases y especificar toda mi classpath en la línea de comandos que inicia la JVM. De esa forma, sabía que el script usaba el cargador de clases predeterminado y que se encontrarían todas las clases.

Otro ejemplo, con:

clases/maravilloso/A.groovy

clases/maravilloso/B.groovy

public class A { 
    public A() { 
     B b = new B() 
    } 
} 

GroovyClassLoader no cargaría Groovy clase B. Este tipo de cosas también se puede reproducir tratando de cargar un controlador JDBC con classForName desde un cargador de clases personalizado (no el cargador de clases predeterminado).

4

En primer lugar, cuando enviamos el archivo jar de un trabajo, el rastreador de trabajos lo copia al directorio temporal configurado en las propiedades. Y cuando a un rastreador de tareas se le asigna el trabajo (por el planificador ofc) lo copia del directorio intermedio y lo ejecuta.

En el caso de que desee otorgarle un jar externo para su ejecución, puede hacerlo con la instalación de caché distribuida de Hadoop.

Cuestiones relacionadas