Actualmente tengo una tarea pendiente para terminar un clúster de EMR de ejecución prolongada después de un período de tiempo determinado (según alguna métrica). Google Dataproc tiene esta capacidad en algo llamado "Eliminación programada de clúster" que se enumera aquí: https://cloud.google.com/dataproc/docs/concepts/configuring-clusters/scheduled-deletion
¿Es esto algo que es posible en EMR de forma nativa? ¿Quizás usando las métricas de Cloudwatch? ¿O puedo escribir un jar de ejecución prolongada que se ubicará en el nodo maestro de EMR y solo sondeará el hilo para obtener alguna métrica de tiempo de inactividad y luego apagar el clúster después de un período de tiempo establecido?
Editar: Para más aclaraciones. Me gustaría alguna funcionalidad en la que el clúster finalice en función de la inactividad durante una cantidad de tiempo x. Por ejemplo, si el clúster ha estado activo durante un tiempo, pero no se han ejecutado trabajos durante, digamos, 1 hora y el clúster simplemente está sentado allí sin hacer nada, entonces me gustaría poder terminar el clúster.
Teniendo en cuenta la aclaración que proporcionó en su pregunta , podría haber 3 formas posibles de hacerlo.
1) Usar la métrica de AWS CloudWatch isIdle de un clúster de EMR. Esta métrica rastrea si un clúster está activo, pero no está ejecutando tareas actualmente. Puede configurar una alarma para que se dispare cuando el clúster haya estado inactivo durante un período de tiempo determinado, como treinta minutos. Referencia: https://docs.aws.amazon.com/emr/latest/ManagementGuide/UsingEMR_ViewingMetrics.html
2) Usar el evento/regla de AWS CloudWatch y la función de AWS Lambda para buscar clústeres de EMR inactivos. Puede lograr visibilidad en el nivel de la consola de AWS y puede habilitarlo y deshabilitarlo fácilmente. Recomendado
3) Alguna otra solución personalizada basada en un Shell que se ejecuta en un trabajo CRON en el nodo maestro de un clúster de EMR, pero perderá su visibilidad en el nivel de la consola de AWS y es posible que también necesite acceso SSH.
Solución utilizando el segundo enfoque: recomendado
Teniendo en cuenta la necesidad de esto, he desarrollado un pequeño marco para lograrlo utilizando la segunda solución mencionada anteriormente. Este marco es una solución basada en AWS que utiliza AWS CloudWatch y AWS Lambda mediante un script de Python que utiliza Boto3 para terminar los clústeres de AWS EMR que han estado inactivos durante un período de tiempo específico .
Usted especifica el umbral máximo de tiempo de inactividad y el evento/regla de AWS CloudWatch desencadena una función de AWS Lambda que consulta todos los clústeres de AWS EMR en estado de ESPERA y, para cada uno, compara el tiempo actual con el tiempo de preparación del clúster de AWS EMR en caso de que no se hayan agregado pasos de EMR hasta el momento. o compara la hora actual con la hora de finalización del último paso del clúster de AWS EMR. Si el umbral se ha visto comprometido, AWS EMR se cancelará después de eliminar la protección de terminación, si está habilitada. De lo contrario, omitirá ese clúster de AWS EMR.
El evento/la regla de AWS CloudWatch decidirá con qué frecuencia la función de AWS Lambda debe verificar si hay clústeres de AWS EMR inactivos .
Puede deshabilitar el evento/la regla de AWS CloudWatch en cualquier momento para deshabilitar este marco con un solo clic sin eliminar su pila de AWS CloudFormation.
La función de AWS Lambda utiliza Python 3.7 como entorno de ejecución.
Puede obtener el código y usarlo desde GitHub aquí: https://github.com/abdullahkhawer/auto-terminate-idle-emr
Cualquier contribución, mejora y sugerencia a esta solución será muy apreciada. :)
El método más sencillo sería utilizar Métricas y dimensiones de Amazon EMR para Amazon CloudWatch . Hay un valor booleano isIdle que "indica que un clúster ya no está funcionando".
Puede crear una alarma de CloudWatch que diga si es verdadera durante más de x minutos y luego activar la alarma. Esto enviaría un mensaje a Amazon SNS, que puede activar una función Lambda para cerrar el clúster.
Componentes:
Actualización: aparentemente esto no es adecuado (ver los comentarios a continuación).
Un método alternativo sería:
Tuve que hacer una implementación similar y solo considerar el tiempo transcurrido del clúster no estaba resolviendo nuestro problema.
así que se nos ocurrió un enfoque para acceder a la API de Hadoop, puede encontrarlos aquí
https://hadoop.apache.org/docs/current/hadoop-yarn/hadoop-yarn-site/ResourceManagerRest.html#Cluster_Scheduler_APIEsto es lo que hicimos,
Pida al usuario que abra un clúster que agregue una etiqueta como "AutoShutDown":"True:BufferMinutes", aquí "AutoShutDown" es la clave y "True:BufferMinutes" es el valor de la etiqueta.
Aquí BufferMinutes es el tiempo en minutos (30, 60, etc.)
cree un Lambda para acceder a la api de hadoop de todos esos clústeres configurados con el paso 1 (si el usuario no agrega la etiqueta, entonces el clúster no se toca) y obtenga la hora de finalización del último trabajo que se completó (solo si todos los trabajos son completado/terminado), si todavía se está ejecutando algún trabajo, no haga nada y salga.
ahora
diferencia_fechahora = (hora_actual - última finalización) if(diferencia_fechahora > hora_solicitada) {terminar_clúster}
Cree un disparador de vigilancia en la nube y agregue la lambda creada como objetivo, programe el disparador para que se ejecute según sea necesario.
Nota : Lambda está escrito en python, por lo que se usa boto3 y el cliente será "emr" igual que lo que abdullahkhawer mencionó en su solución anterior.
Esta implementación brinda flexibilidad al usuario para elegir y reduce una gran carga para los desarrolladores.