

# Tutorial: configurar um caderno Jupyter no JupyterLab para testar e depurar scripts de ETL
<a name="dev-endpoint-tutorial-local-jupyter"></a>

Neste tutorial, você conectará um caderno Jupyter no JupyterLab em execução em sua máquina local a um endpoint de desenvolvimento. Você o faz para que possa executar, depurar e testar interativamente scripts de extração, transformação e carregamento (ETL) do AWS Glue antes de implantá-los. Este tutorial usa o redirecionamento de portas Secure Shell (SSH) para conectar sua máquina local a um endpoint de desenvolvimento do AWS Glue. Para obter mais informações, consulte [Redirecionamento de portas](https://en.wikipedia.org/wiki/Port_forwarding) na Wikipédia.

## Etapa 1: Instalar o JupyterLab e o Sparkmagic
<a name="dev-endpoint-tutorial-local-jupyter-install"></a>

Você pode instalar o JupyterLab usando o `conda` ou `pip`. O `conda` é um sistema de gerenciamento de pacotes e de ambientes de código aberto que é executado no Windows, macOS e Linux. Já o `pip` é o instalador de pacotes para Python.

Se estiver instalando no macOS, é necessário ter o Xcode instalado antes de instalar o Sparkmagic.

1. Instale o JupyterLab, o Sparkmagic e as extensões relacionadas.

   ```
   $ conda install -c conda-forge jupyterlab
   $ pip install sparkmagic
   $ jupyter nbextension enable --py --sys-prefix widgetsnbextension
   $ jupyter labextension install @jupyter-widgets/jupyterlab-manager
   ```

1. Verifique o diretório `sparkmagic` de `Location`. 

   ```
   $ pip show sparkmagic | grep Location
   Location: /Users/username/.pyenv/versions/anaconda3-5.3.1/lib/python3.7/site-packages
   ```

1. Altere seu diretório para o mesmo retornado para `Location` e instale os kernels para Scala e PySpark.

   ```
   $ cd /Users/username/.pyenv/versions/anaconda3-5.3.1/lib/python3.7/site-packages
   $ jupyter-kernelspec install sparkmagic/kernels/sparkkernel
   $ jupyter-kernelspec install sparkmagic/kernels/pysparkkernel
   ```

1. Faça download de um arquivo de amostra `config`. 

   ```
   $ curl -o ~/.sparkmagic/config.json https://raw.githubusercontent.com/jupyter-incubator/sparkmagic/master/sparkmagic/example_config.json
   ```

   Neste arquivo de configuração, você pode configurar parâmetros relacionados ao Spark, como `driverMemory` e `executorCores`.

## Etapa 2: Iniciar o JupyterLab
<a name="dev-endpoint-tutorial-local-jupyter-start"></a>

Quando você inicia o JupyterLab, seu navegador da Web padrão é aberto automaticamente e o URL `http://localhost:8888/lab/workspaces/{workspace_name}` é exibido.

```
$ jupyter lab
```

## Etapa 3: iniciar o redirecionamento de porta SSH para se conectar ao endpoint de desenvolvimento
<a name="dev-endpoint-tutorial-local-jupyter-port-forward"></a>

Em seguida, use o encaminhamento de porta local SSH para encaminhar uma porta local (aqui, `8998`) ao destino remoto definido por AWS Glue (`169.254.76.1:8998`). 

1. Abra uma janela do terminal separada que conceda acesso ao SSH. No Microsoft Windows, você pode usar o shell BASH fornecido pelo [Git for Windows](https://git-scm.com/downloads) (Git para Windows) ou instalar o [Cygwin](https://www.cygwin.com/).

1. Execute o seguinte comando SSH, modificado da seguinte forma:
   + Substitua `private-key-file-path` pelo caminho do arquivo `.pem` que contém a chave privada correspondente à chave pública que você usou para criar seu endpoint de desenvolvimento.
   + Se você estiver redirecionando uma porta diferente de `8998`, substitua `8998` pelo número da porta que está de fato usando localmente. O endereço `169.254.76.1:8998` é a porta remota e não é alterada por você.
   + Substitua `dev-endpoint-public-dns` pelo endereço DNS público do seu endpoint de desenvolvimento. Para encontrar esse endereço, navegue até seu endpoint de desenvolvimento no console do AWS Glue, escolha o nome e copie o valor de **Public address** (Endereço público) listado na página **Endpoint details** (Detalhes do endpoint).

   ```
   ssh -i private-key-file-path -NTL 8998:169.254.76.1:8998 glue@dev-endpoint-public-dns
   ```

   Você provavelmente verá uma mensagem de aviso semelhante à seguinte:

   ```
   The authenticity of host 'ec2-xx-xxx-xxx-xx.us-west-2.compute.amazonaws.com (xx.xxx.xxx.xx)'
   can't be established.  ECDSA key fingerprint is SHA256:4e97875Brt+1wKzRko+JflSnp21X7aTP3BcFnHYLEts.
   Are you sure you want to continue connecting (yes/no)?
   ```

   Digite **yes** (sim) e deixe aberta a janela do terminal enquanto utiliza o JupyterLab. 

1. Verifique se o redirecionamento de porta SSH está funcionando corretamente com o endpoint de desenvolvimento.

   ```
   $ curl localhost:8998/sessions
   {"from":0,"total":0,"sessions":[]}
   ```

## Etapa 4: executar um fragmento de script simples em um parágrafo do caderno
<a name="dev-endpoint-tutorial-local-jupyter-list-schema"></a>

Agora seu caderno no JupyterLab deve funcionar com seu endpoint de desenvolvimento. Digite o seguinte fragmento de script no seu caderno e execute-o.

1. Verifique se o Spark está sendo executado com êxito. O comando a seguir instrui o Spark a calcular `1` e, em seguida, imprimir o valor.

   ```
   spark.sql("select 1").show()
   ```

1. Verifique se a integração com o AWS Glue Data Catalog está funcionando. O comando a seguir lista as tabelas do Data Catalog.

   ```
   spark.sql("show tables").show()
   ```

1. Verifique se um fragmento de script simples que usa as bibliotecas do AWS Glue funciona.

   O script a seguir usa os metadados da tabela `persons_json` no AWS Glue Data Catalog para criar um `DynamicFrame` dos seus dados de exemplo. Em seguida, ele imprime a contagem de itens e o esquema desses dados. 

```
import sys
from pyspark.context import SparkContext
from awsglue.context import GlueContext
 
# Create a Glue context
glueContext = GlueContext(SparkContext.getOrCreate())
 
# Create a DynamicFrame using the 'persons_json' table
persons_DyF = glueContext.create_dynamic_frame.from_catalog(database="legislators", table_name="persons_json")
 
# Print out information about *this* data
print("Count:  ", persons_DyF.count())
persons_DyF.printSchema()
```

O resultado do script é o seguinte:

```
 Count:  1961
 root
 |-- family_name: string
 |-- name: string
 |-- links: array
 |    |-- element: struct
 |    |    |-- note: string
 |    |    |-- url: string
 |-- gender: string
 |-- image: string
 |-- identifiers: array
 |    |-- element: struct
 |    |    |-- scheme: string
 |    |    |-- identifier: string
 |-- other_names: array
 |    |-- element: struct
 |    |    |-- note: string
 |    |    |-- name: string
 |    |    |-- lang: string
 |-- sort_name: string
 |-- images: array
 |    |-- element: struct
 |    |    |-- url: string
 |-- given_name: string
 |-- birth_date: string
 |-- id: string
 |-- contact_details: array
 |    |-- element: struct
 |    |    |-- type: string
 |    |    |-- value: string
 |-- death_date: string
```

## Solução de problemas
<a name="dev-endpoint-tutorial-local-jupyter-troubleshooting"></a>
+ Durante a instalação do JupyterLab, se o seu computador estiver atrás de um proxy corporativo ou firewall, você poderá encontrar erros de HTTP e SSL devido a perfis de segurança personalizados gerenciados por departamentos de TI corporativos.

  Segue-se um exemplo de um erro típico que ocorre quando `conda` não consegue se conectar aos seus próprios repositórios:

  ```
  CondaHTTPError: HTTP 000 CONNECTION FAILED for url <https://repo.anaconda.com/pkgs/main/win-64/current_repodata.json>
  ```

  Isso pode acontecer porque sua empresa pode bloquear conexões com repositórios amplamente utilizados em comunidades de Python e JavaScript. Para obter mais informações, consulte [Installation Problems](https://jupyterlab.readthedocs.io/en/stable/getting_started/installation.html#installation-problems) (Problemas de instalação) no site do JupyterLab.
+ Se encontrar um erro de *conexão recusada* ao tentar se conectar ao seu endpoint de desenvolvimento, pode ser que você esteja usando um endpoint de desenvolvimento desatualizado. Tente criar um novo endpoint de desenvolvimento e se reconectar.