Migrare i programmi Apache Spark a AWS Glue - AWSGlue

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à.

Migrare i programmi Apache Spark a AWS Glue

Apache Spark è una piattaforma open source per carichi di lavoro di calcolo distribuiti eseguiti su set di dati di grandi dimensioni. AWS Glue sfrutta le capacità di Spark per fornire un'esperienza ottimizzata per ETL. È possibile migrare i programmi Spark a AWS Glue per usufruire dei vantaggi delle nostre funzionalità. AWS Glue fornisce gli stessi miglioramenti delle prestazioni che ci si aspetterebbe da Apache Spark su Amazon EMR.

Esegui codice Spark

Il codice nativo di Spark può essere eseguito in ambiente AWS Glue così com’è. Gli script sono spesso sviluppati modificando iterativamente un pezzo di codice, un flusso di lavoro adatto per una sessione interattiva. Tuttavia, il codice esistente è più adatto per l'esecuzione in un processo AWS Glue, che consente di pianificare e ottenere costantemente registri e parametri per ogni esecuzione di script. Puoi caricare e modificare uno script esistente tramite la console.

  1. Acquisisci la fonte del tuo script. Per questo esempio, si utilizzerà uno script di esempio dal repository Apache Spark. Esempio di Binarizer

  2. Nella console AWS Glue, espandi il riquadro di navigazione a sinistra e seleziona ETL >Jobs (processi)

    Nel panello Create job (crea processo), seleziona Spark script editor (editor di script di Spark). Apparirà una sezione Options (opzioni). Sotto Options (opzioni) , seleziona Upload and edit an existing script (carica e modifica uno script esistente).

    Apparirà una sezione File upload (caricamento file). Sotto a File upload (caricamento file), fai clic su Choose file (seleziona file). Apparirà il tuo selettore di file di sistema. Accedi al percorso in cui hai effettuato il salvataggio di binarizer_example.py, selezionalo e conferma della selezione.

    Verrà visualizzato un pulsante Create (crea) nell’intestazione del pannello Create job (crea processo). Fai clic sul pulsante.

    La pagina dei processi di AWS Glue Studio con il pannello dell’editor di script Spark selezionato.
  3. Il tuo browser accederà all'editor di script. Nell'intestazione, fai clic sul sulla scheda Job details (dettagli processo). Imposta il Nome e il Ruolo IAM. Per indicazioni sui ruoli AWS Glue IAM, consulta la pagina Configurazione delle autorizzazioni IAM per AWS Glue.

    Facoltativo: imposta Requested number of workers (numero di worker richiesti) su 2 e Number of retries (numero di tentativi) su 1. Queste opzioni sono utili quando si eseguono lavori di produzione, ma la loro riduzione semplificherà la tua esperienza durante il test di una funzionalità.

    Nella barra del titolo, fai clic su Save (salva), quindi Run (esegui)

    La pagina dei dettagli del processo con le opzioni impostate come indicato.
  4. Passa alla scheda Runs (esecuzioni). Vedrai un pannello corrispondente all’esecuzione del processo. Attendi alcuni minuti e la pagina dovrebbe essere aggiornata automaticamente per mostrare Succeeded (elaborazione riuscita) sotto a Run status (stato dell’esecuzione).

    La pagina delle esecuzioni del processo con un'esecuzione riuscita.
  5. Dovrai esaminare l’output per confermare che lo script Spark è stato eseguito come previsto. Questo script di esempio di Apache Spark dovrebbe scrivere una stringa nel flusso di output. Puoi trovarlo navigando su Output logs (registri di output) sotto a Cloudwatch logs(registri di Cloudwatch) nel pannello dell'esecuzione del processo riuscito. Ricorda l'id di esecuzione del processo, un id generato sotto l’etichetta Id che inizia con jr_.

    Si aprirà la console di CloudWatch, impostata per visualizzare i contenuti del gruppo di log AWS Glue di default /aws-glue/jobs/output, filtrato in base al contenuto dei flussi di log per l'id di esecuzione del processo. Ogni worker avrà generato un flusso di log, mostrato in righe sotto Log streams (Flussi di log). Un worker dovrebbe aver eseguito il codice richiesto. Sarà necessario aprire tutti i flussi di log per identificare il worker corretto. Una volta trovato il worker giusto, dovresti vedere l'output dello script, come mostrato nell'immagine seguente:

    La pagina della console di CloudWatch con l'output del programma Spark.

Procedure comuni necessarie per la migrazione dei programmi Spark

Convalida il supporto della versione di Spark

La versione di AWS Glue determina le versioni di Apache Spark e Python disponibili per il processo AWS Glue. Puoi trovare le nostre versioni AWS Glue e cosa supportano qui AWS Glue versioni. Potrebbe essere necessario aggiornare il programma Spark per renderlo compatibile con una versione più recente di Spark per accedere a determinate caratteristiche di AWS Glue.

Includi librerie di terze parti

Molti programmi Spark esistenti avranno dipendenze, sia da artefatti privati che pubblici. AWS Glue supporta le dipendenze in stile JAR per processi Scala così come le dipendenze Wheel e pure-Python per i processi Python.

Python : per informazioni sulle dipendenze Python, consulta Usare le librerie Python con Glue AWS

Le dipendenze Python comuni sono fornite nell'ambiente AWS Glue, incluso la libreria Pandas. Le dipendenze sono incluse in AWS Glue versione 2.0+. Per ulteriori informazioni sui moduli disponibili, consulta Moduli Python già forniti in Glue AWS. Se è necessario fornire un processo con una versione diversa da quella di una dipendenza inclusa per impostazione predefinita, è possibile utilizzare --additional-python-modules. Per informazioni su questi argomenti, consulta Utilizzo dei parametri del lavoro nei lavori AWS Glue.

È possibile fornire dipendenze Python aggiuntive con l’argomento del processo --extra-py-files. Se stai eseguendo la migrazione di un processo da un programma Spark, questo parametro rappresenta una buona opzione perché è funzionalmente equivalente al flag --py-files in PySpark ed è soggetto alle stesse limitazioni. Per ulteriori informazioni sul parametro --extra-py-files, consulta Inclusione di file Python con funzionalità native PySpark .

Per i nuovi processi, è possibile gestire le dipendenze Python con l’argomento del processo --additional-python-modules. L'utilizzo di questo argomento consente un'esperienza di gestione delle dipendenze più approfondita. Questo parametro supporta le dipendenze dello stile Wheel, incluse quelle con associazioni di codice native compatibili con Amazon Linux 2.

Scala

È possibile fornire dipendenze Scala aggiuntive con l’argomento del processo --extra-jars. Le dipendenze devono essere ospitate in Amazon S3 e il valore dell'argomento deve essere un elenco delimitato da virgole di percorsi Amazon S3 senza spazi. Potresti trovare più facile gestire la configurazione riaggregando le dipendenze prima di ospitarle e configurarle. AWS Glue Le dipendenze JAR contengono bytecode Java, che può essere generato da qualsiasi linguaggio JVM. È possibile utilizzare altri linguaggi JVM, come Java, per scrivere dipendenze personalizzate.

Gestisci le credenziali dell'origine dei dati.

I programmi Spark esistenti possono avere una configurazione complessa o personalizzata per estrarre dati dalle loro origini dati. I flussi di autenticazione delle origini dati comuni sono supportati da connessioni AWS Glue. Per ulteriori informazioni sulle connessioni AWS Glue, consulta Connessione ai dati.

Le connessioni AWS Glue facilitano la connessione del processo a una varietà di tipi di archivi di dati in due modi principali: attraverso chiamate di metodo alle nostre librerie e configurando la Connessione di rete aggiuntiva nella console AWS. Puoi anche chiamare l’SDK AWS dall'interno del processo per recuperare informazioni da una connessione.

Chiamate di metodo – Le connessioni AWS Glue sono strettamente integrate con il catalogo dati AWS Glue, un servizio che consente di gestire le informazioni sui set di dati e sui metodi disponibili per interagire con le connessioni AWS Glue che li riflettono. Se si dispone di una configurazione di autenticazione esistente che si desidera riutilizzare, per le connessioni JDBC, è possibile accedere alla configurazione della connessione AWS Glue tramite il metodo extract_jdbc_conf su GlueContext. Per ulteriori informazioni, consulta extract_jdbc_conf.

Configurazione della console - I processi AWS Glue utilizzano le connessioni AWS Glue associate per configurare le connessioni alle sottoreti Amazon VPC. Se gestisci i materiali di sicurezza, potrebbe rendersi necessario fornire una connessione di rete aggiuntiva di tipo NETWORK nella console AWS per configurare il routing. Per ulteriori informazioni sull’API di connessione AWS Glue, consulta API Connessioni.

Se i tuoi programmi Spark hanno un flusso di autenticazione personalizzato o non comune, potresti dover gestire i materiali di sicurezza in modo pratico. Se le connessioni AWS Glue non sembrano adatte, puoi ospitare in modo sicuro i materiali di sicurezza in Secrets Manager e accedervi tramite boto3 o SDK AWS, forniti nel processo.

Configurazione di Apache Spark

Le migrazioni complesse spesso alterano la configurazione di Spark per adattarsi ai loro carichi di lavoro. Le versioni moderne di Apache Spark consentono di impostare la configurazione del runtime con SparkSession.AWS Glue I processi 3.0+ vengono forniti a SparkSession, che può essere modificato per impostare la configurazione del runtime. Configurazione di Apache Spark. Regolare Spark è un’operazione complessa e AWS Glue non garantisce il supporto per l'impostazione di tutte le configurazioni necessarie. Se la migrazione richiede una configurazione sostanziale a livello Spark, contatta il supporto.

Impostazione della configurazione personalizzata

I programmi Spark migrati possono essere progettati per accettare una configurazione personalizzata. AWS Glue consente di impostare la configurazione a livello di processo ed esecuzione del processo, tramite gli argomenti. Per informazioni sugli argomenti di processo, consulta Utilizzo dei parametri del lavoro nei lavori AWS Glue. Puoi accedere agli argomenti del processo nel contesto tramite le nostre librerie. AWS Glue fornisce una funzione utility per fornire una vista coerente tra gli argomenti impostati sul processo e gli argomenti impostati nell’esecuzione del processo. Consulta Accesso ai parametri utilizzando getResolvedOptions in Python e API Scala GlueArgParser di AWS Glue in Scala.

Migrazione del codice Java

Come spiegato in Includi librerie di terze parti, le dipendenze possono contenere classi generate da linguaggi JVM, come Java o Scala. Le dipendenze possono includere un metodo main. Puoi utilizzare un metodo main in una dipendenza come punto di ingresso per un processo Scala AWS Glue. Questo permette di scrivere il proprio metodo main in Java o riutilizzare un metodo main elaborato in pacchetti secondo gli standard della tua libreria.

Per utilizzare un metodo main da una dipendenza, esegui le seguenti operazioni: cancella il contenuto del riquadro di modifica fornendo il valore predefinito dell’oggetto GlueApp. Fornisci il nome completo di una classe in una dipendenza come argomento di processo con la chiave--class. A questo punto dovresti essere in grado di attivare un’esecuzione del processo.

Non è possibile configurare l'ordine o la struttura degli argomenti che AWS Glue passa al metodo main. Se il codice esistente deve leggere la configurazione impostata in AWS Glue, questo probabilmente causerà incompatibilità con il codice precedente. Se utilizzi getResolvedOptions, non avrai nemmeno un luogo ideale per chiamare questo metodo. Prendi in considerazione la possibilità di invocare la tua dipendenza direttamente da un metodo principale generato da AWS Glue. Il seguente ETL AWS Glue mostra un esempio di ciò.

import com.amazonaws.services.glue.util.GlueArgParser object GlueApp { def main(sysArgs: Array[String]) { val args = GlueArgParser.getResolvedOptions(sysArgs, Seq("JOB_NAME").toArray) // Invoke static method from JAR. Pass some sample arguments as a String[], one defined inline and one taken from the job arguments, using getResolvedOptions com.mycompany.myproject.MyClass.myStaticPublicMethod(Array("string parameter1", args("JOB_NAME"))) // Alternatively, invoke a non-static public method. (new com.mycompany.myproject.MyClass).someMethod() } }