Lavorare con Apache Iceberg in Amazon EMR - AWS Linee guida prescrittive

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

Lavorare con Apache Iceberg in Amazon EMR

Amazon EMR fornisce elaborazione dati su scala petabyte, analisi interattive e apprendimento automatico nel cloud utilizzando framework open source come Apache Spark, Apache Hive, Flink e Trino.

Nota

Questa guida utilizza Apache Spark per esempi.

Amazon EMR supporta diverse opzioni di distribuzione: Amazon EMR su Amazon EC2, Amazon EMR su Amazon EKS, Amazon EMR Serverless e Amazon EMR su. AWS Outposts Per scegliere un'opzione di distribuzione per il tuo carico di lavoro, consulta le domande frequenti su Amazon EMR.

Compatibilità tra versioni e funzionalità

La versione 6.5.0 e successive di Amazon EMR supportano Apache Iceberg in modo nativo. Per un elenco delle versioni di Iceberg supportate per ogni versione di Amazon EMR, consulta la cronologia delle versioni di Iceberg nella documentazione di Amazon EMR. Consulta anche le considerazioni e le limitazioni relative all'utilizzo di Iceberg su Amazon EMR per vedere quali funzionalità di Iceberg sono supportate in Amazon EMR su diversi framework.

Ti consigliamo di utilizzare la versione più recente di Amazon EMR per sfruttare l'ultima versione supportata di Iceberg. Gli esempi di codice e le configurazioni in questa sezione presuppongono che tu stia utilizzando la release emr-6.9.0 di Amazon EMR.

Creazione di un cluster Amazon EMR con Iceberg

Per creare un cluster Amazon EMR su Amazon EC2 con Iceberg installato, segui le istruzioni nella documentazione di Amazon EMR. 

In particolare, il cluster deve essere configurato con la seguente classificazione:

[{ "Classification": "iceberg-defaults", "Properties": { "iceberg.enabled": "true" } }]

Puoi anche scegliere di utilizzare Amazon EMR Serverless o Amazon EMR su Amazon EKS come opzioni di distribuzione per i tuoi carichi di lavoro Iceberg, a partire da Amazon EMR 6.6.0.

Sviluppo di applicazioni Iceberg in Amazon EMR

Per sviluppare il codice Spark per le tue applicazioni Iceberg, puoi utilizzare Amazon EMR Studio, un ambiente di sviluppo integrato (IDE) basato sul web per notebook Jupyter completamente gestiti eseguiti su cluster Amazon EMR. 

Utilizzo dei notebook Amazon EMR Studio

Puoi sviluppare in modo interattivo applicazioni Spark nei notebook Amazon EMR Studio Workspace e connetterli ai tuoi cluster Amazon EMR su cluster Amazon EC2 o Amazon EMR su endpoint gestiti Amazon EKS. Consulta Servizio AWS la documentazione per istruzioni sulla configurazione di EMR Studio per Amazon EMR su Amazon EC2 e Amazon EMR su Amazon EKS.

Per utilizzare Iceberg in EMR Studio, segui questi passaggi: 

  1. Avvia un cluster Amazon EMR con Iceberg abilitato, come indicato in Utilizzare un cluster con Iceberg installato. 

  2. Configura uno studio EMR. Per istruzioni, consulta Configurare Amazon EMR Studio.

  3. Apri un notebook EMR Studio Workspace ed esegui il codice seguente come prima cella del notebook per configurare la sessione Spark per l'utilizzo di Iceberg:

    %%configure -f { "conf": { "spark.sql.catalog.<catalog_name>": "org.apache.iceberg.spark.SparkCatalog", "spark.sql.catalog.<catalog_name>.warehouse": "s3://YOUR-BUCKET-NAME/YOUR-FOLDER-NAME/", "spark.sql.catalog.<catalog_name>.catalog-impl": "org.apache.iceberg.aws.glue.GlueCatalog", "spark.sql.catalog.<catalog_name>.io-impl": "org.apache.iceberg.aws.s3.S3FileIO", "spark.sql.extensions": "org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions" } }

    dove:

    • <catalog_name>è il nome del catalogo della sessione Iceberg Spark. Sostituiscilo con il nome del tuo catalogo e ricorda di cambiare i riferimenti in tutte le configurazioni associate a questo catalogo. Nel codice, dovresti quindi fare riferimento alle tabelle Iceberg con il nome completo della tabella, incluso il nome del catalogo della sessione Spark, come segue:

      <catalog_name>.<database_name>.<table_name>
    • <catalog_name>.warehouseindica il percorso Amazon S3 in cui desideri archiviare dati e metadati.

    • Per rendere il catalogo un AWS Glue Data Catalog, imposta su<catalog_name>.catalog-impl . org.apache.iceberg.aws.glue.GlueCatalog Questa chiave è necessaria per indicare una classe di implementazione per qualsiasi implementazione del catalogo personalizzato. La sezione sulle migliori pratiche generali riportata più avanti in questa guida descrive i diversi cataloghi supportati da Iceberg.

    • Usalo org.apache.iceberg.aws.s3.S3FileIO come per sfruttare il <catalog_name>.io-impl caricamento multiparte di Amazon S3 per un elevato parallelismo.

  4. Ora puoi iniziare a sviluppare in modo interattivo la tua applicazione Spark per Iceberg nel notebook, come faresti per qualsiasi altra applicazione Spark.

Per ulteriori informazioni sulla configurazione di Spark per Apache Iceberg utilizzando Amazon EMR Studio, consulta il post del blog Crea un data lake in evoluzione, conforme ad ACID e ad alte prestazioni usando Apache Iceberg su Amazon EMR. 

Esecuzione di lavori Iceberg in Amazon EMR

Dopo aver sviluppato il codice dell'applicazione Spark per il tuo carico di lavoro Iceberg, puoi eseguirlo su qualsiasi opzione di distribuzione Amazon EMR che supporti Iceberg (consulta le domande frequenti su Amazon EMR).

Come per gli altri job Spark, puoi inviare lavori a un Amazon EMR su un cluster Amazon EC2 aggiungendo passaggi o inviando in modo interattivo i lavori Spark al nodo principale. Per eseguire un job Spark, consulta le seguenti pagine di documentazione di Amazon EMR:

Le seguenti sezioni forniscono un esempio per ogni opzione di implementazione di Amazon EMR.

Amazon EMR su Amazon EC2

Puoi utilizzare questi passaggi per inviare il job Iceberg Spark:

  1. Crea il file emr_step_iceberg.json con il seguente contenuto sulla tua workstation:

    [{ "Name": "iceberg-test-job", "Type": "spark", "ActionOnFailure": "CONTINUE", "Args": [ "--deploy-mode", "client", "--conf", "spark.sql.extensions=org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions", "--conf", "spark.sql.catalog.<catalog_name>=org.apache.iceberg.spark.SparkCatalog", "--conf", "spark.sql.catalog.<catalog_name>.catalog-impl=org.apache.iceberg.aws.glue.GlueCatalog", "--conf", "spark.sql.catalog.<catalog_name>.warehouse=s3://YOUR-BUCKET-NAME/YOUR-FOLDER-NAME/", "--conf", "spark.sql.catalog.<catalog_name>.io-impl=org.apache.iceberg.aws.s3.S3FileIO", "s3://YOUR-BUCKET-NAME/code/iceberg-job.py" ] }]
  2. Modifica il file di configurazione per il tuo specifico job Spark personalizzando le opzioni di configurazione di Iceberg evidenziate in grassetto.

  3. Invia il passaggio utilizzando (). AWS Command Line Interface AWS CLI Esegui il comando nella directory in cui si trova il emr_step_iceberg.json file.

    aws emr add-steps ‐‐cluster-id <cluster_id> ‐‐steps file://emr_step_iceberg.json

Amazon EMR Serverless

Per inviare un job Iceberg Spark ad Amazon EMR Serverless utilizzando: AWS CLI

  1. Crea il file emr_serverless_iceberg.json con il seguente contenuto sulla tua workstation:

    { "applicationId": "<APPLICATION_ID>", "executionRoleArn": "<ROLE_ARN>", "jobDriver": { "sparkSubmit": { "entryPoint": "s3://YOUR-BUCKET-NAME/code/iceberg-job.py", "entryPointArguments": [], "sparkSubmitParameters": "--jars /usr/share/aws/iceberg/lib/iceberg-spark3-runtime.jar" } }, "configurationOverrides": { "applicationConfiguration": [{ "classification": "spark-defaults", "properties": { "spark.sql.extensions": "org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions", "spark.sql.catalog.<catalog_name>": "org.apache.iceberg.spark.SparkCatalog", "spark.sql.catalog.<catalog_name>.catalog-impl": "org.apache.iceberg.aws.glue.GlueCatalog", "spark.sql.catalog.<catalog_name>.warehouse": "s3://YOUR-BUCKET-NAME/YOUR-FOLDER-NAME/", "spark.sql.catalog.<catalog_name>.io-impl": "org.apache.iceberg.aws.s3.S3FileIO", "spark.jars":"/usr/share/aws/iceberg/lib/iceberg-spark3-runtime.jar", "spark.hadoop.hive.metastore.client.factory.class":"com.amazonaws.glue.catalog.metastore.AWSGlueDataCatalogHiveClientFactory" } }], "monitoringConfiguration": { "s3MonitoringConfiguration": { "logUri": "s3://YOUR-BUCKET-NAME/emr-serverless/logs/" } } } }
  2. Modifica il file di configurazione per il tuo specifico job Spark personalizzando le opzioni di configurazione di Iceberg evidenziate in grassetto.

  3. Invia il lavoro utilizzando il. AWS CLI Esegui il comando nella directory in cui si trova il emr_serverless_iceberg.json file:

    aws emr-serverless start-job-run ‐‐cli-input-json file://emr_serverless_iceberg.json

Per inviare un job Iceberg Spark ad Amazon EMR Serverless utilizzando la console EMR Studio:

  1. Segui le istruzioni nella documentazione di Amazon EMR Serverless.

  2. Per la configurazione Job, usa la configurazione Iceberg per Spark fornita per AWS CLI e personalizza i campi evidenziati per Iceberg. Per istruzioni dettagliate, consulta Usare Apache Iceberg con EMR Serverless nella documentazione di Amazon EMR.

Amazon EMR su Amazon EKS

Per inviare un lavoro Iceberg Spark ad Amazon EMR su Amazon EKS utilizzando: AWS CLI

  1. Crea il file emr_eks_iceberg.json con il seguente contenuto sulla tua workstation:

    { "name": "iceberg-test-job", "virtualClusterId": "<VIRTUAL_CLUSTER_ID>", "executionRoleArn": "<ROLE_ARN>", "releaseLabel": "emr-6.9.0-latest", "jobDriver": { "sparkSubmitJobDriver": { "entryPoint": "s3://YOUR-BUCKET-NAME/code/iceberg-job.py", "entryPointArguments": [], "sparkSubmitParameters": "--jars local:///usr/share/aws/iceberg/lib/iceberg-spark3-runtime.jar" } }, "configurationOverrides": { "applicationConfiguration": [{ "classification": "spark-defaults", "properties": { "spark.sql.extensions": "org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions", "spark.sql.catalog.<catalog_name>": "org.apache.iceberg.spark.SparkCatalog", "spark.sql.catalog.<catalog_name>.catalog-impl": "org.apache.iceberg.aws.glue.GlueCatalog", "spark.sql.catalog.<catalog_name>.warehouse": "s3://YOUR-BUCKET-NAME/YOUR-FOLDER-NAME/", "spark.sql.catalog.<catalog_name>.io-impl": "org.apache.iceberg.aws.s3.S3FileIO", "spark.hadoop.hive.metastore.client.factory.class": "com.amazonaws.glue.catalog.metastore.AWSGlueDataCatalogHiveClientFactory" } }], "monitoringConfiguration": { "persistentAppUI": "ENABLED", "s3MonitoringConfiguration": { "logUri": "s3://YOUR-BUCKET-NAME/emr-serverless/logs/" } } } }
  2. Modifica il file di configurazione per il tuo job Spark personalizzando le opzioni di configurazione di Iceberg evidenziate in grassetto.

  3. Invia il lavoro utilizzando il. AWS CLI Eseguite il comando seguente nella directory in cui si trova il emr_eks_iceberg.json file:

    aws emr-containers start-job-run ‐‐cli-input-json file://emr_eks_iceberg.json

Per istruzioni dettagliate, consulta Usare Apache Iceberg con Amazon EMR su EKS nella documentazione di Amazon EMR su EKS. 

Best practice per Amazon EMR

Questa sezione fornisce linee guida generali per l'ottimizzazione dei job Spark in Amazon EMR per ottimizzare la lettura e la scrittura dei dati nelle tabelle Iceberg. Per le best practice specifiche di Iceberg, consulta la sezione Best practice più avanti in questa guida.

  • Usa la versione più recente di Amazon EMR: Amazon EMR fornisce ottimizzazioni Spark pronte all'uso con il runtime Amazon EMR Spark. AWS migliora le prestazioni del motore di runtime Spark con ogni nuova versione.

  • Determina l'infrastruttura ottimale per i tuoi carichi di lavoro Spark: i carichi di lavoro Spark potrebbero richiedere diversi tipi di hardware per diverse caratteristiche di lavoro per garantire prestazioni ottimali. Amazon EMR supporta diversi tipi di istanze (ad esempio ottimizzate per elaborazione, memoria, uso generico e storage ottimizzate) per soddisfare tutti i tipi di requisiti di elaborazione. Quando esegui l'onboarding di nuovi carichi di lavoro, ti consigliamo di eseguire benchmark con tipi di istanze generali come M5 o M6g. Monitora il sistema operativo (OS) e le metriche YARN di Ganglia e Amazon CloudWatch per determinare i colli di bottiglia del sistema (CPU, memoria, storage e I/O) al picco di carico e scegli l'hardware appropriato.

  • Tunespark.sql.shuffle.partitions: imposta la spark.sql.shuffle.partitions proprietà sul numero totale di core virtuali (vCore) nel cluster o su un multiplo di tale valore (in genere, da 1 a 2 volte il numero totale di vCore). Questa impostazione influisce sul parallelismo di Spark quando utilizzi il partizionamento hash e range come modalità di distribuzione della scrittura. Richiede un rimescolamento prima della scrittura per organizzare i dati, il che garantisce l'allineamento delle partizioni.

  • Abilita la scalabilità gestita: per quasi tutti i casi d'uso, consigliamo di abilitare la scalabilità gestita e l'allocazione dinamica. Tuttavia, se hai un carico di lavoro con uno schema prevedibile, ti consigliamo di disabilitare la scalabilità automatica e l'allocazione dinamica. Quando la scalabilità gestita è abilitata, ti consigliamo di utilizzare le istanze Spot per ridurre i costi. Utilizza le istanze Spot per i nodi di attività anziché per i nodi principali o master. Quando utilizzi le istanze Spot, utilizza flotte di istanze con più tipi di istanze per flotta per garantire la disponibilità spot.

  • Usa broadcast join quando possibile: Broadcast (mapside) join è il join ottimale, a condizione che uno dei tavoli sia sufficientemente piccolo da entrare nella memoria del nodo più piccolo (nell'ordine di MB) e che tu stia eseguendo un join equi (=). Sono supportati tutti i tipi di join ad eccezione dei join esterni completi. Un broadcast join trasmette la tabella più piccola come tabella hash su tutti i nodi di lavoro in memoria. Dopo che la tabella piccola è stata trasmessa, non è possibile modificarla. Poiché la tabella hash si trova localmente nella macchina virtuale Java (JVM), può essere facilmente unita alla tabella grande in base alla condizione di join utilizzando un hash join. I join broadcast offrono prestazioni elevate grazie al minimo sovraccarico di shuffle.

  • Ottimizzazione del garbage collector: se i cicli di garbage collection (GC) sono lenti, valuta la possibilità di passare dal garbage collector parallelo predefinito a G1GC per prestazioni migliori. Per ottimizzare le prestazioni GC, puoi ottimizzare i parametri GC. Per tenere traccia delle prestazioni di GC, puoi monitorarle utilizzando l'interfaccia utente Spark. Idealmente, il tempo GC dovrebbe essere inferiore o uguale all'1% della durata totale dell'attività.