

# Desenvolver e testar scripts de trabalho do AWS Glue localmente
<a name="aws-glue-programming-etl-libraries"></a>

Ao desenvolver e testar seus scripts de trabalho do AWS Glue para Spark, existem várias opções disponíveis:
+ Console do AWS Glue Studio
  + Editor visual
  + Editor de scripts
  + Cadernos do AWS Glue Studio
+ Sessões interativas
  + Bloco de anotações Jupyter
+ Docker image (Imagem do Docker)
  + Desenvolvimento local
  + Desenvolvimento remoto

É possível escolher qualquer uma das opções acima dependendo das suas necessidades.

Se você preferir uma experiência com nenhum ou pouco código, o editor visual do AWS Glue Studio será uma boa opção.

Se preferir uma experiência interativa de caderno, o caderno do AWS Glue Studio é uma boa opção. Para obter mais informações, consulte [Usar cadernos com o AWS Glue Studio e o AWS Glue](https://docs.aws.amazon.com/glue/latest/ug/notebooks-chapter.html). Se quiser usar seu próprio ambiente local, sessões interativas são uma boa opção. Para obter mais informações, consulte [Usar sessões interativas com o AWS Glue](https://docs.aws.amazon.com/glue/latest/dg/interactive-sessions-chapter.html).

Se você prefere a experiência de desenvolvimento local/remoto, a imagem do Docker é uma boa opção. Isso ajuda a desenvolver e testar scripts de trabalho do AWS Glue para Spark em qualquer lugar de sua preferência sem gerar custos com o AWS Glue.

Se preferir o desenvolvimento local sem o Docker, instalar o diretório da biblioteca de ETL do AWS Glue localmente é uma boa opção.

## Desenvolver usando o AWS Glue Studio
<a name="develop-using-studio"></a>

O editor visual do AWS Glue Studio é uma interface gráfica que facilita a criação, a execução e o monitoramento de trabalhos do tipo extrair, transformar e carregar (ETL) no AWS Glue. Você pode compor visualmente fluxos de trabalho de transformação de dados e executá-los perfeitamente no mecanismo de ETL sem servidor baseado no Apache Spark do AWS Glue. Você pode inspecionar os resultados do esquema e dos dados em cada etapa do trabalho. Para obter mais informações, consulte o [Manual do usuário do AWS Glue Studio](https://docs.aws.amazon.com/glue/latest/ug/what-is-glue-studio.html).

## Desenvolvimento com sessões interativas
<a name="develop-using-interactive-sessions"></a>

Sessões interativas permitem criar e testar aplicações no ambiente de sua escolha. Para obter mais informações, consulte [Usar sessões interativas com o AWS Glue](https://docs.aws.amazon.com/glue/latest/dg/interactive-sessions-chapter.html).

# Desenvolvimento e teste de trabalhos do AWS Glue localmente usando uma imagem do Docker
<a name="develop-local-docker-image"></a>

 Para uma plataforma de dados pronta para produção, o processo de desenvolvimento e o pipeline de CI/CD para trabalhos do AWS Glue é um tópico chave. Você pode desenvolver e testar com flexibilidade trabalhos do AWS Glue em um contêiner do Docker. O AWS Glue hospeda imagens do Docker no Docker Hub para configurar seu ambiente de desenvolvimento com utilitários adicionais. Você pode usar seu IDE, caderno ou REPL preferido com a biblioteca ETL do AWS Glue. Este tópico descreve o processo de desenvolvimento e teste de trabalhos do AWS Glue na versão 5.0 em um contêiner do Docker, usando uma imagem do Docker.

## Imagens do Docker disponíveis
<a name="develop-local-available-docker-images-ecr"></a>

 As seguintes imagens do Docker estão disponíveis para o AWS Glue no [Amazon ECR:](https://gallery.ecr.aws/glue/aws-glue-libs) 
+  Para a versão 5.0 do AWS Glue: `public.ecr.aws/glue/aws-glue-libs:5` 
+ Para o AWS Glue versão 4.0: `public.ecr.aws/glue/aws-glue-libs:glue_libs_4.0.0_image_01`
+ Para o AWS Glue versão 3.0: `public.ecr.aws/glue/aws-glue-libs:glue_libs_3.0.0_image_01`
+ Para o AWS Glue versão 2.0: `public.ecr.aws/glue/aws-glue-libs:glue_libs_2.0.0_image_01`

**nota**  
 As imagens do Docker do AWS Glue são compatíveis tanto com a arquitetura x86\$164 quanto com a arm64. 

 Neste exemplo, usamos `public.ecr.aws/glue/aws-glue-libs:5` e executamos o contêiner em uma máquina local (Mac, Windows ou Linux). Esta imagem de contêiner foi testada para trabalhos do Spark do AWS Glue na versão 5.0. A imagem contém o seguinte: 
+  Amazon Linux 2023 
+  AWS Glue ETL Library 
+  Apache Spark 3.5.4 
+  Bibliotecas de formatos de tabela abertos: Apache Iceberg 1.7.1, Apache Hudi 0.15.0 e Delta Lake 3.3.0 
+  Cliente do Catálogo de Dados do AWS Glue 
+  Conector do Amazon Redshift para Apache Spark 
+  Conector do Amazon DynamoDB para Apache Hadoop 

 Para configurar o contêiner, realize a extração da imagem do Galeria Pública do ECR e, em seguida, execute o contêiner. Este tópico demonstra como executar o contêiner usando os seguintes métodos, dependendo de suas necessidades: 
+ `spark-submit`
+ Shell REPL `(pyspark)`
+ `pytest`
+ Código do Visual Studio

## Pré-requisitos
<a name="develop-local-docker-image-prereq"></a>

Antes de começar, verifique se o Docker está instalado e se o daemon do Docker está em execução. Para obter instruções de instalação, consulte a documentação do Docker para [Mac](https://docs.docker.com/docker-for-mac/install/) ou [Linux](https://docs.docker.com/engine/install/). A máquina que executa o Docker hospeda o contêiner do AWS Glue. Verifique também se você tem pelo menos 7 GB de espaço em disco para a imagem no host que executa o Docker.

 Para obter mais informações sobre as restrições ao desenvolver código do AWS Glue localmente, consulte [Local development restrictions](https://docs.aws.amazon.com/glue/latest/dg/aws-glue-programming-etl-libraries.html#local-dev-restrictions). 

### Como configurar a AWS
<a name="develop-local-docker-image-config-aws-credentials"></a>

Para habilitar chamadas de API da AWS provenientes do contêiner, configure as credenciais da AWS seguindo as etapas. Nas seções a seguir, usaremos este perfil nomeado da AWS.

1.  [Crie um perfil nomeado da AWS](https://docs.aws.amazon.com//cli/latest/userguide/cli-configure-files.html). 

1.  Abra o `cmd` no Windows ou em um terminal no Mac ou no Linux e execute o seguinte comando no terminal: 

   ```
   PROFILE_NAME="<your_profile_name>"
   ```

Nas seções apresentadas a seguir, usaremos este perfil nomeado da AWS.

### 
<a name="develop-local-docker-pull-image-from-ecr-public"></a>

 Caso esteja executando o Docker no Windows, clique com o botão direito do mouse no ícone do Docker e selecione **Alternar para contêineres do Linux** antes de realizar a extração da imagem. 

Execute o seguinte comando para extrair a imagem da Galeria Pública do ECR:

```
docker pull public.ecr.aws/glue/aws-glue-libs:5 
```

## Execução do contêiner
<a name="develop-local-docker-image-setup-run"></a>

Agora, você pode executar um contêiner utilizando essa imagem. É possível escolher qualquer um dos seguintes dependendo das suas necessidades.

### spark-submit
<a name="develop-local-docker-image-setup-run-spark-submit"></a>

Você pode executar um script de trabalho do AWS Glue executando o comando `spark-submit` no contêiner. 

1.  Escreva seu script e salve-o como `sample.py` no exemplo abaixo. Depois disso, armazene-o no diretório `/local_path_to_workspace/src/` usando os seguintes comandos: 

   ```
   $ WORKSPACE_LOCATION=/local_path_to_workspace
   $ SCRIPT_FILE_NAME=sample.py
   $ mkdir -p ${WORKSPACE_LOCATION}/src
   $ vim ${WORKSPACE_LOCATION}/src/${SCRIPT_FILE_NAME}
   ```

1.  Essas variáveis são usadas no comando “docker run”, apresentado abaixo. O código de exemplo (sample.py) usado no comando “spark-submit” abaixo está incluído no apêndice ao final deste tópico. 

    Execute o comando a seguir para executar o comando `spark-submit` no contêiner a fim de enviar uma nova aplicação Spark: 

   ```
   $ docker run -it --rm \
       -v ~/.aws:/home
       /hadoop/.aws \
       -v $WORKSPACE_LOCATION:/home/hadoop/workspace/ \
       -e AWS_PROFILE=$PROFILE_NAME \
       --name glue5_spark_submit \
       public.ecr.aws/glue/aws-glue-libs:5 \
       spark-submit /home/hadoop/workspace/src/$SCRIPT_FILE_NAME
   ```

1. (Opcionalmente) Configure `spark-submit` para corresponder ao seu ambiente. Por exemplo, você pode passar suas dependências com a configuração `--jars`. Para obter informações adicionais, consulte [Carregar dinamicamente as propriedades do Spark](https://spark.apache.org/docs/latest/configuration.html) na documentação do Spark. 

### Shell REPL (Pyspark)
<a name="develop-local-docker-image-setup-run-repl-shell"></a>

 É possível executar um shell REPL (`read-eval-print loops`) para desenvolvimento interativo. Execute o comando a seguir para executar o comando PySpark no contêiner e iniciar o shell REPL: 

```
$ docker run -it --rm \
    -v ~/.aws:/home/hadoop/.aws \
    -e AWS_PROFILE=$PROFILE_NAME \
    --name glue5_pyspark \
    public.ecr.aws/glue/aws-glue-libs:5 \
    pyspark
```

 Você visualizará a seguinte saída: 

```
Python 3.11.6 (main, Jan  9 2025, 00:00:00) [GCC 11.4.1 20230605 (Red Hat 11.4.1-2)] on linux
Type "help", "copyright", "credits" or "license" for more information.
Setting default log level to "WARN".
To adjust logging level use sc.setLogLevel(newLevel). For SparkR, use setLogLevel(newLevel).
Welcome to
      ____              __
     / __/__  ___ _____/ /__
    _\ \/ _ \/ _ `/ __/  '_/
   /__ / .__/\_,_/_/ /_/\_\   version 3.5.4-amzn-0
      /_/

Using Python version 3.11.6 (main, Jan  9 2025 00:00:00)
Spark context Web UI available at None
Spark context available as 'sc' (master = local[*], app id = local-1740643079929).
SparkSession available as 'spark'.
>>>
```

 Com este shell REPL, é possível programar e testar de forma interativa. 

### Pytest
<a name="develop-local-docker-image-setup-run-pytest"></a>

 Para a execução de teste de unidade, recomenda-se o uso do `pytest` para scripts de trabalhos do Spark no AWS Glue. Execute os comandos a seguir para preparação. 

```
$ WORKSPACE_LOCATION=/local_path_to_workspace
$ SCRIPT_FILE_NAME=sample.py
$ UNIT_TEST_FILE_NAME=test_sample.py
$ mkdir -p ${WORKSPACE_LOCATION}/tests
$ vim ${WORKSPACE_LOCATION}/tests/${UNIT_TEST_FILE_NAME}
```

 Use o seguinte comando para executar o `pytest` por meio do `docker run`: 

```
$ docker run -i --rm \
    -v ~/.aws:/home/hadoop/.aws \
    -v $WORKSPACE_LOCATION:/home/hadoop/workspace/ \
    --workdir /home/hadoop/workspace \
    -e AWS_PROFILE=$PROFILE_NAME \
    --name glue5_pytest \
    public.ecr.aws/glue/aws-glue-libs:5 \
    -c "python3 -m pytest --disable-warnings"
```

 Após a execução dos testes de unidades pelo `pytest`, sua saída será semelhante a isto: 

```
============================= test session starts ==============================
platform linux -- Python 3.11.6, pytest-8.3.4, pluggy-1.5.0
rootdir: /home/hadoop/workspace
plugins: integration-mark-0.2.0
collected 1 item

tests/test_sample.py .                                                   [100%]

======================== 1 passed, 1 warning in 34.28s =========================
```

### Configuração do contêiner para utilizar o Visual Studio Code
<a name="develop-local-docker-image-setup-visual-studio"></a>

 Para configurar o contêiner com o Visual Studio Code, conclua as seguintes etapas: 

1. Instale o Visual Studio Code.

1. Instalar o [Python](https://marketplace.visualstudio.com/items?itemName=ms-python.python).

1. Instale [Visual Studio Code Remote - Containers](https://code.visualstudio.com/docs/remote/containers)

1. Abra a pasta de espaço de trabalho no Visual Studio Code.

1. Pressione `Ctrl+Shift+P` (no Windows ou no Linux) ou `Cmd+Shift+P` (no Mac).

1. Tipo: `Preferences: Open Workspace Settings (JSON)`.

1. Pressione Enter.

1. Cole o seguinte JSON e salve-o.

   ```
   {
       "python.defaultInterpreterPath": "/usr/bin/python3.11",
       "python.analysis.extraPaths": [
           "/usr/lib/spark/python/lib/py4j-0.10.9.7-src.zip:/usr/lib/spark/python/:/usr/lib/spark/python/lib/",
       ]
   }
   ```

 Para configurar o contêiner: 

1. Execute o contêiner do Docker.

   ```
   $ docker run -it --rm \
       -v ~/.aws:/home/hadoop/.aws \
       -v $WORKSPACE_LOCATION:/home/hadoop/workspace/ \
       -e AWS_PROFILE=$PROFILE_NAME \
       --name glue5_pyspark \
       public.ecr.aws/glue/aws-glue-libs:5 \
       pyspark
   ```

1. Inicie o Visual Studio Code.

1.  Escolha **Remote Explorer** (Explorador remoto) no menu esquerdo e escolha `amazon/aws-glue-libs:glue_libs_4.0.0_image_01`. 

1.  Clique com o botão direito do mouse e escolha **Anexar na janela atual**.   
![\[Ao clicar com o botão direito do mouse, uma janela com a opção “Anexar na janela atual” é apresentada.\]](http://docs.aws.amazon.com/pt_br/glue/latest/dg/images/vs-code-other-containers.png)

1.  Se a caixa de diálogo apresentada a seguir aparecer, escolha **Entendi**.   
![\[Será exibida uma janela de aviso com a mensagem: “Realizar a anexação a um contêiner pode executar u código arbitrário”.\]](http://docs.aws.amazon.com/pt_br/glue/latest/dg/images/vs-code-warning-got-it.png)

1. Abra o `/home/handoop/workspace/`.  
![\[Uma janela com um menu suspenso, na qual a opção “espaço de trabalho” está destacada.\]](http://docs.aws.amazon.com/pt_br/glue/latest/dg/images/vs-code-open-workspace.png)

1.  Crie um script do PySpark do AWS Glue e escolha **Executar**. 

   Você verá a execução do script com sucesso.  
![\[A execução do script com sucesso.\]](http://docs.aws.amazon.com/pt_br/glue/latest/dg/images/vs-code-run-successful-script.png)

## Alterações entre a imagem do Docker do AWS Glue 4.0 e do AWS Glue 5.0
<a name="develop-local-docker-glue4-glue5-changes"></a>

 As principais alterações entre a imagem do Docker do AWS Glue 4.0 e do AWS Glue 5.0 são: 
+  No AWS Glue 5.0, existe uma única imagem de contêiner para trabalhos tanto em lote quanto em streaming. Isso representa uma diferença em relação à versão Glue 4.0, que usava imagens distintas para cada tipo de trabalho. 
+  No AWS Glue 5.0, o nome de usuário padrão do contêiner é `hadoop`. No AWS Glue 4.0, o nome de usuário padrão era `glue_user`. 
+  No AWS Glue 5.0, várias bibliotecas adicionais, incluindo JupyterLab e Livy, foram removidas da imagem. No entanto, é possível instalá-las manualmente. 
+  No AWS Glue 5.0, todas as bibliotecas Iceberg, Hudi e Delta são carregadas previamente por padrão, e a variável de ambiente `DATALAKE_FORMATS` não é mais requerida. Antes do AWS Glue 4.0, a variável de ambiente `DATALAKE_FORMATS` era usada para especificar quais formatos de tabela específicos deveriam ser carregados. 

 A lista apresentada acima se refere especificamente à imagem do Docker. Para obter mais informações sobre as atualizações do AWS Glue 5.0, consulte os seguintes artigos: [Introducing AWS Glue 5.0 for Apache Spark ](https://aws.amazon.com/blogs/big-data/introducing-aws-glue-5-0-for-apache-spark/) e [Migrar o AWS Glue para trabalhos do Spark para o AWS Glue versão 5.0](https://docs.aws.amazon.com/glue/latest/dg/migrating-version-50.html). 

## Considerações
<a name="develop-local-docker-considerations"></a>

 É importante lembrar que os recursos apresentados a seguir não são compatíveis quando a imagem do contêiner do AWS Glue é utilizada para desenvolver scripts de trabalhos localmente. 
+  [Marcadores de trabalho](https://docs.aws.amazon.com/glue/latest/dg/monitor-continuations.html) 
+  Gravador em Parquet do AWS Glue ([Uso do formato Parquet no AWS Glue](https://docs.aws.amazon.com/glue/latest/dg/aws-glue-programming-etl-format-parquet-home.html)) 
+  [ Transformação FillMissingValues ](https://docs.aws.amazon.com/glue/latest/dg/aws-glue-api-crawler-pyspark-transforms-fillmissingvalues.html) 
+  [Transformação FindMatches](https://docs.aws.amazon.com/glue/latest/dg/machine-learning.html#find-matches-transform) 
+  [ Leitor de SIMD vetorizado para CSV ](https://docs.aws.amazon.com/glue/latest/dg/aws-glue-programming-etl-format-csv-home.html#aws-glue-programming-etl-format-simd-csv-reader) 
+  A propriedade [customJdbcDriverS3Path](https://docs.aws.amazon.com/glue/latest/dg/aws-glue-programming-etl-connect.html#aws-glue-programming-etl-connect-jdbc) para carregar o driver JDBC do caminho do Amazon S3 
+  [AWS Glue Data Quality](https://docs.aws.amazon.com/glue/latest/dg/glue-data-quality.html) 
+  [Detecção de dados sensíveis](https://docs.aws.amazon.com/glue/latest/dg/detect-PII.html) 
+  Distribuição de credenciais com base em permissões do AWS Lake Formation 

## Apêndice: adição de drivers JDBC e bibliotecas do Java
<a name="develop-local-docker-image-appendix"></a>

 Para adicionar um driver JDBC que não esteja disponível no contêiner, você pode criar um novo diretório no seu espaço de trabalho com os arquivos em JAR necessários e montar esse diretório em `/opt/spark/jars/` no comando “docker run”. Os arquivos em JAR encontrados em `/opt/spark/jars/` dentro do contêiner são automaticamente adicionados ao Spark Classpath e estarão disponíveis para uso durante a execução do trabalho. 

 Por exemplo, use o comando “docker run” apresentado a seguir para adicionar os arquivos em JARs do driver JDBC ao shell REPL do PySpark. 

```
docker run -it --rm \
    -v ~/.aws:/home/hadoop/.aws \
    -v $WORKSPACE_LOCATION:/home/hadoop/workspace/ \
    -v $WORKSPACE_LOCATION/jars/:/opt/spark/jars/ \
    --workdir /home/hadoop/workspace \
    -e AWS_PROFILE=$PROFILE_NAME \
    --name glue5_jdbc \
    public.ecr.aws/glue/aws-glue-libs:5 \
    pyspark
```

 Conforme mencionado em **Considerações**, a opção de conexão `customJdbcDriverS3Path` não é compatível com a importação de um driver JDBC personalizado usando o Amazon S3 nas imagens de contêiner do AWS Glue. 