Fornire un archivio delle dipendenze

Le applicazioni Java o Scala potrebbero richiedere file JAR aggiuntivi che non è possibile o non si desidera raggruppare in un file JAR grasso. In alternativa, potresti voler includere codice nativo o altri asset da rendere disponibili all'interno del runtime Spark.

Quando le opzioni di sottomissione automatica non funzionano, Data Flow ha la possibilità di fornire un archivio ZIP (archive.zip) insieme all'applicazione per raggruppare le dipendenze di terze parti. L'archivio ZIP può essere creato utilizzando uno strumento basato su Docker. Il file archive.zip viene installato su tutti i nodi Spark prima di eseguire l'applicazione. Se si costruisce correttamente archive.zip, le librerie Python vengono aggiunte al runtime e i file JAR vengono aggiunti al classpath Spark. Le librerie aggiunte sono isolate in una sola esecuzione. Ciò significa che non interferiscono con altre esecuzioni concorrenti o successive. È possibile fornire un solo archivio per esecuzione.

Qualsiasi elemento nell'archivio deve essere compatibile con il runtime del flusso di dati. Ad esempio, Data Flow viene eseguito su Oracle Linux utilizzando versioni specifiche di Java e Python. Il codice binario compilato per altri sistemi operativi o i file JAR compilati per altre versioni Java potrebbero causare l'esecuzione non riuscita. Data Flow fornisce strumenti utili per creare archivi con software compatibile. Tuttavia, questi archivi sono file Zip ordinari, quindi sei libero di crearli in qualsiasi modo tu voglia. Se utilizzi i tuoi strumenti, sei responsabile di garantire la compatibilità.

Gli archivi delle dipendenze, in modo simile alle applicazioni Spark, vengono caricati in Data Flow. La definizione dell'applicazione Flusso dati contiene un collegamento a questo archivio, che può essere sostituito in runtime. Quando si esegue l'applicazione, l'archivio viene scaricato e installato prima dell'esecuzione del job Spark. L'archivio è privato dell'esecuzione. Ciò significa, ad esempio, che è possibile eseguire contemporaneamente due istanze diverse della stessa applicazione, con dipendenze diverse, ma senza conflitti. Le dipendenze non persistono tra le esecuzioni, pertanto non si verificano problemi con versioni in conflitto per altre applicazioni Spark che è possibile eseguire.

Creazione di un archivio di dipendenze mediante Data Flow Dependency Packager

  1. Scarica il docker.
  2. Scarica l'immagine dello strumento packager:
    Forma del BRACCIO:
    docker pull phx.ocir.io/axmemlgtri2a/dataflow/dependency-packager-linux_arm64_v8:latest
    Forma AMD:
    docker pull phx.ocir.io/axmemlgtri2a/dataflow/dependency-packager-linux_x86_64:latest
  3. Per le dipendenze Python, creare un file requirements.txt. Ad esempio, potrebbe avere un aspetto simile a:
    numpy==1.18.1
    pandas==1.0.3
    pyarrow==0.14.0
    Nota

    Non includere pyspark o py4j. Queste dipendenze vengono fornite dal flusso di dati e l'inclusione comporta l'errore delle esecuzioni.
    Data Flow Dependency Packager utilizza lo strumento pip di Python per installare tutte le dipendenze. Se si dispone di ruote Python che non possono essere scaricate da fonti pubbliche, posizionarle in una directory sotto la quale si crea il pacchetto. Vedere in requirements.txt il prefisso /opt/dataflow/. Ad esempio:
    /opt/dataflow/<my-python-wheel.whl>

    dove <my-python-wheel.whl> rappresenta il nome della rotella Python. Pip lo vede come un file locale e lo installa normalmente.

  4. Per le dipendenze Java, creare un file denominato packages.txt. Ad esempio, potrebbe avere un aspetto simile a:
    ml.dmlc:xgboost4j:0.90
    ml.dmlc:xgboost4j-spark:0.90
    https://repo1.maven.org/maven2/com/nimbusds/nimbus-jose-jwt/8.11/nimbus-jose-jwt-8.11.jar

    Data Flow Dependency Packager utilizza Apache Maven per scaricare i file JAR delle dipendenze. Se si dispone di file JAR che non possono essere scaricati da fonti pubbliche, posizionarli in una directory locale sotto la quale si crea il pacchetto. Tutti i file JAR delle sottodirectory in cui verrà creato il pacchetto verranno inclusi nell'archivio.

  5. Utilizzare il contenitore docker per creare l'archivio.
    Nota

    Quando si utilizza Spark 3.5.0, 3.8 quando si utilizza Spark 3.2.1 e 3.6 quando si utilizza Spark 3.0.2 o Spark 2.4.4, è necessario impostare la versione di Python su 3.11. Nei comandi seguenti, <python_version> rappresenta questo numero.

    Utilizzare questo comando se si utilizza MacOS o Linux:

    AMD64:

    docker run --platform linux/amd64 --rm -v $(pwd):/opt/dataflow 
    --pull always -it phx.ocir.io/axmemlgtri2a/dataflow/dependency-packager-linux_x86_64:latest -p <python_version>

    ARM64:

    docker run --platform linux/arm64 --rm -v $(pwd):/opt/dataflow 
    --pull always -it phx.ocir.io/axmemlgtri2a/dataflow/dependency-packager-linux_arm64_v8:latest -p <python_version>

    Se si utilizza il prompt dei comandi di Windows come amministratore, utilizzare questo comando:

    AMD64:

    docker run --platform linux/amd64 --rm -v %CD%:/opt/dataflow 
    --pull always -it phx.ocir.io/axmemlgtri2a/dataflow/dependency-packager-linux_x86_64:latest -p <python_version>

    ARM64:

    docker run --platform linux/arm64 --rm -v %CD%:/opt/dataflow 
    --pull always -it phx.ocir.io/axmemlgtri2a/dataflow/dependency-packager-linux_arm64_v8:latest -p <python_version>

    Se si utilizza Windows Powershell come amministratore, utilizzare questo comando:

    AMD64:

    docker run --platform linux/amd64 --rm -v ${PWD}:/opt/dataflow 
    --pull always -it phx.ocir.io/axmemlgtri2a/dataflow/dependency-packager-linux_x86_64:latest -p <python_version>

    ARM64:

    docker run --platform linux/arm64 --rm -v ${PWD}:/opt/dataflow 
    --pull always -it phx.ocir.io/axmemlgtri2a/dataflow/dependency-packager-linux_arm64_v8:latest -p <python_version>

    Per utilizzare Podman per creare l'archivio, utilizzare questo comando in Linux:

    AMD64:

    podman run --platform linux/amd64 --rm -v $(pwd):/opt/dataflow:Z -u root 
    -it phx.ocir.io/axmemlgtri2a/dataflow/dependency-packager-linux_x86_64:latest -p <python_version>

    ARM64:

    podman run --platform linux/arm64 --rm -v $(pwd):/opt/dataflow:Z -u root 
    -it phx.ocir.io/axmemlgtri2a/dataflow/dependency-packager-linux_arm64_v8:latest -p <python_version>

    Questi comandi consentono di creare un file denominato archive.zip.

    La directory di lavoro è rappresentata da pwd. Il flag -v indica il mapping del volume docker al file system locale.

  6. È possibile aggiungere contenuto statico. Può essere necessario includere altri contenuti nell'archivio. Ad esempio, potrebbe essere necessario distribuire un file di dati, un file modello ML o un eseguibile richiamato dal programma Spark in fase di esecuzione. Per eseguire questa operazione, aggiungere i file a archive.zip dopo averlo creato nel passo 4.

    Per le applicazioni Java:

    1. Estrarre il file archive.zip.
    2. Aggiungere i file JAR solo nella directory java/.
    3. Comprimere il file.
    4. Caricarlo nello storage degli oggetti.
    Per le applicazioni Python:
    1. Estrarre il file archive.zip.
    2. Aggiungere moduli locali solo a queste tre sottodirectory della directory python/:
      python/lib
      python/lib32
      python/lib64
    3. Comprimere il file.
    4. Caricarlo nell'Object Store.
    Nota

    Per memorizzare le dipendenze Java e Python sono consentite solo queste quattro directory.

    Quando viene eseguita l'applicazione Flusso dati, il contenuto statico è disponibile in qualsiasi nodo della directory in cui si è scelto di posizionarlo. Ad esempio, se i file sono stati aggiunti in python/lib/ nell'archivio, sono disponibili nella directory /opt/dataflow/python/lib/ in qualsiasi nodo.

  7. Caricare archive.zip nell'area di memorizzazione degli oggetti.
  8. Aggiungere la libreria all'applicazione. Per ulteriori informazioni, vedere Creazione di un'applicazione Java o Scala Data Flow o Creazione di un'applicazione PySpark Data Flow.

La struttura dell'archivio delle dipendenze

Gli archivi delle dipendenze sono file ZIP ordinari. Gli utenti avanzati potrebbero voler creare archivi con i propri strumenti anziché utilizzare Data Flow Dependency Packager. Un archivio di dipendenze costruito correttamente presenta i seguenti profili generali:

python
python/lib
python/lib/python3.6/<your_library1>
python/lib/python3.6/<your_library2>
python/lib/python3.6/<...>
python/lib/python3.6/<your_libraryN>
python/lib/user
python/lib/user/<your_static_data>
java
java/<your_jar_file1>
java/<...>
java/<your_jar_fileN>
Nota

Data Flow estrae i file di archivio nella directory /opt/dataflow.

Convalidare un file Archive.zip utilizzando Data Flow Dependency Packager

È possibile utilizzare Data Flow Dependency Packager per convalidare un file archive.zip a livello locale, prima di caricare il file nello storage degli oggetti.

Passare alla directory che contiene il file archive.zip ed eseguire i comandi riportati di seguito, a seconda della forma.

ARM64:
docker run --platform linux/arm64 --rm -v $(pwd):/opt/dataflow  --pull always -it phx.ocir.io/axmemlgtri2a/dataflow/dependency-packager-linux_arm64_v8:latest  -p 3.11 --validate archive.zip
AMD64:
docker run --platform linux/amd64 --rm -v $(pwd):/opt/dataflow  --pull always -it phx.ocir.io/axmemlgtri2a/dataflow/dependency-packager-linux_x86_64:latest   -p 3.11 --validate archive.zip

File Requirements.txt e Packages.txt di esempio

Questo esempio di file requirements.txt include l'SDK SDK for Python versione 2.14.3 di Data Flow in un'applicazione Data Flow:
-i https://pypi.org/simple
certifi==2020.4.5.1
cffi==1.14.0
configparser==4.0.2
cryptography==2.8
oci==2.14.3
pycparser==2.20
pyopenssl==19.1.0
python-dateutil==2.8.1
pytz==2020.1
six==1.15.0
Questo esempio di file requirements.txt include una combinazione di origini PyPI, origini Web e origini locali per i file wheel di Python:
-i https://pypi.org/simple
blis==0.4.1
catalogue==1.0.0
certifi==2020.4.5.1
chardet==3.0.4
cymem==2.0.3
https://github.com/explosion/spacy-models/releases/download/en_core_web_sm-2.2.0/en_core_web_sm-2.2.0.tar.gz#egg=en-core-web-sm
idna==2.9
importlib-metadata==1.6.0 ; python_version < '3.8'
murmurhash==1.0.2
numpy==1.18.3
plac==1.1.3
preshed==3.0.2
requests==2.23.0
spacy==2.2.4
srsly==1.0.2
thinc==7.4.0
tqdm==4.45.0
urllib3==1.25.9
wasabi==0.6.0
zipp==3.1.0
/opt/dataflow/mywheel-0.1-py3-none-any.whl
Per connettersi ai database Oracle, ad esempio ADW, è necessario includere i file JAR JDBC Oracle. Scaricare ed estrarre i file JAR del driver compatibile in una directory in cui si crea il pacchetto. Ad esempio, per creare un package del driver JDBC Oracle 18.3 (18c), assicurarsi che siano presenti tutti i file JAR riportati di seguito.
ojdbc8-18.3.jar
oraclepki-18.3.jar
osdt_cert-18.3.jar
osdt_core-18.3.jar
ucp-18.3.jar