依存関係アーカイブの指定

JavaまたはScalaアプリケーションでは、ファットJARにバンドルできない、バンドルしたくない、バンドルしたくない、バンドルしたくない、バンドルしたくない追加のJARファイルが必要になる場合があります。または、Sparkランタイム内で使用できるように、ネイティブ・コードまたは他のアセットを含めることができます。

spark-submitオプションが機能しない場合、データ・フローには、サードパーティの依存関係をバンドルするためのアプリケーションとともにZIPアーカイブ(archive.zip)を提供するオプションがあります。ZIPアーカイブは、Dockerベースのツールを使用して作成できます。archive.zipは、アプリケーションを実行する前にすべてのSparkノードにインストールされます。archive.zipを正しく構築すると、Pythonライブラリがランタイムに追加され、JARファイルがSparkクラスパスに追加されます。追加されたライブラリは、1つの実行に分離されます。つまり、他の同時実行またはそれ以降の実行に影響を与えません。実行ごとにアーカイブを1つのみ指定できます。

アーカイブ内のものはすべて、データ・フロー・ランタイムと互換性がある必要があります。たとえば、データ・フローは、特定のバージョンのJavaおよびPythonを使用してOracle Linux上で実行されます。他のOS用にコンパイルされたバイナリ・コード、または他のJavaバージョン用にコンパイルされたJARファイルが原因で、実行が失敗する場合があります。データ・フローには、互換性のあるソフトウェアを使用したアーカイブの構築に役立つツールが用意されています。ただし、これらのアーカイブは通常のZipファイルであるため、必要に応じて自由に作成できます。独自のツールを使用する場合は、互換性を確保する必要があります。

依存関係アーカイブは、Sparkアプリケーションと同様に、データ・フローにロードされます。データ・フロー・アプリケーション定義には、実行時に上書きできるこのアーカイブへのリンクが含まれています。アプリケーションを実行すると、Sparkジョブが実行される前にアーカイブがダウンロードおよびインストールされます。アーカイブは実行に対してプライベートです。たとえば、異なる依存関係を使用して同じアプリケーションの2つの異なるインスタンスを同時に実行できますが、競合はありません。依存関係は実行間で永続化されないため、実行する他のSparkアプリケーションの競合バージョンは問題になりません。

データ・フロー依存関係パッケージャを使用した依存関係アーカイブの構築

  1. Dockerをダウンロードします。
  2. パッケージャ・ツール・イメージをダウンロードします:
    ARMの形:
    docker pull phx.ocir.io/axmemlgtri2a/dataflow/dependency-packager-linux_arm64_v8:latest
    AMDの形:
    docker pull phx.ocir.io/axmemlgtri2a/dataflow/dependency-packager-linux_x86_64:latest
  3. Python依存関係の場合は、requirements.txtファイルを作成します。たとえば次のようになります:
    numpy==1.18.1
    pandas==1.0.3
    pyarrow==0.14.0
    ノート

    pysparkまたはpy4jを含めないでください。これらの依存関係は、データ・フローによって提供され、含めると実行が失敗します。
    データ・フロー依存関係パッケージャはPythonのpipツールを使用して、すべての依存関係をインストールします。パブリック・ソースからダウンロードできないPythonホイールがある場合は、パッケージをビルドするディレクトリに配置します。接頭辞/opt/dataflow/を使用して、requirements.txtでそれらを参照します。例:
    /opt/dataflow/<my-python-wheel.whl>

    ここで、<my-python-wheel.whl>はPythonホイールの名前を表します。Pipはこれをローカル・ファイルとして認識し、通常どおりにインストールします。

  4. Java依存関係の場合は、packages.txtというファイルを作成します。たとえば次のようになります:
    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

    データ・フロー依存関係パッケージャは、Apache Mavenを使用して依存関係JARファイルをダウンロードします。パブリック・ソースからダウンロードできないJARファイルがある場合は、パッケージをビルドするディレクトリに配置します。パッケージをビルドする任意のサブディレクトリ内のJARファイルがアーカイブに含まれます。

  5. Dockerコンテナを使用してアーカイブを作成します
    ノート

    Spark 3.5.0を使用する場合はPythonバージョンを3.11に設定し、Spark 3.2.1を使用する場合は3.8、Spark 3.0.2またはSpark 2.4.4を使用する場合は3.6に設定する必要があります。次のコマンドでは、<python_version>はこの数を表します。

    MacOSまたは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>

    Windowsコマンド・プロンプトを管理者として使用する場合は、次のコマンドを使用します:

    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>

    Windows Powershellを管理者として使用する場合は、次のコマンドを使用します:

    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>

    Podmanを使用してアーカイブを作成するには、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>

    これらのコマンドにより、archive.zipというファイルが作成されます。

    作業ディレクトリはpwdで表されます。フラグ-vは、ローカル・ファイル・システムへのdockerボリューム・マッピングを示します。

  6. 静的コンテンツを追加できます。アーカイブに他のコンテンツを含めることもできます。たとえば、Sparkプログラムが実行時にコールするデータ・ファイル、MLモデル・ファイルまたは実行可能ファイルをデプロイできます。これを行うには、ステップ4で作成したファイルをarchive.zipに追加します。

    Javaアプリケーションの場合:

    1. archive.zipを解凍します。
    2. JARファイルをjava/ディレクトリにのみ追加します。
    3. ファイルをZipします。
    4. これをObject Storageにアップロードします。
    Pythonアプリケーションの場合:
    1. archive.zipを解凍します。
    2. ローカル・モジュールをpython/ディレクトリの次の3つのサブディレクトリにのみ追加します:
      python/lib
      python/lib32
      python/lib64
    3. ファイルをZipします。
    4. オブジェクト・ストアにアップロードします。
    ノート

    JavaとPythonの依存関係を格納できるのは、これら4つのディレクトリのみです。

    データ・フロー・アプリケーションが実行されると、配置先を選択したディレクトリの下の任意のノードで静的コンテンツを使用できます。たとえば、アーカイブのpython/lib/の下にファイルを追加した場合、それらのファイルは任意のノードの/opt/dataflow/python/lib/ディレクトリで使用できます。

  7. archive.zipをオブジェクト・ストアにアップロードします。
  8. アプリケーションにライブラリを追加します。この方法は、JavaまたはScalaデータ・フロー・アプリケーションの作成またはPySparkデータ・フロー・アプリケーションの作成を参照してください。

依存関係アーカイブの構造

依存関係アーカイブは通常のZIPファイルです。上級ユーザーは、データ・フロー依存関係パッケージャを使用するのではなく、独自のツールを使用してアーカイブを構築することを選択できます。正しく構築された依存関係アーカイブには、次の一般的なアウトラインがあります:

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>
ノート

データ・フローでは、/opt/dataflowディレクトリの下にアーカイブ・ファイルが抽出されます。

データ・フロー依存関係パッケージャを使用して、Archive.zipファイルを検証します

ファイルをオブジェクト・ストレージにアップロードする前に、データ・フロー依存関係パッチャを使用して、archive.zipファイルをローカルで検証できます。

archive.zipファイルを含むディレクトリに移動し、シェイプに応じて次のコマンドを実行します:

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

Requirements.txtおよびPackages.txtファイルの例

このrequirements.txtファイルの例では、データ・フロー・アプリケーションにデータ・フローSDK for Pythonバージョン2.14.3が含まれています:
-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
このrequirements.txtファイルの例には、Pythonホイール・ファイル用のPyPIソース、Webソースおよびローカル・ソースが混在しています:
-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
ADWなどのOracleデータベースに接続するには、Oracle JDBC JARファイルを含める必要があります。互換性のあるドライバJARファイルをダウンロードし、パッケージをビルドするディレクトリに抽出します。たとえば、Oracle 18.3 (18c) JDBCドライバをパッケージ化するには、次のすべてのJARが存在することを確認します:
ojdbc8-18.3.jar
oraclepki-18.3.jar
osdt_cert-18.3.jar
osdt_core-18.3.jar
ucp-18.3.jar