Ejecutar cargas de trabajo interactivas con EMR sin servidor a través de un punto de conexión Apache Livy
Con Amazon EMR 6.14.0 y versiones posteriores, puede crear y habilitar un punto de conexión Apache Livy mientras crea una aplicación EMR sin servidor y ejecutar cargas de trabajo interactivas a través de sus cuadernos autoalojados o con un cliente personalizado. Un punto de conexión Apache Livy ofrece los siguientes beneficios:
-
Puede conectarse de forma segura a un punto de conexión Apache Livy a través de los cuadernos de Jupyter y administrar las cargas de trabajo de Apache Spark con la interfaz REST de Apache Livy.
-
Utilice las operaciones de la API de REST de Apache Livy para aplicaciones web interactivas que utilizan datos de las cargas de trabajo de Apache Spark.
Requisitos previos
Para utilizar un punto de conexión de Apache Livy con EMR sin servidor, debe cumplir con los siguientes requisitos:
-
Complete los pasos que se indican en Introducción a Amazon EMR sin servidor.
-
Para ejecutar cargas de trabajo interactivas a través de los puntos de conexión de Apache Livy, necesita ciertos permisos y roles. Para más información, consulte Required permissions for interactive workloads.
Permisos necesarios
Además de los permisos necesarios para acceder a EMR sin servidor, también debe agregar los siguientes permisos a su rol de IAM para acceder a un punto de conexión de Apache Livy y ejecutar aplicaciones:
-
emr-serverless:AccessLivyEndpoints- otorga permiso para acceder y conectarse a la aplicación compatible con Livy que usted especifica comoResource. Necesita este permiso para ejecutar las operaciones de la API de REST disponibles en el punto de conexión de Apache Livy. -
iam:PassRole: concede permiso para acceder al rol de ejecución de IAM cuando crea la sesión de Apache Livy. EMR sin servidor utilizará este rol para ejecutar sus cargas de trabajo. -
emr-serverless:GetDashboardForJobRun— concede permiso para generar la IU de Spark Live y los enlaces al registro de controladores y, además, proporciona acceso a los registros como parte de los resultados de la sesión de Apache Livy.
Introducción
Para crear una aplicación compatible con Apache Livy y ejecutarla, siga estos pasos.
Para crear una aplicación compatible con Apache Livy y ejecutarla, siga este comando.
aws emr-serverless create-application \ --namemy-application-name\ --type 'application-type' \ --release-label <Amazon EMR-release-version> --interactive-configuration '{"livyEndpointEnabled": true}'-
Después de que EMR sin servidor haya creado su aplicación, inicie la aplicación para que el punto de conexión de Apache Livy esté disponible.
aws emr-serverless start-application \ --application-idapplication-idUtilice el siguiente comando para comprobar el estado de la aplicación. Una vez que el estado pase a
STARTED, acceda al punto de conexión de Apache Livy.aws emr-serverless get-application \ --region<AWS_REGION>--application-id>application_id> -
Utilice la siguiente URL para acceder al punto de conexión:
https://_<application-id>_.livy.emr-serverless-services._<AWS_REGION>_.amazonaws.com
Una vez que el punto de conexión esté listo, envíe cargas de trabajo en función de su caso de uso. Debe firmar todas las solicitudes que se envíen al punto de conexión con el protocolo SigV4 y pasar un encabezado de autorización. Puede usar uno de los métodos siguientes para ejecutar cargas de trabajo:
-
Cliente de HTTP: envíe sus operaciones de la API de punto de conexión de Apache Livy con un cliente de HTTP personalizado.
-
Kernel de Sparkmagic: ejecute el kernel de Sparkmagic de forma local y enviar consultas interactivas con los cuadernos de Jupyter.
Clientes de HTTP
Para crear una sesión de Apache Livy, envíe emr-serverless.session.executionRoleArn en el parámetro conf del cuerpo de la solicitud. El siguiente ejemplo es una solicitud POST /sessions de muestra.
{ "kind": "pyspark", "heartbeatTimeoutInSecond": 60, "conf": { "emr-serverless.session.executionRoleArn": "<executionRoleArn>" } }
La tabla siguiente describe todas las operaciones de la API de Apache Livy disponibles.
| Operación de la API | Descripción |
|---|---|
| GET /sessions | Devuelve una lista de todas las sesiones interactivas activas. |
| POST /sessions | Crea una nueva sesión interactiva mediante Spark o Pyspark. |
GET /sessions/<sessionId> |
Devuelve la información de la sesión. |
GET /sessions/<sessionId>/state |
Devuelve el estado de la sesión. |
DELETE /sessions/<sessionId> |
Detiene y elimina la sesión. |
GET /sessions/<sessionId>/statements |
Devuelve todas las instrucciones de una sesión. |
POST /sessions/<sessionId>/statements |
Ejecuta una instrucción en una sesión. |
GET /sessions/<sessionId>/statements/<statementId> |
Devuelve los detalles de la instrucción especificada en una sesión. |
POST /sessions/<sessionId>/statements/<statementId>/cancel |
Cancela la instrucción especificada en esta sesión. |
Envío de solicitudes al punto de conexión de Apache Livy
También puede enviar solicitudes directamente al punto de conexión de Apache Livy desde un cliente de HTTP. De este modo, podrá ejecutar código de forma remota para sus casos de uso fuera de un cuaderno.
Antes de empezar a enviar solicitudes al punto de conexión, asegúrese de haber instalado las siguientes bibliotecas:
pip3 install botocore awscrt requests
El siguiente es un ejemplo de script de Python para enviar solicitudes HTTP directamente a un punto de conexión:
from botocore import crt import requests from botocore.awsrequest import AWSRequest from botocore.credentials import Credentials import botocore.session import json, pprint, textwrap endpoint = 'https://<application_id>.livy.emr-serverless-services.<AWS_REGION>.amazonaws.com' headers = {'Content-Type': 'application/json'} session = botocore.session.Session() signer = crt.auth.CrtS3SigV4Auth(session.get_credentials(), 'emr-serverless', '<AWS_REGION>') ### Create session request data = {'kind': 'pyspark', 'heartbeatTimeoutInSecond': 60, 'conf': { 'emr-serverless.session.executionRoleArn': 'arn:aws:iam::123456789012:role/role1'}} request = AWSRequest(method='POST', url=endpoint + "/sessions", data=json.dumps(data), headers=headers) request.context["payload_signing_enabled"] = False signer.add_auth(request) prepped = request.prepare() r = requests.post(prepped.url, headers=prepped.headers, data=json.dumps(data)) pprint.pprint(r.json()) ### List Sessions Request request = AWSRequest(method='GET', url=endpoint + "/sessions", headers=headers) request.context["payload_signing_enabled"] = False signer.add_auth(request) prepped = request.prepare() r2 = requests.get(prepped.url, headers=prepped.headers) pprint.pprint(r2.json()) ### Get session state session_url = endpoint + r.headers['location'] request = AWSRequest(method='GET', url=session_url, headers=headers) request.context["payload_signing_enabled"] = False signer.add_auth(request) prepped = request.prepare() r3 = requests.get(prepped.url, headers=prepped.headers) pprint.pprint(r3.json()) ### Submit Statement data = { 'code': "1 + 1" } statements_url = endpoint + r.headers['location'] + "/statements" request = AWSRequest(method='POST', url=statements_url, data=json.dumps(data), headers=headers) request.context["payload_signing_enabled"] = False signer.add_auth(request) prepped = request.prepare() r4 = requests.post(prepped.url, headers=prepped.headers, data=json.dumps(data)) pprint.pprint(r4.json()) ### Check statements results specific_statement_url = endpoint + r4.headers['location'] request = AWSRequest(method='GET', url=specific_statement_url, headers=headers) request.context["payload_signing_enabled"] = False signer.add_auth(request) prepped = request.prepare() r5 = requests.get(prepped.url, headers=prepped.headers) pprint.pprint(r5.json()) ### Delete session session_url = endpoint + r.headers['location'] request = AWSRequest(method='DELETE', url=session_url, headers=headers) request.context["payload_signing_enabled"] = False signer.add_auth(request) prepped = request.prepare() r6 = requests.delete(prepped.url, headers=prepped.headers) pprint.pprint(r6.json())
Kernel de Sparkmagic
Antes de instalar Sparkmagic, asegúrese de haber configurado las AWS credenciales en la instancia en la que quiere instalar Sparkmagic
-
Instale Sparkmagic siguiendo los pasos de instalación
. Tenga en cuenta que solo debe realizar los primeros cuatro pasos. -
El kernel de Sparkmagic admite autenticadores personalizados, por lo que puede integrar un autenticador con el núcleo de Sparkmagic para que todas las solicitudes estén firmadas mediante SigV4.
-
Instalar el autenticador personalizado EMR sin servidor.
pip install emr-serverless-customauth -
Ahora proporciona la ruta al autenticador personalizado y la URL del punto de conexión de Apache Livy en el archivo JSON de configuración de Sparkmagic. Utilice el comando siguiente para abrir el archivo de configuración.
vim ~/.sparkmagic/config.jsonA continuación se muestra un archivo
config.jsonde ejemplo.{ "kernel_python_credentials" : { "username": "", "password": "", "url": "https://<application-id>.livy.emr-serverless-services.<AWS_REGION>.amazonaws.com", "auth": "Custom_Auth" }, "kernel_scala_credentials" : { "username": "", "password": "", "url": "https://<application-id>.livy.emr-serverless-services.<AWS_REGION>.amazonaws.com", "auth": "Custom_Auth" }, "authenticators": { "None": "sparkmagic.auth.customauth.Authenticator", "Basic_Access": "sparkmagic.auth.basic.Basic", "Custom_Auth": "emr_serverless_customauth.customauthenticator.EMRServerlessCustomSigV4Signer" }, "livy_session_startup_timeout_seconds": 600, "ignore_ssl_errors": false } -
Inicie el laboratorio de Jupyter. Debe usar la autenticación personalizada que configuró en el último paso.
-
A continuación, puede ejecutar los siguientes comandos del cuaderno y su código para empezar.
%%info //Returns the information about the current sessions.%%configure -f //Configure information specific to a session. We supply executionRoleArn in this example. Change it for your use case. { "driverMemory": "4g", "conf": { "emr-serverless.session.executionRoleArn": "arn:aws:iam::123456789012:role/JobExecutionRole" } }<your code>//Run your code to start the session
Internamente, cada instrucción llama a cada una de las operaciones de la API de Apache Livy a través de la URL del punto de conexión de Apache Livy configurada. A continuación, puede escribir sus instrucciones de acuerdo con su caso de uso.
Consideraciones
Tenga en cuenta las siguientes consideraciones al ejecutar cargas de trabajo interactivas a través de los puntos de conexión de Apache Livy.
-
EMR sin servidor mantiene el aislamiento a nivel de sesión mediante la entidad principal que llama. La entidad principal que llama y crea la sesión es la única que puede acceder a esa sesión. Para un aislamiento más detallado, configure una identidad de fuente al asumir las credenciales. En este caso, EMR sin servidor impone el aislamiento a nivel de sesión en función de la entidad principal que llama y de la identidad de fuente. Para obtener más información sobre la identidad de fuente, consulte Monitorear y controlar las acciones realizadas con roles asumidos.
-
Los puntos de conexión de Apache Livy son compatibles con EMR sin servidor 6.14.0 y versiones posteriores.
-
Los puntos de conexión de Apache Livy solo son compatibles con el motor Apache Spark.
-
Los puntos de conexión de Apache Livy son compatibles con Scala Spark y PySpark.
-
De forma predeterminada,
autoStopConfigestá habilitada en las aplicaciones. Esto significa que las aplicaciones se cierran después de 15 minutos de estar inactivas. Puede cambiar esta configuración como parte de su solicitud decreate-applicationo deupdate-application. -
Puede ejecutar hasta 25 sesiones simultáneas en una sola aplicación habilitada para puntos de conexión de Apache Livy.
-
Para una experiencia de inicio optimizada, le sugerimos que configure la capacidad preinicializada para los controladores y ejecutores.
-
Debe iniciar la aplicación manualmente antes de conectarse al punto de conexión de Apache Livy.
-
Debe tener una cuota de servicio de vCPU suficiente en su Cuenta de AWS para ejecutar cargas de trabajo interactivas. Se recomiendan al menos 24 vCPU.
-
El tiempo de espera predeterminado de una sesión de Apache Livy es de 1 hora. Si no ejecuta las instrucciones durante una hora, entonces, Apache Livy eliminará la sesión y liberará el controlador y los ejecutores. A partir de la versión emr-7.8.0, este valor se puede establecer mediante la especificación del parámetro
ttlcomo parte de la solicitud/sessions POSTde Livy, por ejemplo,2h(horas),120m(minutos),7200s(segundos),7200000ms(milisegundos).nota
Esta configuración no se puede modificar en las versiones anteriores a emr-7.8.0. El siguiente ejemplo es una muestra del cuerpo de una solicitud
POST /sessions.{ "kind": "pyspark", "heartbeatTimeoutInSecond": 60, "conf": { "emr-serverless.session.executionRoleArn": "executionRoleArn" }, "ttl": "2h" } A partir de la versión emr-7.8.0 de Amazon EMR para aplicaciones con control de acceso detallado a través de LakeFormation, la configuración se puede deshabilitar por sesión. Para obtener más información sobre cómo habilitar un control de acceso detallado para una aplicación de EMR sin servidor, consulte Methods for fine-grained access control.
nota
No es posible habilitar Lake Formation para una sesión si no se habilitó para una aplicación. El siguiente ejemplo es una muestra del cuerpo de una solicitud
POST /sessions.{ "kind": "pyspark", "heartbeatTimeoutInSecond": 60, "conf": { "emr-serverless.session.executionRoleArn": "executionRoleArn" }, "spark.emr-serverless.lakeformation.enabled" : "false" }-
Solo las sesiones activas pueden interactuar con un punto de conexión de Apache Livy. Una vez que la sesión finalice, se cancele o termine, no podrá acceder a ella a través del punto de conexión de Apache Livy.