Gestisci le dipendenze della pipeline in Dataflow

Molte pipeline Apache Beam possono essere eseguite utilizzando la classe Dataflow predefinita ambienti di runtime. Tuttavia, alcuni casi d'uso relativi all'elaborazione dei dati traggono vantaggio dall'utilizzo altre librerie o classi. In questi casi, potrebbe essere necessario gestire delle dipendenze della pipeline.

Il seguente elenco fornisce alcuni motivi per cui potresti dover gestire la pipeline delle dipendenze:

  • Le dipendenze fornite dall'ambiente di runtime predefinito non sufficiente per il tuo caso d'uso.
  • Le dipendenze predefinite hanno collisioni tra versioni o hanno classi e librerie non compatibili con il codice della pipeline.
  • Devi fissare a versioni specifiche della libreria per la pipeline.
  • Hai una pipeline Python che deve essere eseguita con un set coerente delle dipendenze.

Il modo in cui gestisci le dipendenze dipende dall'uso o meno da parte della pipeline Java, Python o Go.

Java

Classi e librerie incompatibili possono causare problemi di dipendenza Java. Se le tue contiene codice e impostazioni specifici dell'utente, il codice non può contenere le versioni più recenti delle librerie.

Problemi di dipendenza Java

Se la tua pipeline presenta problemi di dipendenza Java, uno dei potrebbero verificarsi i seguenti errori:

  • NoClassDefFoundError: questo errore si verifica quando l'intero corso non disponibili durante il runtime.
  • NoSuchMethodError: questo errore si verifica quando la classe nel classpath utilizza una versione che non contiene il metodo corretto o quando il metodo firma modificata.
  • NoSuchFieldError: questo errore si verifica quando la classe nel classpath utilizza un oggetto che non ha un campo obbligatorio durante il runtime.
  • FATAL ERROR: questo errore si verifica quando non è possibile caricare una dipendenza integrata correttamente. Se utilizzi un file JAR Uber (ombreggiato), non includere librerie che utilizzano nello stesso file JAR, ad esempio Conscrypt.

Gestione delle dipendenze

Per semplificare la gestione delle dipendenze per le pipeline Java, Apache Beam utilizza Distinta materiali (BOM) artefatti. Il BOM aiuta gli strumenti di gestione delle dipendenze a selezionare la compatibilità combinazioni di dipendenze. Per ulteriori informazioni, vedi SDK Apache Beam per le dipendenze Java nella documentazione di Apache Beam.

Per utilizzare un BOM con la pipeline e aggiungere esplicitamente altre dipendenze al nell'elenco delle dipendenze, aggiungi le seguenti informazioni al file pom.xml per l'SDK artefatto. Per importare il BOM delle librerie corretto, utilizza beam-sdks-java-io-google-cloud-platform-bom.

<dependencyManagement>
  <dependencies>
    <dependency>
      <groupId>org.apache.beam</groupId>
      <artifactId>beam-sdks-java-google-cloud-platform-bom</artifactId>
      <version>LATEST</version>
      <type>pom</type>
      <scope>import</scope>
    </dependency>
  </dependencies>
</dependencyManagement>

<dependencies>
  <dependency>
    <groupId>org.apache.beam</groupId>
    <artifactId>beam-sdks-java-core</artifactId>
  </dependency>
  <dependency>
    <groupId>org.apache.beam</groupId>
    <artifactId>beam-runners-google-cloud-dataflow-java</artifactId>
  </dependency>
  <dependency>
    <groupId>org.apache.beam</groupId>
    <artifactId>beam-sdks-java-io-google-cloud-platform</artifactId>
  </dependency>
</dependencies>

L'artefatto beam-sdks-java-core contiene solo l'SDK principale. Devi aggiungere esplicitamente altre dipendenze, come I/O e runner, all'elenco delle dipendenze.

Python

Quando esegui job Dataflow utilizzando il linguaggio Python Apache Beam SDK, la gestione delle dipendenze è utile nei seguenti scenari:

  • La tua pipeline utilizza pacchetti pubblici Indice pacchetti Python (PiPy) e vuoi rendere disponibili questi pacchetti da remoto.
  • Vuoi creare un ambiente riproducibile.
  • Per ridurre i tempi di avvio, vuoi evitare l'installazione delle dipendenze durante il runtime.

Definisci le dipendenze della pipeline Python

Sebbene sia possibile usare un singolo script o blocco note Python per scrivere Nella pipeline Apache Beam, nell'ecosistema Python, il software viene spesso distribuito come pacchetti. Per semplificare la manutenzione della pipeline, quando il codice della pipeline su più file, raggruppa i file della pipeline come pacchetto Python.

  • Definisci le dipendenze della pipeline nel file setup.py del pacchetto.
  • Staging del pacchetto ai worker utilizzando l'opzione pipeline --setup_file.

Quando iniziano i lavoratori da remoto, il pacchetto viene installato. Per un esempio, vedi giulia nel GitHub di Apache Beam.

Per strutturare la pipeline come pacchetto Python, segui questi passaggi:

  1. Crea un file setup.py per il tuo progetto. Nel file setup.py, includi il install_requires per specificare l'insieme minimo di dipendenze per la pipeline. L'esempio seguente mostra un file setup.py di base.

    import setuptools
    
    setuptools.setup(
      name='PACKAGE_NAME',
      version='PACKAGE_VERSION',
      install_requires=[],
      packages=setuptools.find_packages(),
    )
    
  2. Aggiungi il file setup.py, il file principale del flusso di lavoro e una directory con dei file rimanenti nella directory radice del progetto. Questo raggruppamento di file è il pacchetto Python per la tua pipeline. Struttura del file è simile al seguente esempio:

    root_dir/
      package_name/
        my_pipeline_launcher.py
        my_custom_transforms.py
        ...other files...
      setup.py
      main.py
    
  3. Per eseguire la pipeline, installa il pacchetto nell'ambiente di invio. Utilizza l'opzione pipeline --setup_file per posizionare temporaneamente il pacchetto nei worker. Ad esempio:

    python -m pip install -e .
    python main.py --runner DataflowRunner --setup_file ./setup.py  <...other options...>
    

Questi passaggi semplificano la manutenzione del codice della pipeline, in particolare quando il codice cresce in termini di dimensioni e complessità. Per altri modi per specificare le dipendenze, consulta Gestione delle dipendenze della pipeline Python nella documentazione di Apache Beam.

Usa container personalizzati per controllare l'ambiente di runtime

Per eseguire una pipeline con l'SDK per Python Apache Beam, Dataflow i worker hanno bisogno di un ambiente Python che contenga un interprete, l'SDK Apache Beam e le dipendenze della pipeline. Le immagini container Docker forniscono l'ambiente appropriato per eseguire il codice della pipeline.

Le immagini container stock vengono rilasciate con ogni versione dell'SDK Apache Beam e queste immagini includono le dipendenze dell'SDK Apache Beam. Per ulteriori informazioni, vedi SDK Apache Beam per le dipendenze Python nella documentazione di Apache Beam.

Quando la pipeline richiede una dipendenza che non è inclusa nel bucket predefinito container, la dipendenza deve essere installata in fase di runtime. Installazione dei pacchetti su runtime può avere le seguenti conseguenze:

  • Il tempo di avvio del worker aumenta a causa della risoluzione delle dipendenze, del download e dell'installazione.
  • Per l'esecuzione della pipeline è necessaria una connessione a internet.
  • Il non determinismo si verifica a causa di release del software nelle dipendenze.

Per evitare questi problemi, fornisci l'ambiente di runtime in un'immagine container Docker personalizzata. Utilizzo di un'immagine container Docker personalizzata in cui le dipendenze della pipeline sono preinstallate presenta i seguenti vantaggi:

  • Garantisce che l'ambiente di runtime della pipeline abbia lo stesso insieme di delle dipendenze a ogni avvio del job Dataflow.
  • Consente di controllare l'ambiente di runtime della pipeline.
  • Evita la risoluzione delle dipendenze all'avvio potenzialmente dispendiosa in termini di tempo.

Quando utilizzi le immagini container personalizzate, tieni presente le seguenti indicazioni:

  • Evita di utilizzare il tag :latest con le tue immagini personalizzate. Tagga il tuo le build con una data, una versione o un identificatore univoco. Questo passaggio consente di tornare a una configurazione di funzionamento nota, se necessario.
  • Utilizza un ambiente di lancio compatibile con l'immagine container. Per ulteriori indicazioni sull'utilizzo di container personalizzati, consulta Crea un'immagine container.

Per maggiori dettagli sulla preinstallazione delle dipendenze Python, consulta Preinstalla le dipendenze Python.

Controlla l'ambiente di lancio con i modelli Dataflow

Se la tua pipeline richiede dipendenze aggiuntive, potresti dover installare sia nell'ambiente di runtime che in quello di lancio. Il lancio dell'ambiente di rete esegue la versione di produzione della pipeline. Poiché il lancio dell'ambiente deve essere compatibile con l'ambiente di runtime, usa lo stesso delle dipendenze in entrambi gli ambienti.

Per avere un ambiente di lancio containerizzato e riproducibile, utilizza Modelli flessibili Dataflow. Per ulteriori informazioni, vedi Crea ed esegui un modello flessibile. Quando utilizzi i modelli flessibili, considera i seguenti fattori:

Questa creazione rende il tuo ambiente di lancio riproducibile e compatibile con il tuo ambiente di runtime.

Per un esempio che segue questo approccio, consulta Modello flessibile per una pipeline con dipendenze e un container personalizzato in GitHub.

Per ulteriori informazioni, vedi Rendere l'ambiente di lancio compatibile con l'ambiente di runtime e Controlla le dipendenze utilizzate dalla pipeline nella documentazione di Apache Beam.

Vai

Quando esegui job Dataflow utilizzando l'SDK Apache Beam Go, Moduli Go per gestire le dipendenze. Il seguente file contiene la compilazione predefinita e le dipendenze di runtime utilizzate dalla pipeline:

https://raw.githubusercontent.com/apache/beam/vVERSION_NUMBER/sdks/go.sum

Sostituisci VERSION_NUMBER con la versione dell'SDK in uso.

Per informazioni sulla gestione delle dipendenze per la pipeline Go, consulta Gestire le dipendenze nella documentazione di Go.