Suministro de un archivo de dependencia

Es posible que las aplicaciones de Java o Scala necesiten archivos JAR adicionales que no pueda o no desee agrupar en un Fat JAR. O puede que desee incluir código nativo u otros activos para que estén disponibles en el tiempo de ejecución de Spark.

Cuando las opciones de spark-submit no funcionan, Data Flow tiene la opción de proporcionar un archivo ZIP (archive.zip) junto con la aplicación para agrupar dependencias de terceros. El archivo ZIP se puede crear con una herramienta basada en Docker. archive.zip se instala en todos los nodos de Spark antes de ejecutar la aplicación. Si crea archive.zip correctamente, las bibliotecas de Python se agregan al tiempo de ejecución y los archivos JAR se agregan a la classpath de Spark. Las bibliotecas agregadas están aisladas en una ejecución. Esto significa que no interfieren con otras ejecuciones simultáneas o posteriores. Solo se puede proporcionar un archivo por ejecución.

Cualquier elemento del archivo debe ser compatible con el tiempo de ejecución de Data Flow. Por ejemplo, Data Flow se ejecuta en Oracle Linux con versiones concretas de Java y Python. El código binario compilado para otros sistemas operativos, o archivos JAR compilados para otras versiones de Java, puede provocar que la ejecución falle. Data Flow proporciona herramientas para ayudarle a crear archivos con software compatible. Sin embargo, estos archivos son archivos Zip normales, por lo que puede crearlos como desee. Si utiliza sus propias herramientas, es responsable de garantizar la compatibilidad.

Los archivos de dependencias, al igual que las aplicaciones de Spark, se cargan en Data Flow. La definición de aplicación de Data Flow contiene un enlace a este archivo, que se puede sustituir en tiempo real. Al ejecutar la aplicación, el archivo se descarga e instala antes de ejecutar el trabajo de Spark. El archivo es privado de la ejecución. Esto significa, por ejemplo, que puede ejecutar simultáneamente dos instancias diferentes de la misma aplicación, con diferentes dependencias, pero sin conflictos. Las dependencias no persisten entre ejecuciones, por lo que no hay ningún problema con las versiones en conflicto para otras aplicaciones de Spark que pueda ejecutar.

Creación de un archivo de dependencias mediante el empaquetador de dependencias de Data Flow

  1. Descargue docker.
  2. Descargue la imagen de la herramienta del empaquetador:
    Forma de ARM:
    docker pull phx.ocir.io/axmemlgtri2a/dataflow/dependency-packager-linux_arm64_v8:latest
    Forma de AMD:
    docker pull phx.ocir.io/axmemlgtri2a/dataflow/dependency-packager-linux_x86_64:latest
  3. Para dependencias de Python, cree un archivo requirements.txt. Por ejemplo, puede tener un aspecto similar a:
    numpy==1.18.1
    pandas==1.0.3
    pyarrow==0.14.0
    Nota

    No incluya pyspark ni py4j. Estas dependencias las proporciona Data Flow y su inclusión provoca que fallen las ejecuciones.
    El paquete de dependencias de Data Flow utiliza la herramienta pip de Python para instalar todas las dependencias. Si tiene paquetes de Python que no se pueden descargar de orígenes públicos, colóquelos en un directorio debajo de aquel en el que cree el paquete. Consúltelos en requirements.txt con un prefijo /opt/dataflow/. Por ejemplo:
    /opt/dataflow/<my-python-wheel.whl>

    donde <my-python-wheel.whl> representa el nombre de la rueda de Python. Pip lo considera un archivo local y lo instala de la forma normal.

  4. Para dependencias de Java, cree un archivo denominado packages.txt. Por ejemplo, puede tener un aspecto similar 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

    El empaquetador de dependencias de Data Flow utiliza Apache Maven para descargar los archivos JAR de dependencias. Si tiene archivos JAR que no se pueden descargar de orígenes públicos, colóquelos en un directorio local debajo de aquel en el que cree el paquete. Cualquier archivo JAR de cualquier subdirectorio en el que cree el paquete se incluye en el archivo.

  5. Utilice el contenedor de docker para crear el archivo.
    Nota

    La versión de Python se debe definir en 3.11 al utilizar Spark 3.5.0, 3.8 al utilizar Spark 3.2.1 y 3.6 al utilizar Spark 3.0.2 o Spark 2.4.4. En los siguientes comandos, <python_version> representa este número.

    Utilice este comando si utiliza 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>

    Si utiliza el símbolo del sistema de Windows como administrador, utilice este 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>

    Si utiliza Windows Powershell como administrador, utilice este 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>

    Para utilizar Podman para crear el archivo, utilice este comando en 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>

    Estos comandos crean un archivo llamado archive.zip.

    El directorio de trabajo está representado por pwd. El indicador -v indica la asignación de volumen de docker al sistema de archivos local.

  6. Puede agregar contenido estático. Puede que desee incluir otro contenido en el archivo. Por ejemplo, puede que desee desplegar un archivo de datos, un archivo de modelo de aprendizaje automático o un ejecutable al que llama el programa Spark en tiempo de ejecución. Para ello, agregue archivos a archive.zip después de crearlo en el paso 4.

    Para aplicaciones Java:

    1. Descomprima archive.zip.
    2. Agregue los archivos JAR solo en el directorio java/.
    3. Comprima el archivo.
    4. Cargarlo en Object Storage.
    Para aplicaciones Python:
    1. Descomprima archive.zip.
    2. Agregue módulos locales a estos tres subdirectorios del directorio python/:
      python/lib
      python/lib32
      python/lib64
    3. Comprima el archivo.
    4. Cargarlo en el almacén de objetos.
    Nota

    Solo se permiten estos cuatro directorios para almacenar las dependencias de Java y Python.

    Cuando se ejecuta la aplicación Data Flow, el contenido estático está disponible en cualquier nodo del directorio en el que haya decidido colocarlo. Por ejemplo, si ha agregado archivos en python/lib/ en el archivo, están disponibles en el directorio /opt/dataflow/python/lib/ de cualquier nodo.

  7. Cargue archive.zip en el almacén de objetos.
  8. Agregue la biblioteca a la aplicación. Consulte Creación de una aplicación de Data Flow de Java o Scala o Creación de una aplicación de Data Flow de PySpark para obtener información sobre cómo realizarlo.

Estructura del archivo de dependencias

Los archivos de dependencias son archivos ZIP normales. Los usuarios avanzados pueden querer crear archivos con sus propias herramientas en lugar de utilizar el empaquetador de dependencias de Data Flow. Un archivo de dependencia construido correctamente tiene este esquema general:

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 extrae archivos de almacenamiento del directorio /opt/dataflow.

Valide un archivo Archive.zip mediante el empaquetador de dependencias de Data Flow

Puede utilizar el empaquetador de dependencias de Data Flow para validar un archivo archive.zip localmente antes de cargar el archivo en Object Storage.

Vaya al directorio que contiene el archivo archive.zip y ejecute los siguientes comandos, según la unidad:

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

Ejemplo de los archivos Requirements.txt y Packages.txt

Este ejemplo de archivo requirements.txt incluye el SDK para Python versión 2.14.3 de Data Flow en una aplicación de 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
Este ejemplo de archivo requirements.txt incluye una combinación de orígenes de PyPI, orígenes web y orígenes locales para los archivos de paquetes de 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
Para conectarse a bases de datos Oracle como ADW, debe incluir archivos JAR JDBC Oracle. Descargue y extraiga los archivos JAR del controlador compatible en un directorio en el que haya creado el paquete. Por ejemplo, para empaquetar el controlador JDBC de Oracle 18.3 (18c), asegúrese de que todos estos JAR estén presentes:
ojdbc8-18.3.jar
oraclepki-18.3.jar
osdt_cert-18.3.jar
osdt_core-18.3.jar
ucp-18.3.jar