hadoop - que - ¿Conoce un nodo maestro de EMR su id del clúster?
que es emr (5)
Quiero poder crear clusters EMR y para esos clusters enviar mensajes a alguna cola central. Para que esto funcione, necesito tener algún tipo de agente ejecutándose en cada nodo maestro. Cada uno de esos agentes tendrá que identificarse en este mensaje para que el destinatario sepa de qué grupo se trata el mensaje.
¿El nodo maestro sabe que es id (j- * ** * * )? Si no es así, ¿hay alguna otra información de identificación que pueda permitir que el destinatario del mensaje infiera esta identificación?
He echado un vistazo a través de los archivos de configuración en / home / hadoop / conf, y no he encontrado nada útil. Encontré la identificación en /mnt/var/log/instance-controller/instance-controller.log, pero parece que será difícil grep. Me pregunto de dónde el controlador de instancia podría obtener esa identificación en primer lugar.
Aparentemente, el trabajo de Hadoop MapReduce no tiene forma de saber en qué clúster se está ejecutando; me sorprendió descubrirlo por mi cuenta.
PERO: puede usar otros identificadores para cada mapa para identificar de manera única el asignador que se está ejecutando y el trabajo que se está ejecutando.
Estos se especifican en las variables de entorno transferidas a cada asignador. Si está escribiendo un trabajo en Hadoop streaming, usando Python, el código sería:
import os
if ''map_input_file'' in os.environ:
fileName = os.environ[''map_input_file'']
if ''mapred_tip_id'' in os.environ:
mapper_id = os.environ[''mapred_tip_id''].split("_")[-1]
if ''mapred_job_id'' in os.environ:
jobID = os.environ[''mapred_job_id'']
Eso le da: nombre de archivo de entrada, ID de tarea e ID de trabajo. Usando uno o una combinación de esos tres valores, debe poder identificar de manera única qué asignador se está ejecutando.
Si está buscando un trabajo específico: "mapred_job_id" podría ser lo que desea.
Puede usar la API de Amazon EC2 para averiguarlo. El siguiente ejemplo usa comandos de shell para simplificar. En la vida real, debes usar la API adecuada para realizar estos pasos.
Primero debe averiguar su ID de instancia:
INSTANCE=`wget -q -O - http://169.254.169.254/latest/meta-data/instance-id`
Luego puede usar su ID de instancia para averiguar la ID del clúster:
ec2-describe-instances $INSTANCE | grep TAG | grep aws:elasticmapreduce:job-flow-id
Espero que esto ayude.
Como se especificó anteriormente, la información se encuentra en el archivo job-flow.json. Este archivo tiene muchos otros atributos . Entonces, sabiendo dónde está ubicado, puedes hacerlo de una manera muy fácil:
cat /mnt/var/lib/info/job-flow.json | grep jobFlowId | cut -f2 -d: | cut -f2 -d''"''
Editar: Este comando también funciona en los nodos centrales.
Otra opción: consultar el servidor de metadatos:
curl -s http://169.254.169.254/2016-09-02/user-data/ | sed -r ''s/.*clusterId":"(j-[A-Z0-9]+)",.*//1/g''
Puede consultar /mnt/var/lib/info/
en el nodo maestro para encontrar mucha información sobre la configuración de su clúster EMR. Más específicamente /mnt/var/lib/info/job-flow.json
contiene el jobFlowId o ClusterID.
Puede usar el analizador json preinstalado ( jq
) para obtener la identificación del flujo de trabajo.
cat /mnt/var/lib/info/job-flow.json | jq -r ".jobFlowId"
(actualizado según @Marboni)