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.
Ejecutar cargas de trabajo interactivas con EMR sin servidor a través de un punto de conexión Apache Livy
Con las versiones 6.14.0 y posteriores de Amazon EMR, 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 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 Permisos necesarios para cargas de trabajo interactivas.
Permisos necesarios
Además de los permisos necesarios para acceder a EMR sin servidor, también debe añadir 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 al crear 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 \ --name
my-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-id
application-id
Utilice el siguiente comando para comprobar el estado de la aplicación. Una vez que el estado pase a ser
STARTED
, podrá acceder 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, puede enviar cargas de trabajo en función de su caso de uso. Debe firmar todas las solicitudes que se envíen al punto final con el SIGv4 protocolo y pasar un encabezado de autorización. Puede usar uno de los métodos siguientes para ejecutar cargas de trabajo:
-
Cliente de HTTP: debe enviar sus operaciones de la API de punto de conexión de Apache Livy con un cliente de HTTP personalizado.
-
Kernel de Sparkmagic: debe ejecutar 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, debe enviar emr-serverless.session.executionRoleArn
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. |
OBTENGA /sessions/ < > sessionId |
Devuelve la información de la sesión. |
OBTENGA /sessions/ < >/state sessionId |
Devuelve el estado de la sesión. |
ELIMINAR /sessions/ < sessionId > |
Detiene y elimina la sesión. |
OBTENGA /sessions/ < >/declaraciones sessionId |
Devuelve todas las instrucciones de una sesión. |
POST /sessions/ < sessionId >/declaraciones |
Ejecuta una instrucción en una sesión. |
OBTENGA /sessions/ < sessionId >/declaraciones/< > 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 credenciales en la instancia en la que quiere instalar Sparkmagic AWS
-
Instale Sparkmagic siguiendo los pasos de instalación
. Tenga en cuenta que solo necesita realizar los cuatro primeros pasos. -
El núcleo 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. 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.json
A continuación se muestra un archivo
config.json
de 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, puede configurar 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 tanto de la entidad principal que llama como de la identidad de fuente. Para obtener más información sobre la identidad de fuente, consulte Monitorización y control de las acciones realizadas con roles asumidos.
-
Los puntos de conexión de Apache Livy son compatibles con las versiones 6.14.0 y posteriores de EMR sin servidor.
-
Los puntos de conexión de Apache Livy solo son compatibles con el motor Apache Spark.
-
Los terminales Apache Livy son compatibles con Scala Spark y. PySpark
-
De forma predeterminada,
autoStopConfig
está 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-application
o 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 recomendamos 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 Cuenta de AWS para ejecutar cargas de trabajo interactivas con el punto de conexión Apache Livy. 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 sentencias durante una hora, Apache Livy elimina la sesión y libera el controlador y los ejecutores. A partir de la versión emr-7.8.0, este valor se puede establecer especificando el
ttl
parámetro como parte de la/sessions POST
solicitud de Livy, por ejemplo,2h
(horas), (minutos),120m
(segundos) o7200s
(milisegundos).7200000ms
nota
Esta configuración no se puede cambiar antes de la emr-7.8.0. El siguiente es un ejemplo del cuerpo de una
POST /sessions
solicitud.{ "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 un control de acceso detallado mediante la LakeFormation opción habilitada, 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 EMR sin servidor, consulte Métodos para un control de acceso detallado.
nota
Lake Formation no se puede activar para una sesión si no se ha activado para una aplicación. El siguiente es un ejemplo del cuerpo de una
POST /sessions
solicitud.{ "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.