Lanzamiento de un clúster de EMR mediante funciones de Lambda para ejecutar scripts de PySpark, parte 2: La infraestructura y el lanzamiento

Maximiliano Palay and Tiziana Romani
.
May 17, 2023
Lanzamiento de un clúster de EMR mediante funciones de Lambda para ejecutar scripts de PySpark, parte 2: La infraestructura y el lanzamiento

En un mundo de dispositivos interconectados, la cantidad de datos que se generan se está disparando. Para analizar y procesar estos datos, los ingenieros suelen emplear técnicas de aprendizaje automático (ML) que les permiten recopilar información valiosa e información útil. Sin embargo, a medida que el volumen de datos sigue creciendo, surge la necesidad de gestionar grandes canales de procesamiento de datos, una demanda que su portátil no puede satisfacer.

Por lo tanto, el uso de marcos distribuidos en flotas de instancias es cada vez más popular. Para ejecutar un marco distribuido en una plataforma de clústeres como AWS EMR de forma eficaz, es importante tener un buen conocimiento de la arquitectura y la infraestructura subyacentes. En la segunda parte de nuestra serie de dos blogs, presentamos un tutorial práctico en el que profundizaremos en los detalles de la configuración y configuración de la infraestructura necesaria para lanzar un clúster de EMR mediante funciones de Lambda y ejecutar un script de PySpark de ejemplo, el que presentamos en la primera parte. Necesitará una cuenta de AWS para seguir este tutorial, ya que utilizaremos sus servicios.

EMR

EMR (Elastic MapReduce) es una solución de AWS para ejecutar marcos de big data. Proporciona una plataforma de clústeres administrada que simplifica la ejecución de herramientas como Apache Hadoop, Apache Spark y Presto para procesar y analizar grandes volúmenes de datos. Además, ofrece varias opciones para almacenar datos, como Amazon S3, Hadoop Distributed File System (HDFS) y HBase.

EMR ofrece flexibilidad y escalabilidad frente a las cambiantes demandas de procesamiento, ya que le permite ajustar fácilmente la cantidad y el tipo de instancias de nodo del clúster. Los costos dependerán de la cantidad y el tipo de instancias lanzadas. Tiene la oportunidad de minimizar aún más el costo comprando instancias reservadas o instancias puntuales en lugar de instancias bajo demanda. Las instancias puntuales pueden ofrecer ahorros de costos considerables y, en ocasiones, pueden llegar a ser tan bajas como una décima parte del precio bajo demanda.

Puede integrarse con otros servicios de AWS para proporcionar diferentes capacidades y funcionalidades. La integración de IAM se puede utilizar para gestionar un acceso detallado y también proporciona el cifrado de datos en tránsito y en reposo. Las instancias se pueden lanzar en la red virtual que elija. Además, proporciona funciones de supervisión y registro que le permiten realizar un seguimiento del rendimiento del clúster y diagnosticar problemas.

En general, AWS EMR es una excelente plataforma para procesar y analizar datos, ya que brinda la capacidad de gestionar cargas de trabajo complejas, escalar según sea necesario, gran cantidad de personalizaciones y otras integraciones de servicios. La elegimos para el tutorial de hoy y para nuestra cartera de proyectos de Spark. El aspecto paralelo del marco nos permite procesar datos y entrenar modelos de aprendizaje automático de forma mucho más rápida y rentable.

Hay muchas maneras en las que se puede activar un clúster de EMR. En este tutorial vamos a lanzar el clúster a través de una Lambda, otra herramienta muy popular que describiremos a continuación. Optamos por este método para lanzar el clúster porque simplifica el proceso de actualización de las configuraciones del clúster, así como los diversos parámetros necesarios para el script que ejecutaremos.

Creación de redes

Antes de crear el clúster de EMR, debe crear una nueva VPC o seleccionar una existente que incluya las subredes en las que se lanzará el clúster. Se recomienda utilizar subredes privadas, ya que tener una ruta directa a Internet haría que el clúster fuera vulnerable a las amenazas externas.

También es importante asegurarse de que la configuración de red sea compatible con los requisitos del clúster de EMR. Esto incluye garantizar que la subred tenga suficientes direcciones IP para alojar la cantidad de nodos del clúster y que la red esté configurada para permitir la comunicación entre los nodos.

Además, es posible que desee considerar la implementación de una infraestructura de red adicional, como una VPN o una conexión directa, para permitir el acceso seguro al clúster desde los centros de datos locales u otros entornos de nube.

Almacenamiento

Otra necesidad es tener un sistema de almacenamiento confiable para almacenar los scripts y los datos que usaremos en el clúster. En este blog usaremos S3. Amazon S3 es un servicio de almacenamiento de objetos escalable y duradero que está diseñado para almacenar y recuperar cualquier cantidad de datos desde cualquier lugar de la web.

Permite transferir y compartir datos fácilmente entre diferentes aplicaciones y servicios. El clúster de EMR puede leer los datos del bucket S3 y volver a escribir los resultados en él. El uso de un bucket de S3 para almacenar los scripts y datos de EMR proporciona una solución segura, escalable y rentable que no podemos dejar de recomendar.

SOY YO

Por último, necesitaremos 3 funciones diferentes, una para implementar Lambda y dos funciones diferentes para ejecutar el clúster EMR. Si bien es posible usar un solo rol con permisos para ambos servicios, no es una práctica recomendada.

Las funciones de Lambda requieren una función de ejecución. Es un conjunto de permisos que define el nivel de acceso que tiene una función de AWS Lambda a los servicios y recursos de AWS. Al crear una función de Lambda, debe especificar un rol de ejecución que otorgue permiso para que la función interactúe con otros servicios de AWS, como S3 y EMR. Como mínimo, debe incluir los siguientes permisos administrados por AWS:

AWS Lambda Basic Execution Role, Amazon EMR FullAccessPolicy_v2 y Amazon ElasticMap reducen el acceso total.

EMR requerirá una función de flujo de trabajo. Esta función se usa para administrar clústeres y ejecutar trabajos. La función permite a EMR acceder a los recursos necesarios para la creación y el funcionamiento de los clústeres, como lanzar y terminar instancias de Amazon EC2, leer y escribir datos en Amazon S3 y acceder a otros servicios de AWS. Seleccionaremos la opción de rol de EMR para EC2 como entidad de confianza para este rol e incluiremos AmazonElasticMapReduceForec2Role en las políticas permitidas.

La EMR también requerirá una función de servicio. Este rol será responsable de conceder permisos al servicio de EMR para realizar las tareas necesarias para el funcionamiento de EMR, como crear, modificar o eliminar los recursos utilizados por los clústeres de EMR. Esto incluye la creación de grupos de seguridad temporales, interfaces de red y perfiles de instancia para los nodos del clúster de EMR. Podemos usar el rol EMR_DefaultRole predefinido por AWS.

lambda

AWS Lambda es otro servicio de AWS que permite a los desarrolladores ejecutar código sin necesidad de aprovisionar o administrar servidores, ya que administra todos los aspectos de la infraestructura y los recursos, incluido el mantenimiento del servidor, las actualizaciones del sistema operativo, el escalado automático, el registro y más. En lugar de implementar un servidor o contenedor completo, basta con escribir código y hacer que se ejecute en respuesta a los eventos.

Tiene una alta disponibilidad e implementa un modelo de precios de pago por uso, lo que significa que solo paga por el tiempo de procesamiento que utiliza su función, lo que la hace rentable. Los casos de uso incluyen el procesamiento de archivos y transmisiones, las aplicaciones web, el IoT y los backends móviles, entre otros.

Creación de una función lambda

Inicie sesión en su cuenta de AWS y escriba Lambda en la barra de búsqueda. Acceda al servicio y seleccione el botón Crear función. Complete la información básica de su función de Lambda. En esta ocasión, crearemos un script desde cero y utilizaremos Python como lenguaje de ejecución.

En cuanto al rol de ejecución, puede crear un rol nuevo o usar uno existente.

Elegimos el papel rol de lanzamiento de EMR en lambda que creamos anteriormente con las políticas adjuntas mencionadas. Tras crear la lambda, se le redirigirá a la sección de código fuente de la función, que contendrá un entorno con un lambda_function.py archivo.

Crear un controlador

Los controladores de AWS Lambda son el punto de entrada para el código que se ejecuta en una función de AWS Lambda. Son las funciones que AWS Lambda invoca cuando ejecuta el código de la función. Como especificamos un tiempo de ejecución de Python, el archivo tiene un .py extensión y escribiremos código Python. En la sección Código fuente, encontrará una sección de configuración del tiempo de ejecución. Allí encontrarás el Manejador propiedad que define un método dentro de un archivo que es nuestro punto de entrada, siendo inicialmente el lambda_handler método dentro del archivo lambda_function.

El controlador de funciones de AWS Lambda tiene dos parámetros: acto y contexto. Evento representa los datos de entrada, contiene información sobre el evento desencadenante que provocó la invocación de la función, por ejemplo, una solicitud HTTP, un evento programado o un mensaje de otro servicio de AWS. Contexto El parámetro proporciona información sobre el entorno actual de invocación y ejecución, así como sobre el tiempo de ejecución de la función Lambda, como el nombre, la versión y el ARN de la función, el ID de solicitud de AWS, el nombre de la transmisión de CloudWatch Logs y el tiempo de ejecución restante de la función.

Según este blog, incluiremos algunos argumentos en nuestro Evento parámetro al configurar nuestro evento de prueba, podría incluir cualquier tipo de información en formato JSON.

lambda_function.py

El código que incluimos en el archivo del controlador comenzará importando algunas bibliotecas, luego definiendo el clúster EMR y, por último, implementando un valor de retorno.

import boto3connection = boto3.client('emr')

Al utilizar boto3, una biblioteca de Python que proporciona una interfaz para crear, administrar y configurar fácilmente los recursos de AWS, definiremos y crearemos nuestro clúster de EMR. Las políticas asociadas al rol de ejecución que asociamos anteriormente otorgan a la función Lambda permisos para acceder a otros servicios de AWS, por lo que, para permitir la integración con EMR, adjuntamos previamente la política AmazonEMRFullAccessPolicy_v2.

El siguiente paso es crear nuestro controlador

4def lambda_handler(event, context): max_iter = event.get('epochs', "10") x1 = event.get('x1', "10") x2 = event.get('x2', "10")

Lo primero que haremos será extraer los parámetros del evento que se utilizarán en el script. Estos son max_iter, que se refiere al número máximo de iteraciones que el modelo puede ejecutar sobre los datos para aprender. X1 y X2, que están destinados a ser los coeficientes de nuestra función polinómica. Todos los parámetros están predeterminados en 10 en caso de que no se puedan obtener del evento.

Ahora es el momento de configurar el clúster de EMR. Empezaremos por definir los aspectos básicos.

8cluster_id = connection.run_job_flow( Name="Guess-the-function", LogUri="s3:/guess-the-function-emr/logs/" ReleaseLabel='emr-6.6.0', Applications=[{'Name': 'Spark'}],

Nombre es el nombre que adoptará el clúster. Loguri apuntará a una carpeta S3 donde almacenar los registros, aunque esto no es obligatorio, le recomendamos encarecidamente que tenga los registros de EMR disponibles para facilitar la depuración. Etiqueta de lanzamiento El atributo se usa para especificar la versión de las aplicaciones de software y los componentes de Hadoop que utiliza el clúster de EMR. Por último, Solicitudes se refiere a los paquetes que usaremos y necesitamos instalar en el clúster.

Ahora definiremos el grupo de instancias que se utilizan en el clúster. La cantidad de recursos informáticos que se utilizarán es una exageración absoluta para la tarea en cuestión. Se hace de esa manera para mostrar cómo configurar varias instancias en un clúster.

13Instances={'InstanceGroups': [{'InstanceRole': 'MASTER','Name': "Master node",'InstanceType': 'm4.large','InstanceCount': 1,},{'InstanceRole': 'CORE','Name': "Slave node",'InstanceType': 'm4.large','InstanceCount': 2,}],'KeepJobFlowAliveWhenNoSteps': False,'Ec2SubnetId': 'subnet-jnp2fed5',},


EMR siempre requiere un nodo maestro para coordinar el clúster general y distribuir las tareas a los nodos de trabajo; normalmente hay uno o más nodos de trabajo. Estos son responsables de ejecutar las tareas de procesamiento de datos y almacenar los datos en el HDFS. Asignaremos instancias de m4.large tanto a los nodos maestros como a los esclavos. Solo puede haber un nodo maestro a la vez, pero puede haber un gran número de nodos de trabajo.

KeepJobFlowAliveWhenNoSteps determina si el clúster debe terminar automáticamente cuando no haya más pasos en ejecución. Tener el clúster activo puede ahorrarle algo de tiempo mientras esté realizando los pasos, pero seguirá generando costos, incluso si no hay ningún paso en ejecución.

EC2SubnetID debe ser una subred creada dentro de la VPC que mencionamos anteriormente.

31Steps=[ { 'Name': 'Guess the coefficients', 'ActionOnFailure': 'CONTINUE', 'HadoopJarStep': { 'Jar': 'command-runner.jar', 'Args': [ 'spark-submit', "s3:/guess-the-function-emr/scripts/guess.py", "--max_iter", max_iter, "--x1", x1, "--x2", x2 ] } } ],

Aquí estamos definiendo un paso para el clúster de EMR. Un paso es una unidad de trabajo que puede agregar a un clúster para realizar una tarea o procesamiento específico de sus datos. Consiste en un programa o script ejecutable, junto con cualquier configuración necesaria y los datos de entrada/salida. Hay varios tipos de pasos. El código define uno que implica enviar un trabajo de Spark para ejecutar un script almacenado en S3 con algunos parámetros previamente definidos.

47VisibleToAllUsers=True, JobFlowRole='blog-emr-job-role', ServiceRole='EMR_DefaultRole', Tags=[{ "Key":"demo", "Value":"guess-the-function" }],)

En el último bloque de definición, estableceremos el indicador VisibleToAllUsers en true, lo que nos permitirá ver el clúster creado por la lambda sin necesidad de lidiar con las políticas de IAM. También definiremos JobflowRole y ServiceRole, ambos descritos anteriormente. También puede ver cómo incluir una etiqueta, aunque no es necesario, pero definitivamente se recomienda si desea utilizar herramientas como el AWS Cost Explorer de forma más eficiente.

56return { 'statusCode': 200, 'body': f"Submitted job with Id {cluster_id['JobFlowId']}"}

Terminemos devolviendo un StatusCode y un cuerpo con el ID de clúster de EMR.

Al juntarlo todo, el controlador se vería así:

import boto3connection = boto3.client('emr')def lambda_handler(event, context): max_iter = event.get('epochs', "10") x1 = event.get('x1', "10") x2 = event.get('x2', "10") cluster_id = connection.run_job_flow( Name="Guess-the-function", LogUri="s3:/guess-the-function-emr/logs/" ReleaseLabel='emr-6.6.0', Applications=[{'Name': 'Spark'}], Instances={ 'InstanceGroups': [ { 'InstanceRole': 'MASTER', 'Name': "Master node", 'InstanceType': 'm4.large', 'InstanceCount': 1, }, { 'InstanceRole': 'CORE', 'Name': "Slave node", 'InstanceType': 'm4.large', 'InstanceCount': 2, } ], 'KeepJobFlowAliveWhenNoSteps': False, 'Ec2SubnetId': 'subnet-jnp2fed5', }, Steps=[ { 'Name': 'Guess the coefficients', 'ActionOnFailure': 'CONTINUE', 'HadoopJarStep': { 'Jar': 'command-runner.jar', 'Args': [ 'spark-submit', "s3:/guess-the-function-emr/scripts/guess.py", "--max_iter", max_iter, "--x1", x1, "--x2", x2 ] } } ], VisibleToAllUsers=True, JobFlowRole='blog-emr-job-role', ServiceRole='EMR_DefaultRole', Tags=[{ "Key":"demo", "Value":"guess-the-function" }],)return { 'statusCode': 200, 'body': f"Submitted job with Id {cluster_id['JobFlowId']}"}

Este es un pequeño fragmento del aspecto que podría tener el evento de prueba de Lambda:

no-line-numbers|json{ “epochs”: 10, “x1”: 5, “x2”: 3}

Solo tienes que probarlo después de implementar los cambios presionando el botón de prueba y ¡puf! Tienes un clúster que ejecuta EMR y que entrenará un modelo de regresión para intentar aproximar una función polinómica.

Para ver el resultado del modelo, simplemente abra los registros del clúster una vez que haya finalizado. En S3, vaya a steps > S-ID_of_node > stdout.gz y verá el resultado deseado.

no-line-numbers|textnumber of iterations: 4RMSE: 0.2895831584955561r2: 0.9952144735311422model coefficients: [10.004679311797036,10.017003111930043]

Manténgase a la vanguardia de las últimas tendencias y conocimientos sobre big data, aprendizaje automático e inteligencia artificial. ¡No se lo pierda y suscríbase a nuestro boletín de noticias!

En un mundo de dispositivos interconectados, la cantidad de datos que se generan se está disparando. Para analizar y procesar estos datos, los ingenieros suelen emplear técnicas de aprendizaje automático (ML) que les permiten recopilar información valiosa e información útil. Sin embargo, a medida que el volumen de datos sigue creciendo, surge la necesidad de gestionar grandes canales de procesamiento de datos, una demanda que su portátil no puede satisfacer.

Por lo tanto, el uso de marcos distribuidos en flotas de instancias es cada vez más popular. Para ejecutar un marco distribuido en una plataforma de clústeres como AWS EMR de forma eficaz, es importante tener un buen conocimiento de la arquitectura y la infraestructura subyacentes. En la segunda parte de nuestra serie de dos blogs, presentamos un tutorial práctico en el que profundizaremos en los detalles de la configuración y configuración de la infraestructura necesaria para lanzar un clúster de EMR mediante funciones de Lambda y ejecutar un script de PySpark de ejemplo, el que presentamos en la primera parte. Necesitará una cuenta de AWS para seguir este tutorial, ya que utilizaremos sus servicios.

EMR

EMR (Elastic MapReduce) es una solución de AWS para ejecutar marcos de big data. Proporciona una plataforma de clústeres administrada que simplifica la ejecución de herramientas como Apache Hadoop, Apache Spark y Presto para procesar y analizar grandes volúmenes de datos. Además, ofrece varias opciones para almacenar datos, como Amazon S3, Hadoop Distributed File System (HDFS) y HBase.

EMR ofrece flexibilidad y escalabilidad frente a las cambiantes demandas de procesamiento, ya que le permite ajustar fácilmente la cantidad y el tipo de instancias de nodo del clúster. Los costos dependerán de la cantidad y el tipo de instancias lanzadas. Tiene la oportunidad de minimizar aún más el costo comprando instancias reservadas o instancias puntuales en lugar de instancias bajo demanda. Las instancias puntuales pueden ofrecer ahorros de costos considerables y, en ocasiones, pueden llegar a ser tan bajas como una décima parte del precio bajo demanda.

Puede integrarse con otros servicios de AWS para proporcionar diferentes capacidades y funcionalidades. La integración de IAM se puede utilizar para gestionar un acceso detallado y también proporciona el cifrado de datos en tránsito y en reposo. Las instancias se pueden lanzar en la red virtual que elija. Además, proporciona funciones de supervisión y registro que le permiten realizar un seguimiento del rendimiento del clúster y diagnosticar problemas.

En general, AWS EMR es una excelente plataforma para procesar y analizar datos, ya que brinda la capacidad de gestionar cargas de trabajo complejas, escalar según sea necesario, gran cantidad de personalizaciones y otras integraciones de servicios. La elegimos para el tutorial de hoy y para nuestra cartera de proyectos de Spark. El aspecto paralelo del marco nos permite procesar datos y entrenar modelos de aprendizaje automático de forma mucho más rápida y rentable.

Hay muchas maneras en las que se puede activar un clúster de EMR. En este tutorial vamos a lanzar el clúster a través de una Lambda, otra herramienta muy popular que describiremos a continuación. Optamos por este método para lanzar el clúster porque simplifica el proceso de actualización de las configuraciones del clúster, así como los diversos parámetros necesarios para el script que ejecutaremos.

Creación de redes

Antes de crear el clúster de EMR, debe crear una nueva VPC o seleccionar una existente que incluya las subredes en las que se lanzará el clúster. Se recomienda utilizar subredes privadas, ya que tener una ruta directa a Internet haría que el clúster fuera vulnerable a las amenazas externas.

También es importante asegurarse de que la configuración de red sea compatible con los requisitos del clúster de EMR. Esto incluye garantizar que la subred tenga suficientes direcciones IP para alojar la cantidad de nodos del clúster y que la red esté configurada para permitir la comunicación entre los nodos.

Además, es posible que desee considerar la implementación de una infraestructura de red adicional, como una VPN o una conexión directa, para permitir el acceso seguro al clúster desde los centros de datos locales u otros entornos de nube.

Almacenamiento

Otra necesidad es tener un sistema de almacenamiento confiable para almacenar los scripts y los datos que usaremos en el clúster. En este blog usaremos S3. Amazon S3 es un servicio de almacenamiento de objetos escalable y duradero que está diseñado para almacenar y recuperar cualquier cantidad de datos desde cualquier lugar de la web.

Permite transferir y compartir datos fácilmente entre diferentes aplicaciones y servicios. El clúster de EMR puede leer los datos del bucket S3 y volver a escribir los resultados en él. El uso de un bucket de S3 para almacenar los scripts y datos de EMR proporciona una solución segura, escalable y rentable que no podemos dejar de recomendar.

SOY YO

Por último, necesitaremos 3 funciones diferentes, una para implementar Lambda y dos funciones diferentes para ejecutar el clúster EMR. Si bien es posible usar un solo rol con permisos para ambos servicios, no es una práctica recomendada.

Las funciones de Lambda requieren una función de ejecución. Es un conjunto de permisos que define el nivel de acceso que tiene una función de AWS Lambda a los servicios y recursos de AWS. Al crear una función de Lambda, debe especificar un rol de ejecución que otorgue permiso para que la función interactúe con otros servicios de AWS, como S3 y EMR. Como mínimo, debe incluir los siguientes permisos administrados por AWS:

AWS Lambda Basic Execution Role, Amazon EMR FullAccessPolicy_v2 y Amazon ElasticMap reducen el acceso total.

EMR requerirá una función de flujo de trabajo. Esta función se usa para administrar clústeres y ejecutar trabajos. La función permite a EMR acceder a los recursos necesarios para la creación y el funcionamiento de los clústeres, como lanzar y terminar instancias de Amazon EC2, leer y escribir datos en Amazon S3 y acceder a otros servicios de AWS. Seleccionaremos la opción de rol de EMR para EC2 como entidad de confianza para este rol e incluiremos AmazonElasticMapReduceForec2Role en las políticas permitidas.

La EMR también requerirá una función de servicio. Este rol será responsable de conceder permisos al servicio de EMR para realizar las tareas necesarias para el funcionamiento de EMR, como crear, modificar o eliminar los recursos utilizados por los clústeres de EMR. Esto incluye la creación de grupos de seguridad temporales, interfaces de red y perfiles de instancia para los nodos del clúster de EMR. Podemos usar el rol EMR_DefaultRole predefinido por AWS.

lambda

AWS Lambda es otro servicio de AWS que permite a los desarrolladores ejecutar código sin necesidad de aprovisionar o administrar servidores, ya que administra todos los aspectos de la infraestructura y los recursos, incluido el mantenimiento del servidor, las actualizaciones del sistema operativo, el escalado automático, el registro y más. En lugar de implementar un servidor o contenedor completo, basta con escribir código y hacer que se ejecute en respuesta a los eventos.

Tiene una alta disponibilidad e implementa un modelo de precios de pago por uso, lo que significa que solo paga por el tiempo de procesamiento que utiliza su función, lo que la hace rentable. Los casos de uso incluyen el procesamiento de archivos y transmisiones, las aplicaciones web, el IoT y los backends móviles, entre otros.

Creación de una función lambda

Inicie sesión en su cuenta de AWS y escriba Lambda en la barra de búsqueda. Acceda al servicio y seleccione el botón Crear función. Complete la información básica de su función de Lambda. En esta ocasión, crearemos un script desde cero y utilizaremos Python como lenguaje de ejecución.

En cuanto al rol de ejecución, puede crear un rol nuevo o usar uno existente.

Elegimos el papel rol de lanzamiento de EMR en lambda que creamos anteriormente con las políticas adjuntas mencionadas. Tras crear la lambda, se le redirigirá a la sección de código fuente de la función, que contendrá un entorno con un lambda_function.py archivo.

Crear un controlador

Los controladores de AWS Lambda son el punto de entrada para el código que se ejecuta en una función de AWS Lambda. Son las funciones que AWS Lambda invoca cuando ejecuta el código de la función. Como especificamos un tiempo de ejecución de Python, el archivo tiene un .py extensión y escribiremos código Python. En la sección Código fuente, encontrará una sección de configuración del tiempo de ejecución. Allí encontrarás el Manejador propiedad que define un método dentro de un archivo que es nuestro punto de entrada, siendo inicialmente el lambda_handler método dentro del archivo lambda_function.

El controlador de funciones de AWS Lambda tiene dos parámetros: acto y contexto. Evento representa los datos de entrada, contiene información sobre el evento desencadenante que provocó la invocación de la función, por ejemplo, una solicitud HTTP, un evento programado o un mensaje de otro servicio de AWS. Contexto El parámetro proporciona información sobre el entorno actual de invocación y ejecución, así como sobre el tiempo de ejecución de la función Lambda, como el nombre, la versión y el ARN de la función, el ID de solicitud de AWS, el nombre de la transmisión de CloudWatch Logs y el tiempo de ejecución restante de la función.

Según este blog, incluiremos algunos argumentos en nuestro Evento parámetro al configurar nuestro evento de prueba, podría incluir cualquier tipo de información en formato JSON.

lambda_function.py

El código que incluimos en el archivo del controlador comenzará importando algunas bibliotecas, luego definiendo el clúster EMR y, por último, implementando un valor de retorno.

import boto3connection = boto3.client('emr')

Al utilizar boto3, una biblioteca de Python que proporciona una interfaz para crear, administrar y configurar fácilmente los recursos de AWS, definiremos y crearemos nuestro clúster de EMR. Las políticas asociadas al rol de ejecución que asociamos anteriormente otorgan a la función Lambda permisos para acceder a otros servicios de AWS, por lo que, para permitir la integración con EMR, adjuntamos previamente la política AmazonEMRFullAccessPolicy_v2.

El siguiente paso es crear nuestro controlador

4def lambda_handler(event, context): max_iter = event.get('epochs', "10") x1 = event.get('x1', "10") x2 = event.get('x2', "10")

Lo primero que haremos será extraer los parámetros del evento que se utilizarán en el script. Estos son max_iter, que se refiere al número máximo de iteraciones que el modelo puede ejecutar sobre los datos para aprender. X1 y X2, que están destinados a ser los coeficientes de nuestra función polinómica. Todos los parámetros están predeterminados en 10 en caso de que no se puedan obtener del evento.

Ahora es el momento de configurar el clúster de EMR. Empezaremos por definir los aspectos básicos.

8cluster_id = connection.run_job_flow( Name="Guess-the-function", LogUri="s3:/guess-the-function-emr/logs/" ReleaseLabel='emr-6.6.0', Applications=[{'Name': 'Spark'}],

Nombre es el nombre que adoptará el clúster. Loguri apuntará a una carpeta S3 donde almacenar los registros, aunque esto no es obligatorio, le recomendamos encarecidamente que tenga los registros de EMR disponibles para facilitar la depuración. Etiqueta de lanzamiento El atributo se usa para especificar la versión de las aplicaciones de software y los componentes de Hadoop que utiliza el clúster de EMR. Por último, Solicitudes se refiere a los paquetes que usaremos y necesitamos instalar en el clúster.

Ahora definiremos el grupo de instancias que se utilizan en el clúster. La cantidad de recursos informáticos que se utilizarán es una exageración absoluta para la tarea en cuestión. Se hace de esa manera para mostrar cómo configurar varias instancias en un clúster.

13Instances={'InstanceGroups': [{'InstanceRole': 'MASTER','Name': "Master node",'InstanceType': 'm4.large','InstanceCount': 1,},{'InstanceRole': 'CORE','Name': "Slave node",'InstanceType': 'm4.large','InstanceCount': 2,}],'KeepJobFlowAliveWhenNoSteps': False,'Ec2SubnetId': 'subnet-jnp2fed5',},


EMR siempre requiere un nodo maestro para coordinar el clúster general y distribuir las tareas a los nodos de trabajo; normalmente hay uno o más nodos de trabajo. Estos son responsables de ejecutar las tareas de procesamiento de datos y almacenar los datos en el HDFS. Asignaremos instancias de m4.large tanto a los nodos maestros como a los esclavos. Solo puede haber un nodo maestro a la vez, pero puede haber un gran número de nodos de trabajo.

KeepJobFlowAliveWhenNoSteps determina si el clúster debe terminar automáticamente cuando no haya más pasos en ejecución. Tener el clúster activo puede ahorrarle algo de tiempo mientras esté realizando los pasos, pero seguirá generando costos, incluso si no hay ningún paso en ejecución.

EC2SubnetID debe ser una subred creada dentro de la VPC que mencionamos anteriormente.

31Steps=[ { 'Name': 'Guess the coefficients', 'ActionOnFailure': 'CONTINUE', 'HadoopJarStep': { 'Jar': 'command-runner.jar', 'Args': [ 'spark-submit', "s3:/guess-the-function-emr/scripts/guess.py", "--max_iter", max_iter, "--x1", x1, "--x2", x2 ] } } ],

Aquí estamos definiendo un paso para el clúster de EMR. Un paso es una unidad de trabajo que puede agregar a un clúster para realizar una tarea o procesamiento específico de sus datos. Consiste en un programa o script ejecutable, junto con cualquier configuración necesaria y los datos de entrada/salida. Hay varios tipos de pasos. El código define uno que implica enviar un trabajo de Spark para ejecutar un script almacenado en S3 con algunos parámetros previamente definidos.

47VisibleToAllUsers=True, JobFlowRole='blog-emr-job-role', ServiceRole='EMR_DefaultRole', Tags=[{ "Key":"demo", "Value":"guess-the-function" }],)

En el último bloque de definición, estableceremos el indicador VisibleToAllUsers en true, lo que nos permitirá ver el clúster creado por la lambda sin necesidad de lidiar con las políticas de IAM. También definiremos JobflowRole y ServiceRole, ambos descritos anteriormente. También puede ver cómo incluir una etiqueta, aunque no es necesario, pero definitivamente se recomienda si desea utilizar herramientas como el AWS Cost Explorer de forma más eficiente.

56return { 'statusCode': 200, 'body': f"Submitted job with Id {cluster_id['JobFlowId']}"}

Terminemos devolviendo un StatusCode y un cuerpo con el ID de clúster de EMR.

Al juntarlo todo, el controlador se vería así:

import boto3connection = boto3.client('emr')def lambda_handler(event, context): max_iter = event.get('epochs', "10") x1 = event.get('x1', "10") x2 = event.get('x2', "10") cluster_id = connection.run_job_flow( Name="Guess-the-function", LogUri="s3:/guess-the-function-emr/logs/" ReleaseLabel='emr-6.6.0', Applications=[{'Name': 'Spark'}], Instances={ 'InstanceGroups': [ { 'InstanceRole': 'MASTER', 'Name': "Master node", 'InstanceType': 'm4.large', 'InstanceCount': 1, }, { 'InstanceRole': 'CORE', 'Name': "Slave node", 'InstanceType': 'm4.large', 'InstanceCount': 2, } ], 'KeepJobFlowAliveWhenNoSteps': False, 'Ec2SubnetId': 'subnet-jnp2fed5', }, Steps=[ { 'Name': 'Guess the coefficients', 'ActionOnFailure': 'CONTINUE', 'HadoopJarStep': { 'Jar': 'command-runner.jar', 'Args': [ 'spark-submit', "s3:/guess-the-function-emr/scripts/guess.py", "--max_iter", max_iter, "--x1", x1, "--x2", x2 ] } } ], VisibleToAllUsers=True, JobFlowRole='blog-emr-job-role', ServiceRole='EMR_DefaultRole', Tags=[{ "Key":"demo", "Value":"guess-the-function" }],)return { 'statusCode': 200, 'body': f"Submitted job with Id {cluster_id['JobFlowId']}"}

Este es un pequeño fragmento del aspecto que podría tener el evento de prueba de Lambda:

no-line-numbers|json{ “epochs”: 10, “x1”: 5, “x2”: 3}

Solo tienes que probarlo después de implementar los cambios presionando el botón de prueba y ¡puf! Tienes un clúster que ejecuta EMR y que entrenará un modelo de regresión para intentar aproximar una función polinómica.

Para ver el resultado del modelo, simplemente abra los registros del clúster una vez que haya finalizado. En S3, vaya a steps > S-ID_of_node > stdout.gz y verá el resultado deseado.

no-line-numbers|textnumber of iterations: 4RMSE: 0.2895831584955561r2: 0.9952144735311422model coefficients: [10.004679311797036,10.017003111930043]

Manténgase a la vanguardia de las últimas tendencias y conocimientos sobre big data, aprendizaje automático e inteligencia artificial. ¡No se lo pierda y suscríbase a nuestro boletín de noticias!