Lance un trabajo de Spark en un EMR clúster transitorio mediante una función Lambda - Recomendaciones de AWS

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

Lance un trabajo de Spark en un EMR clúster transitorio mediante una función Lambda

Creado por Dhrubajyoti Mukherjee () AWS

Entorno: producción

Tecnologías: análisis

Carga de trabajo: código abierto

AWSservicios: AmazonEMR; AWS Identity and Access Management; AWS Lambda; Amazon VPC

Resumen

Este patrón usa la EMR RunJobFlow API acción de Amazon para lanzar un clúster transitorio para ejecutar un trabajo de Spark desde una función Lambda. Un EMR clúster transitorio está diseñado para finalizar tan pronto como se complete el trabajo o si se produce algún error. Un clúster transitorio permite ahorrar costos porque solo se ejecuta durante el tiempo de cálculo y proporciona escalabilidad y flexibilidad en un entorno de nube.

El EMR clúster transitorio se lanza mediante el lenguaje de programación Boto3 API y Python en una función Lambda. La función de Lambda, escrita en Python, proporciona la flexibilidad adicional de iniciar el clúster cuando es necesario.

Para demostrar un ejemplo de cálculo y salida por lotes, este patrón lanzará un trabajo de Spark en un EMR clúster desde una función Lambda y ejecutará un cálculo por lotes con los datos de ventas de ejemplo de una empresa ficticia. El resultado del trabajo de Spark será un archivo de valores (CSV) separados por comas en Amazon Simple Storage Service (Amazon S3). El archivo de datos de entrada, el archivo.jar de Spark, un fragmento de código y una AWS CloudFormation plantilla para una nube privada virtual (VPC) y las funciones de AWS Identity and Access Management (IAM) para ejecutar el cálculo se proporcionan como archivos adjuntos.

Requisitos previos y limitaciones

Requisitos previos 

  • Una cuenta activa AWS

Limitaciones

  • Solo se puede iniciar un trabajo de Spark a partir del código a la vez. 

Versiones de producto

  • Probado en Amazon EMR 6.0.0

Arquitectura

Pila de tecnología de destino

  • Amazon EMR 

  • AWSLambda

  • Amazon S3

  • Apache Spark

Arquitectura de destino

Lambda a Amazon EMR y de Spark a Amazon S3

Automatizar y escalar

Para automatizar el cálculo EMR por lotes de Spark, puede utilizar cualquiera de las siguientes opciones.

Herramientas

AWSservicios

  • Amazon EMR es una plataforma de clústeres gestionada que simplifica la ejecución de marcos de big data AWS para procesar y analizar grandes cantidades de datos.

  • AWSLambda es un servicio informático que le ayuda a ejecutar código sin necesidad de aprovisionar o administrar servidores. Ejecuta el código solo cuando es necesario y amplía la capacidad de manera automática, por lo que solo pagará por el tiempo de procesamiento que utilice.

  • Amazon Simple Storage Service (Amazon S3) es un servicio de almacenamiento de objetos basado en la nube que le ayuda a almacenar, proteger y recuperar cualquier cantidad de datos.

Otras herramientas

  • Apache Spark es un motor de análisis en varios idiomas para el procesamiento de datos a gran escala.

Epics

TareaDescripciónHabilidades requeridas

Cree los IAM roles y losVPC.

Si ya tiene las EMR IAM funciones AWS Lambda y Amazon y aVPC, puede omitir este paso. Para ejecutar el código, tanto el EMR clúster como la función Lambda requieren IAM funciones. El EMR clúster también requiere una VPC subred pública o una subred privada con una puerta de enlace. NAT Para crear automáticamente todos los IAM roles y unVPC, implemente la AWS CloudFormation plantilla adjunta tal cual, o bien, puede crear los roles y crearlos VPC manualmente, tal y como se especifica en la sección de información adicional.

Arquitecto de la nube

Anote las claves AWS CloudFormation de salida de la plantilla.

Una vez que la CloudFormation plantilla se haya desplegado correctamente, vaya a la pestaña Salidas de la AWS CloudFormation consola. Tenga en cuenta las cinco claves de salida:

  • S3Bucket

  • LambdaExecutionRole

  • ServiceRole

  • JobFlowRole

  • Ec2SubnetId

Utilizará los valores de estas claves cuando cree la función de Lambda.

Arquitecto de la nube
TareaDescripciónHabilidades requeridas

Subir el archivo.jar de Spark.

Sube el archivo.jar de Spark al bucket de S3 que creó la AWS CloudFormation pila. El nombre del bucket es el mismo que el de la clave de salidaS3Bucket.

¿General AWS
TareaDescripciónHabilidades requeridas

Creación de una función de Lambda.

En la consola Lambda, cree una función de Lambda de Python 3.9+ con un rol de ejecución. La política de funciones de ejecución debe permitir a Lambda lanzar un EMR clúster. (Consulte la AWS CloudFormation plantilla adjunta).

Ingeniero de datos, ingeniero de nube

Copie y pegue el código.

Sustituya el código del archivo lambda_function.py por el código de la sección de Información adicional de este patrón.

Ingeniero de datos, ingeniero de nube

Cambie los parámetros del código.

Siga los comentarios del código para cambiar los valores de los parámetros para que coincidan con su AWS cuenta.

Ingeniero de datos, ingeniero de nube

Inicie la función para iniciar el clúster.

Inicie la función para iniciar la creación de un EMR clúster transitorio con el archivo.jar de Spark proporcionado. Ejecutará el trabajo de Spark y finalizará automáticamente cuando se complete el trabajo.

Ingeniero de datos, ingeniero de nube

Comprueba el estado del EMR clúster.

Una vez iniciado el EMR clúster, aparece en la EMR consola de Amazon, en la pestaña Clústeres. Se puede comprobar en consecuencia cualquier error que se produzca al lanzar el clúster o al ejecutar el trabajo.

Ingeniero de datos, ingeniero de nube
TareaDescripciónHabilidades requeridas

Subir el archivo.jar de Spark.

Descargar el archivo.jar de Spark de la sección de Adjuntos y cárgalo en el bucket de S3.

Ingeniero de datos, ingeniero de nube

Cargue el conjunto de datos de entrada.

Cargue el archivo fake_sales_data.csv en el bucket de S3.

Ingeniero de datos, ingeniero de nube

Pegue el código de Lambda y cambie los parámetros.

Copie el código de la sección Herramientas y péguelo en una función de Lambda, sustituyendo el archivo de código lambda_function.py. Cambie los valores de los parámetros para que se ajusten a su cuenta.

Ingeniero de datos, ingeniero de nube

Iniciar la función y verificar la salida.

Una vez que la función de Lambda inicia el clúster con el trabajo de Spark proporcionado, genera un archivo.csv en el bucket de S3.

Ingeniero de datos, ingeniero de nube

Recursos relacionados

Información adicional

Código

""" Copy paste the following code in your Lambda function. Make sure to change the following key parameters for the API as per your account -Name (Name of Spark cluster) -LogUri (S3 bucket to store EMR logs) -Ec2SubnetId (The subnet to launch the cluster into) -JobFlowRole (Service role for EC2) -ServiceRole (Service role for Amazon EMR) The following parameters are additional parameters for the Spark job itself. Change the bucket name and prefix for the Spark job (located at the bottom). -s3://your-bucket-name/prefix/lambda-emr/SparkProfitCalc.jar (Spark jar file) -s3://your-bucket-name/prefix/fake_sales_data.csv (Input data file in S3) -s3://your-bucket-name/prefix/outputs/report_1/ (Output location in S3) """ import boto3 client = boto3.client('emr') def lambda_handler(event, context): response = client.run_job_flow( Name='spark_job_cluster', LogUri='s3://your-bucket-name/prefix/logs', ReleaseLabel='emr-6.0.0', Instances={ 'MasterInstanceType': 'm5.xlarge', 'SlaveInstanceType': 'm5.large', 'InstanceCount': 1, 'KeepJobFlowAliveWhenNoSteps': False, 'TerminationProtected': False, 'Ec2SubnetId': 'subnet-XXXXXXXXXXXXXX' }, Applications=[{'Name': 'Spark'}], Configurations=[ {'Classification': 'spark-hive-site', 'Properties': { 'hive.metastore.client.factory.class': 'com.amazonaws.glue.catalog.metastore.AWSGlueDataCatalogHiveClientFactory'} } ], VisibleToAllUsers=True, JobFlowRole='EMRLambda-EMREC2InstanceProfile-XXXXXXXXX', ServiceRole='EMRLambda-EMRRole-XXXXXXXXX', Steps=[ { 'Name': 'flow-log-analysis', 'ActionOnFailure': 'TERMINATE_CLUSTER', 'HadoopJarStep': { 'Jar': 'command-runner.jar', 'Args': [ 'spark-submit', '--deploy-mode', 'cluster', '--executor-memory', '6G', '--num-executors', '1', '--executor-cores', '2', '--class', 'com.aws.emr.ProfitCalc', 's3://your-bucket-name/prefix/lambda-emr/SparkProfitCalc.jar', 's3://your-bucket-name/prefix/fake_sales_data.csv', 's3://your-bucket-name/prefix/outputs/report_1/' ] } } ] )

IAMroles y VPC creación

Para lanzar el EMR clúster en una función Lambda, se necesitan IAM los roles a VPC y. Puede configurar los IAM roles VPC y mediante la AWS CloudFormation plantilla de la sección de adjuntos de este patrón, o puede crearlos manualmente mediante los siguientes enlaces. 

Se requieren las siguientes IAM funciones para ejecutar Lambda y Amazon. EMR 

Rol de ejecución de Lambda

La función de ejecución de una función Lambda le otorga permiso para acceder a los AWS servicios y recursos.

Función de servicio para Amazon EMR

El EMRrol de Amazon define las acciones permitidas para Amazon EMR al aprovisionar recursos y realizar tareas de nivel de servicio que no se realizan en el contexto de una instancia de Amazon Elastic Compute Cloud (AmazonEC2) que se ejecuta dentro de un clúster. Por ejemplo, la función de servicio se usa para aprovisionar EC2 instancias cuando se lanza un clúster.

Función de servicio para EC2 instancias

La función de servicio para EC2 las instancias de clúster (también denominada perfil de EC2 instancia para AmazonEMR) es un tipo especial de función de servicio que se asigna a todas las EC2 instancias de un EMR clúster de Amazon cuando se lanza la instancia. Los procesos de aplicación que se ejecutan sobre Apache Hadoop asumen esta función en lo que respecta a los permisos para interactuar con otros AWS servicios.

VPCy creación de subredes

Puede crear una VPC desde la VPC consola. 

Conexiones

Para acceder al contenido adicional asociado a este documento, descomprima el archivo: attachment.zip