Cómo escribir un programador de Hadoop
En Hadoop, el programador es un módulo conectable. Los usuarios pueden diseñar el programador de acuerdo con las necesidades reales de su aplicación y luego especificar el programador correspondiente en el archivo de configuración, de modo que el clúster de Hadoop El programador. se carga al inicio. Actualmente, Hadoop viene con varios programadores, a saber, FIFO (programador predeterminado), Programador de capacidad y FairScheduler. Por lo general, estos programadores son difíciles de cumplir con los complejos requisitos de aplicaciones de la empresa, por lo que a menudo es necesario desarrollar su propio programador. Este artículo presentará el método de escritura básico del programador de Hadoop.
2. Marco de programación de Hadoop
El programador de Hadoop se carga y se llama en JobTracker. Los usuarios pueden configurar el atributo mapred.jobtracker.taskScheduler en el archivo de configuración mapred-site.xml. en . Esta sección analiza el marco de programación del programador Hadoop y, de hecho, analiza la relación entre dos clases importantes: TaskScheduler y JobTracker.
(1) TaskScheduler
Si el usuario quiere escribir su propio programador, necesita heredar la clase abstracta TaskScheduler. La interfaz de esta clase es la siguiente:
la clase abstracta TaskScheduler implementa Configurable {<
Configuración protegida conf; //archivo de configuración
TaskTrackerManager protegido taskTrackerManager //generalmente establecido en JobTracker
público; Configuración getConf() {
return conf;
}
public void setConf(Configuración conf) {
this.conf = conf ;
}
vacío sincronizado público setTaskTrackerManager(
TaskTrackerManager taskTrackerManager) {
this.taskTrackerManager = taskTrackerManager;
} p>
public void start() lanza IOException { // Función de inicialización, como cargar el archivo de configuración
// no hacer nada
}
public void terminate() throws IOException { //terminar función
// no hacer nada
}
/// La función más importante es para asignar el valor correcto a la tarea taskTracker
public abstract Listlt.Taskgt; asignarTasks(TaskTrackerStatus taskTracker)
lanza IOException;
//Obtener la lista de trabajos basados en el nombre de la cola
p>public abstract Collectionlt.JobInProgressgt; getJobs(String queueName);
}
(2) JobTracker
JobTracker es el componente principal de Hadoop. Se utiliza para monitorear trabajos en todo el clúster y administrar y programar recursos.
Cada TaskTracker informa información básica sobre las máquinas que administra a JobTracker a través de latidos cada 3 segundos (predeterminado, configurable), incluido el uso de memoria, la memoria restante, las tareas en ejecución y la cantidad de espacios libres en espera. . Una vez que JobTracker encuentra que hay espacios libres en TaskTracker, llama al método AssignTasks en el programador para asignar tareas a TaskTracker.
El siguiente es el análisis del proceso específico de JobTracker llamando a TaskScheduler:
....
...
... .. .
TaskScheduler final privado taskScheduler; //declarar el objeto del programador
......
JobTracker estático público startTracker(JobConf conf, String identificador) {
.......
resultado = new JobTracker(conf, identificador
resultado.taskScheduler.setTaskTrackerManager(resultado); // Configurar el administrador del programador
......
}
// Crear un programador
JobTracker(JobConf conf , Identificador de cadena) {
......
// Crear planificador
Classlt;? extiende TaskSchedulergt; p > = conf.getClass("mapred.jobtracker.taskScheduler",
JobQueueTaskScheduler.class, TaskScheduler.class;
taskScheduler = (TaskScheduler) ReflectionUtils.newInstance(schedulerClass, conf ) ;
.....
}
//Ejecutar para siempre
public void offerService() {
......
taskScheduler.start(); //iniciar el programador
......
} p>
. . . . .
HeartbeatResponse heartbeat(estado de TaskTrackerStatus,
booleano reiniciado,
booleano contacto inicial,
booleano aceptarNuevas Tareas,
short ResponseId) {
.......
// Comprueba si hay nuevas tareas que se ejecutarán en tasktracker
if (recoveryManager.shouldSchedule() amp; amp; aceptarNewTasks amp; está en la lista negra) {
......
// Utilice el programador para asignar trabajos a este taskTracker
tareas = taskScheduler.
asignarTasks(taskTrackerStatus);
...
}
}
Del análisis anterior, queda claro que el Programador y el JobTracker se contendrán entre sí (de hecho, es un patrón combinado El Programador debe contener el objeto JobTracker (en realidad TaskTrackerManager) para obtener información sobre todo el clúster de Hadoop, como el número total de ranuras. Objetos QueueManager, agregando JobInProgressListener para notificar al Programador cuando se agregan o eliminan trabajos.
3. Escribir un programador de Hadoop
Supongamos que queremos escribir un nuevo programador para MyHadoopScheduler, necesitamos completar el siguiente trabajo:
(1) Usuario Clases que debe implementar usted mismo
@MyHadoopSchedulerConf: clase de administración de archivos de configuración, utilizada para leer sus propios archivos de configuración y guardarlos en la estructura de datos correspondiente. En términos generales, esta clase debe admitir la carga dinámica del archivo de configuración. .
@MyHadoopSchedulerListener: escriba su propio JobInProgressListener y llame a addJobInProgressListener() de JobTracker para agregarlo a la cola de escucha del sistema, de modo que cuando se agregue o elimine un trabajo del sistema, JobTracker pueda notificar inmediatamente al programador.
@MyHadoopScheduler: la implementación central del algoritmo del programador
(2) La clase del sistema que el usuario quiere usar
@JobTracker: en la función startTracker , JobTracker agregará el taskTrackerManager de MyHadoopScheduler al objeto JobTracker, de modo que en MyHadoopScheduler se puedan llamar todos los métodos públicos y variables miembro de Jobracker. Los más utilizados son
$ getClusterStatus(): Obtenga el estado. del clúster, como el seguimiento de tareas. La lista de procesadores, el número total de ranuras de mapa, el número total de ranuras de reducción, el número total de tareas de mapa/reducción actualmente en ejecución, etc.
$ getQueueManager(): si MyHadoopScheduler admite varias colas, debe usar este método para obtener el objeto QueueManager. A través de este objeto, puede usar el sistema para obtener los nombres de todas las colas y la ACL (. lista de control de acceso) de cada cola), referencia específica: mon/docs/current/service_level_auth.html
$ killJob: esta función se puede llamar para finalizar el trabajo
$ getQueueManager. (): Si MyHadoopScheduler admite varias colas, debe utilizar este método para obtener el objeto QueueManager. Esta función puede finalizar el trabajo
$ killTask: si el programador admite la preferencia de recursos, puede llamar a esta función para finalizar la tarea y adelantarse a los recursos.
@ JobInprogress: después de que el usuario envía un trabajo a Hadoop, Hadoop creará un objeto llamado JobInProgress para el trabajo, que contiene la información básica del trabajo. Este objeto acompañará el ciclo de vida restante del trabajo. (trabajo *** * Sobrevivir). Este objeto contiene información sobre el trabajo: información sobre todas las tareas contenidas en el trabajo (por ejemplo, una lista de tareas en ejecución, una lista de tareas completadas, una lista de tareas que aún no se han ejecutado, etc.), la prioridad del trabajo, la hora en que se envió el trabajo, la hora de inicio del trabajo, la hora de finalización del trabajo y otra información.
En la lista de tareas de JobInprogress, cada tarea se guarda en forma de un objeto TaskInProgress, que contiene información básica sobre cada tarea, que incluye: el fragmento de datos que será procesado por la tarea, el tiempo de creación de la tarea, y tiempo de ejecución de inicio de tarea, tiempo de finalización de tarea y otra información. Esta información definitivamente se utilizará en el programador.
@JobConf
Los parámetros de tiempo de ejecución y las opciones de configuración de cada tarea se guardan en un objeto JobConf, que contiene los archivos de configuración mapred-site.xml, core-site.xml y opciones. establecido por hdfs-site.xml, así como propiedades específicas de la tarea (nombre de usuario, InputFormat, Mapper, etc.), que generalmente se almacenan como clave/valor, por ejemplo, para obtener el nombre de usuario actual, haría: < / p>
JobConf conf;
.......
Cadena nombre de usuario = conf.get("usuario.nombre");
Los usuarios también pueden pasar algunas propiedades globales autodefinidas a través de objetos, como una propiedad definida por el usuario denominada mapred.job.deadline.
hadoop jar hadoop-examples.jar wordcount -files cachefile.txt \
-D mapred.job.deadline=100000 \
entrada salida
Luego obtenga el valor de esta propiedad en el programador:
JobConf conf;
.....
int date=conf .getInt ("mapred.job.deadline", -1); //Obtiene la propiedad mapred.job.deadline, si no está configurada, devuelve -1
4. Es la columna vertebral de Hadoop y se puede imaginar su importancia. Si desea diseñar un programador de Hadoop, debe tener una comprensión más profunda de todo el marco de Hadoop y también debe leer el código fuente de algunas clases muy importantes (como JobTracker y JobInprogress, etc.) para poder utilizarlo. estas clases para completar su algoritmo de programación.
Hadoop actualmente viene con tres programadores de uso común, a saber, JobQueueTaskScheduler (primero en entrar, primero en salir, pero programador de colas), Programador de capacidad (programador multiusuario de colas múltiples) y Programador justo (programador multiusuario de colas múltiples). planificador), estos tres programadores son la mejor manera de comprender el programador de Hadoop y la mejor información para comprender el programador de Hadoop.
5. Referencias
(1) Código fuente de Hadoop-0.20.2