Execução de workloads interativas com o EMR Servidor por meio de um endpoint do Apache Livy - Amazon EMR

As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.

Execução de workloads interativas com o EMR Servidor por meio de um endpoint do Apache Livy

Com as versões 6.14.0 e superiores do Amazon EMR, você pode criar e habilitar um endpoint do Apache Livy enquanto cria uma aplicação do EMR Sem Servidor e executar workloads interativas por meio de cadernos auto-hospedados ou com um cliente personalizado. Um endpoint do Apache Livy oferece os seguintes benefícios:

  • Você pode se conectar com segurança a um endpoint do Apache Livy por meio de cadernos Jupyter e gerenciar workloads do Apache Spark com a interface REST do Apache Livy.

  • Use as operações da API REST do Apache Livy para aplicações Web interativas que utilizam dados das workloads do Apache Spark.

Pré-requisitos

Para usar um endpoint do Apache Livy com o EMR Sem Servidor, você deve atender aos seguintes requisitos:

Permissões obrigatórias

Além das permissões necessárias para acessar o EMR Sem Servidor, você também deve adicionar as seguintes permissões ao perfil do IAM para acessar um endpoint do Apache Livy e executar aplicações:

  • emr-serverless:AccessLivyEndpoints: concede permissão para acessar e se conectar à aplicação habilitada para Livy especificada como Resource. Você precisa dessa permissão para executar as operações da API REST disponíveis no endpoint do Apache Livy.

  • iam:PassRole: concede permissão para acessar o perfil de execução do IAM ao criar a sessão do Apache Livy. O EMR Sem Servidor usará esse perfil para executar suas workloads.

  • emr-serverless:GetDashboardForJobRun: concede permissão para gerar a interface do usuário do Spark Live e os links de log do driver e fornece acesso aos logs como parte dos resultados da sessão do Apache Livy.

{ "Version": "2012-10-17", "Statement": [{ "Sid": "EMRServerlessInteractiveAccess", "Effect": "Allow", "Action": "emr-serverless:AccessLivyEndpoints", "Resource": "arn:aws:emr-serverless:<AWS_REGION>:account:/applications/*" }, { "Sid": "EMRServerlessRuntimeRoleAccess", "Effect": "Allow", "Action": "iam:PassRole", "Resource": "execution-role-ARN", "Condition": { "StringLike": { "iam:PassedToService": "emr-serverless.amazonaws.com" } } }, { "Sid": "EMRServerlessDashboardAccess", "Effect": "Allow", "Action": "emr-serverless:GetDashboardForJobRun", "Resource": "arn:aws:emr-serverless:<AWS_REGION>:account:/applications/*" } ] }

Começar

Para criar uma aplicação habilitada para Apache Livy e executá-la, siga estas etapas.

  1. Para criar uma aplicação habilitada para Apache Livy, execute o comando a seguir.

    aws emr-serverless create-application \ --name my-application-name \ --type 'application-type' \ --release-label <Amazon EMR-release-version> --interactive-configuration '{"livyEndpointEnabled": true}'
  2. Depois que o EMR Sem Servidor criar a aplicação, inicie-a para disponibilizar o endpoint do Apache Livy.

    aws emr-serverless start-application \ --application-id application-id

    Use o comando a seguir para verificar o status da aplicação. Quando o status se tornar STARTED, você poderá acessar o endpoint do Apache Livy.

    aws emr-serverless get-application \ --region <AWS_REGION> --application-id >application_id>
  3. Use o seguinte URL para acessar o endpoint:

    https://_<application-id>_.livy.emr-serverless-services._<AWS_REGION>_.amazonaws.com

Quando o endpoint estiver pronto, você poderá enviar workloads com base no caso de uso. Você deve assinar todas as solicitações no endpoint com o SIGv4 protocolo e passar um cabeçalho de autorização. É possível usar os seguintes métodos para executar workloads:

  • Cliente HTTP: você deve enviar suas operações da API de endpoint do Apache Livy com um cliente HTTP personalizado.

  • Kernel do Sparkmagic: você deve executar localmente o kernel do Sparkmagic e enviar consultas interativas com os cadernos Jupyter.

Clientes HTTP

Para criar uma sessão do Apache Livy, você deve enviar emr-serverless.session.executionRoleArn no parâmetro conf do corpo da solicitação. Confira a seguir um exemplo de solicitação POST /sessions.

{ "kind": "pyspark", "heartbeatTimeoutInSecond": 60, "conf": { "emr-serverless.session.executionRoleArn": "<executionRoleArn>" } }

A tabela a seguir descreve todas as operações disponíveis da API do Apache Livy.

Operação de API Descrição
GET /sessions Retorna uma lista de todas as sessões interativas ativas.
POST /sessions Cria uma sessão interativa por meio do Spark ou PySpark.
OBTENHA /sessions/ < > sessionId Retorna as informações da sessão.
GET /sessions/ < >/state sessionId Retorna o estado da sessão.
EXCLUIR /sessions/ < > sessionId Interrompe e exclui a sessão.
GET /sessions/ < >/declarações sessionId Retorna todas as instruções em uma sessão.
POST /sessions/ < >/declarações sessionId Executa de uma instrução em uma sessão.
GET /sessions/ < >/declarações/< > sessionId statementId Retorna os detalhes da instrução especificada em uma sessão.
POST /sessions/ < >/declarações/< >/cancelar sessionId statementId Cancela a instrução especificada nesta sessão.

Envio de solicitações ao endpoint do Apache Livy

Você também pode enviar solicitações diretamente ao endpoint do Apache Livy de um cliente HTTP. Isso permite executar remotamente o código para casos de uso fora de um caderno.

Antes de começar a enviar solicitações ao endpoint, certifique-se de que instalou as seguintes bibliotecas:

pip3 install botocore awscrt requests

Confira este exemplo de script Python para enviar solicitações HTTP diretamente a um endpoint:

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 do Sparkmagic

Antes de instalar o sparkmagic, verifique se você configurou AWS as credenciais na instância em que deseja instalar o sparkmagic

  1. Instale o Sparkmagic seguindo as etapas de instalação. Observe que você só precisa executar as quatro primeiras etapas.

  2. O kernel sparkmagic suporta autenticadores personalizados, para que você possa integrar um autenticador ao kernel sparkmagic para que cada solicitação seja assinada. SIGv4

  3. Instale o autenticador personalizado do EMR Sem Servidor.

    pip install emr-serverless-customauth
  4. Agora, forneça o caminho para o autenticador personalizado e o URL do endpoint do Apache Livy no arquivo JSON de configuração do Sparkmagic. Use o comando a seguir para abrir o arquivo de configuração.

    vim ~/.sparkmagic/config.json

    Veja a seguir um exemplo de arquivo config.json.

    { "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 }
  5. Inicie o Jupyter Lab. Ele deve usar a autenticação personalizada que você configurou na última etapa.

  6. Em seguida, você pode executar os comandos a seguir do caderno e seu código para começar.

    %%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 instrução chama cada uma das operações da API do Apache Livy por meio do URL configurado do endpoint do Apache Livy. Em seguida, você pode gravar suas instruções de acordo com o caso de uso.

Considerações

Considere as informações a seguir ao executar workloads interativas por meio de endpoints do Apache Livy.

  • O EMR Sem Servidor mantém o isolamento em nível de sessão usando a entidade principal do chamador. A entidade principal do chamador que cria a sessão é o único que pode acessá-la. Para um isolamento mais granular, você pode configurar uma identidade de origem ao assumir as credenciais. Nesse caso, o EMR Sem Servidor impõe o isolamento em nível de sessão com base na entidade principal do chamador e na identidade de origem. Para obter mais informações sobre a identidade de origem, consulte Monitorar e controlar ações realizadas com perfis assumidos.

  • Os endpoints do Apache Livy são compatíveis com as versões 6.14.0 e superiores do EMR Sem Servidor.

  • Os endpoints do Apache Livy são compatíveis somente com o mecanismo Apache Spark.

  • Os endpoints Apache Livy são compatíveis com Scala Spark e. PySpark

  • Por padrão, autoStopConfig está habilitado nas aplicações. Isso significa que as aplicações são encerradas após 15 minutos de inatividade. Você pode alterar essa configuração como parte da solicitação create-application ou update-application.

  • Você pode executar até 25 sessões simultâneas em uma única aplicação habilitada para endpoint do Apache Livy.

  • Para obter a melhor experiência de inicialização, recomendamos configurar a capacidade pré-inicializada para drivers e executores.

  • Você deve iniciar manualmente a aplicação antes de se conectar ao endpoint do Apache Livy.

  • Você deve ter uma cota de serviço de vCPU suficiente Conta da AWS para executar cargas de trabalho interativas com o endpoint Apache Livy. Recomendamos pelo menos 24 vCPUs.

  • O tempo limite padrão de uma sessão do Apache Livy é de uma hora. Se você não executar instruções por uma hora, o Apache Livy excluirá a sessão e liberará o driver e os executores. A partir da versão emr-7.8.0, esse valor pode ser definido especificando o ttl parâmetro como parte da /sessions POST solicitação do Livy, por exemplo, 2h (horas), (minutos), (segundos), 120m (milissegundos). 7200s 7200000ms

    nota

    Essa configuração não pode ser alterada antes do emr-7.8.0. Veja a seguir uma amostra do corpo de uma POST /sessions solicitação.

    { "kind": "pyspark", "heartbeatTimeoutInSecond": 60, "conf": { "emr-serverless.session.executionRoleArn": "executionRoleArn" }, "ttl": "2h" }
  • A partir da versão emr-7.8.0 do Amazon EMR para aplicativos com controle de acesso refinado via LakeFormation enabled, a configuração pode ser desativada por sessão. Para obter mais informações sobre como habilitar o controle de acesso refinado para um aplicativo EMR Serverless, consulte Métodos para controle de acesso refinado.

    nota

    O Lake Formation não pode ser habilitado para uma sessão quando não foi habilitado para um aplicativo. Veja a seguir uma amostra do corpo de uma POST /sessions solicitação.

    { "kind": "pyspark", "heartbeatTimeoutInSecond": 60, "conf": { "emr-serverless.session.executionRoleArn": "executionRoleArn" }, "spark.emr-serverless.lakeformation.enabled" : "false" }
  • Somente sessões ativas podem interagir com um endpoint do Apache Livy. Depois que a sessão for concluída, cancelada ou encerrada, você não poderá acessá-la por meio do endpoint do Apache Livy.