

Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.

# Tutorial: configura un notebook Jupyter JupyterLab per testare ed eseguire il debug degli script ETL
<a name="dev-endpoint-tutorial-local-jupyter"></a>

In questo tutorial, colleghi un notebook Jupyter in JupyterLab esecuzione sul tuo computer locale a un endpoint di sviluppo. Questa operazione serve per poter eseguire, eseguire il debug e testare in modo interattivo l'estrazione, la trasformazione e il caricamento di script (ETL) AWS Glue prima di distribuirli. Questo tutorial usa l'inoltro della porta Secure Shell (SSH) per connettere il computer locale a un endpoint di sviluppo AWS Glue. Per ulteriori informazioni, consulta [Inoltro della porta](https://en.wikipedia.org/wiki/Port_forwarding) in Wikipedia.

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

È possibile eseguire l'installazione JupyterLab utilizzando `conda` o`pip`. `conda`è un sistema di gestione dei pacchetti open source e un sistema di gestione dell'ambiente che funziona su Windows, macOS e Linux. `pip`è l'installatore di pacchetti per Python.

Se esegui l'installazione su macOS, devi avere Xcode installato prima di poter installare Sparkmagic.

1. Install JupyterLab, Sparkmagic e le relative estensioni.

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

1. Controlla la directory `sparkmagic` da `Location`. 

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

1. Cambia la tua directory con quella restituita per`Location`, e installa i kernel per 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. Scarica un esempio di file `config`. 

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

   In questo file di configurazione, è possibile configurare parametri relativi a Spark come `driverMemory` e `executorCores`.

## Fase 2: Inizia JupyterLab
<a name="dev-endpoint-tutorial-local-jupyter-start"></a>

All'avvio JupyterLab, il browser Web predefinito viene aperto automaticamente e `http://localhost:8888/lab/workspaces/{workspace_name}` viene visualizzato l'URL.

```
$ jupyter lab
```

## Fase 3: avviare l'inoltro alla porta SSH per la connessione all'endpoint di sviluppo
<a name="dev-endpoint-tutorial-local-jupyter-port-forward"></a>

Usa quindi l'inoltro porta locale SSH per inoltrare una porta locale (qui, `8998`) alla destinazione remota definita da AWS Glue (`169.254.76.1:8998`). 

1. Apri una finestra separata del terminale che ti consente di accedere a SSH. Su Microsoft Windows, puoi utilizzare la shell BASH fornita da [Git for Windows](https://git-scm.com/downloads) o installare [Cygwin](https://www.cygwin.com/).

1. Esegui il comando SSH seguente, modificato come segue:
   + Sostituisci `private-key-file-path` con un percorso al file `.pem` contenente la chiave privata corrispondente alla chiave pubblica utilizzata per creare l'endpoint di sviluppo.
   + Se stai inoltrando una porta diversa da `8998`, sostituisci `8998` con il numero di porta che stai effettivamente usando in locale. L'indirizzo `169.254.76.1:8998` è la porta remota e non è modificata da te.
   + Sostituisci `dev-endpoint-public-dns` con l'indirizzo DNS pubblico del tuo endpoint di sviluppo. Per trovare questo indirizzo, passa all'endpoint di sviluppo nella console AWS Glue, scegli il nome e copia il valore di **Public address (Indirizzo pubblico)** elencato nella pagina **Endpoint details (Dettagli endpoint)**.

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

   È probabile che vedrai un messaggio di avviso, come il seguente:

   ```
   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)?
   ```

   Entra **yes** e lascia aperta la finestra del terminale durante l'uso JupyterLab. 

1. Verifica che l'inoltro porta SSH funzioni correttamente con l'endpoint di sviluppo.

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

## Fase 4: eseguire un semplice frammento di script in un paragrafo del notebook
<a name="dev-endpoint-tutorial-local-jupyter-list-schema"></a>

Ora il notebook in JupyterLab dovrebbe funzionare con il tuo endpoint di sviluppo. Digita il frammento di script seguente nel notebook ed eseguilo.

1. Verifica che Spark sia in esecuzione correttamente. Il comando seguente indica a Spark di calcolare `1` e quindi stampare il valore.

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

1. Verifica se AWS Glue Data Catalog l'integrazione funziona. Il comando seguente elenca le tabelle nel catalogo dati.

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

1. Verifica che un frammento di script semplice che utilizza le librerie AWS Glue funzioni.

   Lo script seguente utilizza i metadati della tabella `persons_json` in AWS Glue Data Catalog per creare un`DynamicFrame`dai dati di esempio. Quindi, verranno stampati il conteggio item e lo schema di questi dati. 

```
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()
```

L'output dello script è il seguente.

```
 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
```

## Risoluzione dei problemi
<a name="dev-endpoint-tutorial-local-jupyter-troubleshooting"></a>
+ Durante l'installazione di JupyterLab, se il computer è protetto da un proxy o firewall aziendale, è possibile che si verifichino errori HTTP e SSL dovuti ai profili di sicurezza personalizzati gestiti dai reparti IT aziendali.

  Di seguito è riportato un esempio di errore tipico che si verifica quando `conda` non è in grado di connettersi ai propri repository:

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

  Ciò potrebbe accadere perché la tua azienda può bloccare le connessioni a repository ampiamente utilizzati in Python JavaScript e nelle community. Per ulteriori informazioni, consulta [Problemi di installazione](https://jupyterlab.readthedocs.io/en/stable/getting_started/installation.html#installation-problems) sul JupyterLab sito Web.
+ Se si verifica un errore di *connessione rifiutata* quando provi a connetterti all'endpoint di sviluppo, potresti utilizzare un endpoint di sviluppo obsoleto. Prova a creare un nuovo endpoint di sviluppo e a riconnetterti.