Kubernetes上でSparkを実行

SparkはKubernetesによって管理されるクラスタ上で実行することができます。この機能はSparkに追加されたnative Kubernetesスケジューラを利用します。

セキュリティ

認証のようなセキュリティ機能はデフォルトでは有効にされていません。インターネットや信頼できないネットワークに開かれたクラスタを配備する場合、認証されていないアプリケーションをクラスタ上で実行することを防ぐためにクラスタへのアクセスを安全にすることが重要です。Sparkを実行する前にSpark セキュリティとこのドキュメントの特定のセキュリティの章を見てください。

ユーザ識別

Dockerfiles が提供するプロジェクトからビルドされたイメージは、デフォルトの UID 185 のデフォルトの USER ディレクティブ が含まれます。これは結果のイメージがコンテナ内でこのUIDとしてSparkプロセスを実行することを意味します。セキュリティを考慮する配備では、カスタムイメージに望ましい非特権UIDとGIDを指定するUSER ディレクティブを提供することを考慮する必要があります。結果の UID は、Spark 実行可能ファイルを実行できるようにするために、補足グループにルートグループを含める必要があります。提供された docker-image-tool.sh スクリプトを使って独自のイメージを構築するユーザは、望ましい UI を指定するために -u <uid> オプションを使うことができます。

あるいは、Pod Template機能を使用して、runAsUserを持つSecurity ContextをSparkがサブミットするポッドに追加することができます。これはイメージ自身の中で USER ディレクティブを上書きするために使うことができます。これはユーザの協力が必要であり、共有環境に適した解決策ではない可能性があることに注意してください。クラスタの管理者はポッドを実行するユーザを制限したい場合に、Pod セキュリティ ポリシーを使う必要があります。

ボリュームのマウント

このドキュメントで後述するように、K8SでのKubernetes ボリュームを使ったSparkは、特定のボリューム型をドライバおよび executorのポッドにマウントできるようにする設定オプションを提供します。特に、Kubernetesのドキュメントに記載されているように、既知のセキュリティ脆弱性を持つhostPathボリュームを許可します。

クラスタの管理者はhostPathヴォリュームを環境に適切にマウントする機能を制限するためにPod セキュリティ ポリシー を使う必要があります。

必要条件

どのように動くか

Spark クラスターコンポーネント

spark-submit はSparkアプリケーションをKubernetesクラスタにサブミットするために直接使うことができます。サブミットの仕組みは以下のように動作します:

完了状態で、ドライバpodは何も計算資源あるいはメモリ資源を使わない事に注意してください。

ドライバとexecutor pode のスケジューリングはKubernetesによって扱われます。Kubernetes API への通信は、fabric8 を使います。設定プロパティを使って node selector によって利用可能なノードのサブセット上でドライバとexecutorのpodをスケジュールすることが可能です。将来のリリースではnode/pod affinitiesのようなより進んだスケジュールのヒントnode/pod affinitiesを使うことが可能でしょう。

Kubernetesへのアプリケーションの提出

Docker Images

Kubernetes はユーザにpod内のコンテナに配備することができるイメージを提供することを要求します。イメージはKubernetesがサポートするコンテナ実行環境内で実行されるように構築されます。DockerはKubernetesと一緒に頻繁に使われるコンテナ実行環境です。Spark (バージョン 2.3から) はこの目的に使うことができるか、個々のアプリケーションの必要に合致するようにカスタマイズされたDockerfileを同梱します。それはkubernetes/dockerfiles/ ディレクトリ内で見つけることができます。

SparkはKubernetesバックエンドと一緒に使うDockerイメージを構築および公開するために使うことができる bin/docker-image-tool.sh スクリプトを同梱します。

使い方の例:

$ ./bin/docker-image-tool.sh -r <repo> -t my-tag build
$ ./bin/docker-image-tool.sh -r <repo> -t my-tag push

これはデフォルトの Dockerfiles が提供するプロジェクトを使ってビルドします。カスタム Dockerfiles の提供など、このツールの動作をカスタマイズするために利用できるオプションを表示するには、-h フラグを付けて実行してください。

デフォルトでは、bin/docker-image-tool.sh は JVMジョブを実行するための docker イメージをビルドします。追加の言語バインディングのDockerイメージをビルドするには、オプトインする必要があります。

使い方の例

# To build additional PySpark docker image
$ ./bin/docker-image-tool.sh -r <repo> -t my-tag -p ./kubernetes/dockerfiles/spark/bindings/python/Dockerfile build

# To build additional SparkR docker image
$ ./bin/docker-image-tool.sh -r <repo> -t my-tag -R ./kubernetes/dockerfiles/spark/bindings/R/Dockerfile build

クラスタ モード

クラスタモードで Spark Piを実行するために、

$ ./bin/spark-submit \
    --master k8s://https://<k8s-apiserver-host>:<k8s-apiserver-port> \
    --deploy-mode cluster \
    --name spark-pi \
    --class org.apache.spark.examples.SparkPi \
    --conf spark.executor.instances=5 \
    --conf spark.kubernetes.container.image=<spark-image> \
    local:///path/to/examples.jar

spark-submitへの--master コマンドライン引数で渡すか、アプリケーション設定の中でspark.masterを設定するかのどちらかで指定されるSparkマスターは、k8s://<api_server_host>:<k8s-apiserver-port>の形式を持つURLでなければなりません。HTTPS ポート 443 であっても、ポートは常に指定する必要があります。マスター文字列にk8s://を前に付けることで、api_server_url.で接続されるAPIサーバを使ってSparkアプリケーションをKubernetesクラスタ上で起動させるでしょう。HTTPプロトコルがURL内で指定されない場合、デフォルトは https です。例えば、マスターをk8s://example.com:443 に設定することは、k8s://https://example.com:443 に設定することと等しいですが、異なるポート上でTLS無しで接続し、マスターはk8s://http://example.com:8080に設定されるでしょう。

Kubernetes モードでは、spark.app.name あるいはspark-submitへの--name引数によって指定されるSparkアプリケーション名がドライバとexecutorのように生成されるKubernetesリソースに名前を付けるためにデフォルトで使われます。ですので、アプリケーション名は英数字の小文字、-. から成る必要があり、英数字で開始および終了しなければなりません。

Kubernetes クラスタ セットアップがある場合、apiサーバのURLを見つける一つの方法はkubectl cluster-infoを実行することです。

$ kubectl cluster-info
Kubernetes master is running at http://127.0.0.1:6443

上の例では、特定のKubernetesクラスタはspark-submitへの引数として--master k8s://http://127.0.0.1:6443で指定することでspark-submitと一緒に使うことができます。更に、Kubernetes APIと通信するために認証プロキシ、kubectl proxy を使うこともできます。

ローカルのプロキシは以下で開始することができます:

$ kubectl proxy

ローカルプロキシが localhost:8001 で実行中の場合、spark-submitの引数として--master k8s://http://127.0.0.1:8001を使うことができます。最後に、上の例ではlocal://のスキーマを持つ特定のURIを使ってjarを指定することに注意してください。このURIは既にDockerイメージ内にあるjarの例の場所です。

クライアントモード

Spark 2.4.0から、Kubernetes上でクライアントモードでSparkアプリケーションを実行することができます。アプリケーションがクライアントモードで実行する時、ドライバーはpod内あるいは物理ホスト上で実行することができます。アプリケーションをクライアントモードで実行する場合、以下の要素を明らかにすることをお勧めします:

クライアントモードのネットワーク

SparkのexecutorはSpark executorから道をたどることが可能なホスト名とポート上でSparkドライバに接続できなければなりません。Sparkがクライアントモードで動作するために必要とされる特定のネットワーク設定はセットアップごとに変わるでしょう。ドライバをKubernetes pod内で実行する場合、ドライバーpodが不変のホスト名によってexecutorから道をたどることができるようにheadless service を使うことができます。headlessサービスを配備する時は、サービスのラベルのセレクタが他のpodではなくドライバーpodだけに一致するようにしてください; ドライバーpodを十分にユニークなラベルに割り当て、headlessサービスのラベルセレクタ内でそのラベルを使うことをお勧めします。spark.driver.host を使ってドライバのホスト名を、sparkドライバのポートをspark.driver.portに指定します。

クライアントモードのexecutor podのガベージコレクション

Sparkドライバをポッド内で実行する場合、spark.kubernetes.driver.pod.nameをそのポッドの名前に設定することを強くお勧めします。このプロパティが設定された場合、SparkのスケジューラはexecutorポッドをOwnerReference付きで配備します。これにより、ドライバのポッドがクラスタから削除されると、アプリケーションの全てのexecutorポッドも削除されます。ドライバはspark.kubernetes.namespaceで指定された名前空間内の指定された名前のポッドを探し、そのポッドを指している OwnerReference が各executorポッドの OwnerReferences リストに追加されます。OwnerReferenceを実際にそのドライバポッドではないポッドに設定しないように注意してください。さもなければ、間違ったポッドが削除された時にexecutorが途中で終了するかもしれません。

アプリケーションがポッド内で実行されていない場合、あるいはアプリケーションが実際にポッド内で実行中の時にspark.kubernetes.driver.pod.name が設定されていない場合、アプリケーションが終了する時にexecutorポッドがクラスタから適切に削除されないかもしれないことに注意してください。Sparkスケジューラはこれらのポッドを削除しようとしますが、もしAPIサーバへのネットワーク リクエストが何らかの理由で失敗した場合、これらのポッドはクラスタ内に残ります。executor プロセスは、それらがドライバに到達できない場合に終了すべきです。つまり、executorポッドはアプリケーションが終了した後でクラスタ内のコンピュータ リソース (CPUとメモリ)を消費すべきではありません。

executorのポッド名を完全に制御するために、spark.kubernetes.executor.podNamePrefixを使うことができます。このプロパティを設定する時は、同じ名前空間内の全てのジョブで壱位にすることを強くお勧めします。

認証のパラメータ

クライアントモードのKubernetes認証パラメータには、正確なプリフィックスspark.kubernetes.authenticateを使ってください。

依存性の管理

アプリケーションの依存がHDFSあるいはHTTPサーバのようなリモートの場所でホストされる場合、それらは適切なリモートURIで参照されるかもしれません。また、アプリケーションの依存は独自のビルドDockerイメージへあらかじめマウントすることができます。それらの依存はDockerファイル内でlocal:// URI および/あるいは SPARK_EXTRA_CLASSPATH環境変数を使って参照されるクラスパスに追加することができます。spark-submit内の独自のビルドDockerイメージ内で依存物を参照する場合、local:// スキーマも必要です。file:// スキーマを使うか、(フルパスを使って)スキーマ無しで、送信クライアントのファイルシステムからの依存関係をサポートします。宛先は Hadoop 互換のファイルシステムでなければなりません。S3 を使った一般的な例では、以下のオプションを渡します:

...
--packages org.apache.hadoop:hadoop-aws:3.2.2
--conf spark.kubernetes.file.upload.path=s3a://<s3-bucket>/path
--conf spark.hadoop.fs.s3a.access.key=...
--conf spark.hadoop.fs.s3a.impl=org.apache.hadoop.fs.s3a.S3AFileSystem
--conf spark.hadoop.fs.s3a.fast.upload=true
--conf spark.hadoop.fs.s3a.secret.key=....
--conf spark.driver.extraJavaOptions=-Divy.cache.dir=/tmp -Divy.home=/tmp
file:///full/path/to/app.jar

アプリケーションの jar ファイルは S3 にアップロードされ、ドライバが起動される時にドライバポッドにダウンロードされ、クラスパスに追加されます。Spark は、並列して実行されている Spark アプリケーションとの競合を避けるために、アップロードパスの下にランダムな名前のサブディレクトリを作成します。ユーザは自分のニーズに応じて作成されたサブディレクトリを管理することができます。

クライアントスキーマはアプリケーション jar、およびプロパティspark.jarsspark.filesおよびspark.archivesで指定された依存関係によってサポートされます。

重要: 全てのクライアント側の依存関係は、フラットなディレクトリ構造で指定されたパスにアップロードされるため、ファイル名はユニークでなければなりません。そうでなければファイルは上書きされます。また、派生した s8s イメージのデフォルトの ivy ディレクトリに必要なアクセス権を持つか、上のように設定を変更するようにしてください。後者では、クラスタモードで --packages を使う場合にも重要です。

秘密鍵の管理

Kubernetes のSecrets はSparkアプリケーションが安全なサービスにアクセスするための証明書を提供するために使うことができます。ユーザ定義の secret をドライバコンテナにマウントするために、ユーザはspark.kubernetes.driver.secrets.[SecretName]=<mount path>形式の設定プロパティを使うことができます。同様に、spark.kubernetes.executor.secrets.[SecretName]=<mount path>形式の設定プロパティは、ユーザ定義のsecretをexecutorのコンテナにマウントするために使うことができます。マウントされるsecretはドライバとexecutor podと同じ名前空間にあると仮定されることに注意してください。例えば、spark-secretという名前のsecretをドライバとexecutorの両方のコンテナのパス/etc/secretsにマウントするには、以下のオプションをspark-submit コマンドに追加してください:

--conf spark.kubernetes.driver.secrets.spark-secret=/etc/secrets
--conf spark.kubernetes.executor.secrets.spark-secret=/etc/secrets

環境変数を介して秘密鍵を使うには、spark-submitコマンドに次のオプションを使用します:

--conf spark.kubernetes.driver.secretKeyRef.ENV_NAME=name:key
--conf spark.kubernetes.executor.secretKeyRef.ENV_NAME=name:key

Pod Template

Kubernetes では、テンプレートファイルからポッドを定義することができます。Spark ユーザは同様にテンプレートファイルを使って、Spark 構成でサポートされないドライバまたは executor のポッド構成を定義することができます。そのためには、spark プロパティ spark.kubernetes.driver.podTemplateFilespark.kubernetes.executor.podTemplateFile を指定して、spark-submit プロセスにアクセスできるファイルを示します。

--conf spark.kubernetes.driver.podTemplateFile=s3a://bucket/driver.yml
--conf spark.kubernetes.executor.podTemplateFile=s3a://bucket/executor.yml

ドライバポッドが executor ポッドテンプレートファイルにアクセスできるようにするために、ファイルは作成時にドライバポッドのボリュームに自動的にマウントされます。Spark は、これらのテンプレートファイルをアンマーシャリングした後で何も検証を行わず、検証は Kubernetes API サーバに依存します。

It is important to note that Spark is opinionated about certain pod configurations so there are values in the pod template that will always be overwritten by Spark. したがって、この機能のユーザは、ポッドテンプレートファイルを指定すると、Sparkはポッドのビルドプロセス中に空のポッドではなくテンプレートファイルポッドでのみ開始できることに注意する必要があります。詳細については、spark によって上書きされるポッドテンプレートの値の完全なリストを見てください。

ポッドテンプレートファイルは複数のコンテナを定義することもできます。このような場合、ドライバまたは executor のベースとしてどのコンテナを使うかを指定するために、spark プロパティ spark.kubernetes.driver.podTemplateContainerNamespark.kubernetes.executor.podTemplateContainerName を使うことができます。指定されない場合、あるいはコンテナ名が無効な場合、Spark はリストの一番最初のコンテナがドライバまたは executor であると想定します。

Kubernetes ボリュームの使用

ユーザは以下の型のKubernetes ボリュームをドライバとexecutorポッドにマウントできます。

NB: ボリュームのマウントに関するセキュリティ問題については、このドキュメントのセキュリティの章を見てください。

上記のいずれかのタイプのボリュームをドライバ ポッドにマウントするには、以下の設定プロパティを使ってください:

--conf spark.kubernetes.driver.volumes.[VolumeType].[VolumeName].mount.path=<mount path>
--conf spark.kubernetes.driver.volumes.[VolumeType].[VolumeName].mount.readOnly=<true|false>
--conf spark.kubernetes.driver.volumes.[VolumeType].[VolumeName].mount.subPath=<mount subPath>

具体的には、VolumeType は、hostPath, emptyDir, nfs およびpersistentVolumeClaim のいずれかの値になります。VolumeName はポッド仕様のvolumesフィールドの下にあるボリュームに使う名前です。

サポートされる各タイプのボリュームは、以下の形式の設定プロパティを使って指定することができる特定の設定オプションを持ちます:

spark.kubernetes.driver.volumes.[VolumeType].[VolumeName].options.[OptionName]=<value>

例えば、ボリューム名がimagesnfsのサーバとパスは、以下のプロパティを使って指定できます:

spark.kubernetes.driver.volumes.nfs.images.options.server=example.com
spark.kubernetes.driver.volumes.nfs.images.options.path=/data

また、ボリューム名checkpointpvcpersistentVolumeClaimのクレーム名は、以下のプロパティを使って指定できます:

spark.kubernetes.driver.volumes.persistentVolumeClaim.checkpointpvc.options.claimName=check-point-pvc-claim

ボリュームをexecutorポッドにマウントするための設定プロパティは、プリフィックスspark.kubernetes.driver.の代わりにspark.kubernetes.executor.を使います。

例えば、以下のように、OnDemandをクレーム名として使い、storageClasssizeLimitオプションを使って、executorごとに動的に作成された永続化ボリュームクレームをマウントできます。これは、動的割り当ての場合に役立ちます。

spark.kubernetes.executor.volumes.persistentVolumeClaim.data.options.claimName=OnDemand
spark.kubernetes.executor.volumes.persistentVolumeClaim.data.options.storageClass=gp
spark.kubernetes.executor.volumes.persistentVolumeClaim.data.options.sizeLimit=500Gi
spark.kubernetes.executor.volumes.persistentVolumeClaim.data.mount.path=/data
spark.kubernetes.executor.volumes.persistentVolumeClaim.data.mount.readOnly=false

サポートされる各種類のボリュームで利用可能なオプションの完全なリストについては、以下のSpark Properties の章を参照してください。

ローカルストレージ

Spark は、シャッフルおよび他の操作時にデータを逃がすためのボリュームをサポートします。ボリュームをストレージとして使うには、ボリューム名は spark-local-dir- で始まる必要があります。例えば:

--conf spark.kubernetes.driver.volumes.[VolumeType].spark-local-dir-[VolumeName].mount.path=<mount path>
--conf spark.kubernetes.driver.volumes.[VolumeType].spark-local-dir-[VolumeName].mount.readOnly=false

特に、ジョブがexecutor内で大規模なシャッフルおよびソートを必要とする場合、永続的なボリュームクレームを使うことができます。

spark.kubernetes.executor.volumes.persistentVolumeClaim.spark-local-dir-1.options.claimName=OnDemand
spark.kubernetes.executor.volumes.persistentVolumeClaim.spark-local-dir-1.options.storageClass=gp
spark.kubernetes.executor.volumes.persistentVolumeClaim.spark-local-dir-1.options.sizeLimit=500Gi
spark.kubernetes.executor.volumes.persistentVolumeClaim.spark-local-dir-1.mount.path=/data
spark.kubernetes.executor.volumes.persistentVolumeClaim.spark-local-dir-1.mount.readOnly=false

もしボリュームがローカルストレージとして設定されていない場合、Spark はシャッフルおよび他の操作時のディスクとして一時的なスクラッチスペースを使います。Kubernetes をリソースマネージャとして使っている場合、ポッドは spark.local.dir または環境変数 SPARK_LOCAL_DIRS にリストされている各ディレクトリにマウントされた emptyDir ボリュームで作成されます。ディレクトリが明示的に指定されない場合は、デフォルトのディレクトリが作成され、適切に構成されます。

emptyDir ボリュームは Kubernetes の一時ストレージ機能を使い、ポッドの生存期間を超えて存続することはありません。

ローカルストレージのためにRAMを使用

emptyDir volumes use the nodes backing storage for ephemeral storage by default, this behaviour may not be appropriate for some compute environments. 例えば、ネットワーク経由でリモートストレージがマウントされたディスクレスノードがある場合、このリモートストレージへの IO を実行する多くの executorr がいると、実際にパフォーマンスが低下する可能性があります。

この場合、構成に spark.kubernetes.local.dirs.tmpfs=true を設定して、emptyDir ボリュームをtmpfs 例えば RAMのボリュームとして構成することが望ましい場合があります。このように設定すると、Spark のローカルストレージの使用量がポッドのメモリ使用量にカウントされるため、spark.kubernetes.memoryOverheadFactor の値を適切に増やして、メモリリクエストを増やしたいかもしれません。

内省とデバッグ

これらは、実行中/完了した Sparkアプリケーションの調査、進捗の監視、処置とは異なる方法です。

アクセス ログ

ログは Kubernetes API と kubectl CLI を使ってアクセスすることができます。Sparkアプリケーションが実行中の場合、以下を使ってアプリケーションからログをストリームすることができます:

$ kubectl -n=<namespace> logs -f <driver-pod-name>

クラスタ内にインストールされている場合は、同じログがKubernetes dashboardを使ってアクセスすることもできます。

Driver UIのアクセス

全てのアプリケーションに関係するUIがkubectl port-forwardを使ってローカルにアクセスすることができます。

$ kubectl port-forward <driver-pod-name> 4040:4040

そして、Sparkドライバ UI はhttp://localhost:4040でアクセスすることができます。

デバッギング

幾つかの種類の障害があるかもしれません。Kubernetes API サーバがspark-submitから作成されたリクエストを拒否、あるいは接続が異なる理由で拒否された場合、サブミットのロジックはエラーに遭遇したことを示す必要があります。しかし、もしアプリケーションを実行中にエラーがあった場合、Kubernetes UIを使って調査することがしばしば一番良い方法です。

ドライバ pod周りで決定されたスケジューリングについての基本的な情報を取得するために、以下を実行することができます:

$ kubectl describe pod <spark-driver-pod>

もしpodが実行時エラーに遭遇した場合、状態は以下を使って更に調査することができます:

$ kubectl logs <spark-driver-pod>

失敗したexecutor podの状態とログは同じ方法で調べることができます。最後に、ドライバ pod の削除は、全てのexecutor、関連するサービスなどを含むspark アプリケーション全体を一掃するでしょう。ドライバ pod はSparkアプリケーションのKubernetes表現と考えることができます。

Kubernetes 機能

設定ファイル

Kubernetes 構成ファイルは通常、ホームディレクトリの .kube/config の下、または環境変数 KUBECONFIG で指定された場所にあります。Kubernetes 上の Spark は、このファイルを使って、Kubernetes クラスタとのやりとりに使われる Kubernetes クライアントの初期自動構成を試みます。クライアント構成をさらにカスタマイズできる、例えば別の認証方法を使う、ようにする様々な構成プロパティが用意されています。

Contexts

Kubernetes 構成ファイルには、異なるクラスタやユーザ ID の切り替えを可能にする、複数のコンテキストを含めることができます。デフォルトでは、Kubernetes 上の Spark は、Kubernetes クライアントの初期自動構成を行う時に、現在のコンテキスト(kubectl config current-context を実行することで確認できる)を使います。

別のコンテキストを使うために、ユーザは Sjpark 構成プロパティ spark.kubernetes.context を介して目的のコンテキストを指定することができます。例えば、spark.kubernetes.context=minikube

名前空間

Kubernetesは名前空間の概念を持ちます。名前空間はクラスタのリソースを複数のユーザ間で(リソース クォータを使って)分ける方法です。Kubernetes上のSparkはSparkアプリケーションを起動するために名前空間を使うことができます。これはspark.kubernetes.namespace設定を利用することで行うことができます。

Kubernetes によりResourceQuota を使って個々の名前空間上にリソース、オブジェクトの数などの制限を設定することができます。名前空間とResourceQuota は管理者によってSparkアプリケーションが実行中のKubernetesクラスタ内で共有とリソースの割り当てを制御するために組み合わせて使うことができます。

RBAC

RBAC を有効にしたKubernetesクラスタ内で、ユーザはKubernetesコンポーネント上の様々なSparkによって使われるKubernetes RBACの役割とサービスアカウントをKubernetes APIサーバにアクセスするために設定することができます。

Spark ドライバ pod はexecutor podを作成および監視するためにKubernetes API サーバにアクセスするためにKubernetesサービスアカウントを使います。ドライバ podによって使われるサービスアカウントはドライバがその作業を行うことができるように適切なパーミッションを持つ必要があります。特に、最小でも、サービスのアカウントはドライバ podがpodとサービスを作成することができる Role あるいは ClusterRole を与えられる必要があります。もしpodが作成された時にサービスのアカウントが指定されない場合には、デフォルトでドライバのpodは自動的に spark.kubernetes.namespaceによって指定される名前空間内でdefaultサービスアカウントを割り当てられます。

デプロイされたKubernetesのバージョンとセットアップに応じて、このdefaultサービス アカウントはデフォルトのKubernetesRBACポリシーの元にドライバ podがpodおよびサービスを作成することができるroleを持つか、あるいは持たないかもしれません。時にはユーザは正しいroleが与えられた独自のサービスアカウントを指定する必要があるかもしれません。Kubernetes上のSparkは設定プロパティ spark.kubernetes.authenticate.driver.serviceAccountName=<service account name>を使ってドライバpodによって使われる独自のサービスアカウントの指定をサポートします。例えば、ドライバpodを作るには、sparkサービスアカウントを使います。ユーザは単純に以下のオプションをspark-submitコマンドに追加します:

--conf spark.kubernetes.authenticate.driver.serviceAccountName=spark

独自のサービスアカウントを作成するために、ユーザはkubectl create serviceaccount コマンドを使うことができます。例えば、以下のコマンドはsparkという名前のサービスアカウントを作成します:

$ kubectl create serviceaccount spark

サービスアカウントに Role あるいは ClusterRole を与えるには、RoleBinding あるいは ClusterRoleBinding が必要です。RoleBinding あるいは ClusterRoleBinding を作成するために、ユーザは kubectl create rolebinding (あるいは ClusterRoleBindingについてはclusterrolebinding) コマンドを使うことができます。例えば、以下のコマンドはdefault名前空間に edit ClusterRoleを作成し、それを上で作成した spark サービスアカウントに与えます:

$ kubectl create clusterrolebinding spark-role --clusterrole=edit --serviceaccount=default:spark --namespace=default

Role は1つの名前空間内で(podsのような) リソースにアクセスを与えるためだけに使うことができることに注意してください。一方、 ClusterRoleは(nodeのような)クラスタスコープのリソースと全ての名前空間に渡った(podsのような)名前空間のリソースにアクセスを与えるために使うことができます。Kubernetes上のSparkについては、ドライバは常に同じ名前空間にexecutor podを作成するため、Role で十分ですが、ユーザは代わりにClusterRoleを使うかもしれません。RBAC認証についての詳細な情報とpodのためにKubernetesサービスアカウントを設定する方法については、RBAC 認証の使用Podのためのサービスアカウントの設定を参照してください。

Spark アプリケーション管理

Kubernetes はクラスタモードの spark-submit CLI ツールを介してシンプルなアプリケーション管理を提供します。ユーザはジョブを送信する時に出力されるサブミッション ID を提供することで、ジョブを強制終了することができます。サブミッション ID は namespace:driver-pod-name の形式に従います。ユーザが名前空間を省略すると、現在の k8s コンテキストで設定されている名前空間が使われます。例えば、ユーザが kubectl config set-context minikube --namespace=spark のように特定の名前空間を設定した場合、デフォルトで spark 名前空間が使われます。一方で、特定のコンテキストに名前空間が追加されていない場合、デフォルトで全ての名前空間が考慮されます。つまり、名前空間に関係なく、指定されたサブミッション ID に一致する全てのアプリケーションに操作が影響することを意味します。さらに、アプリケーション管理用の spark-submit はドライバを送信するために使われる同じバックエンドコードを使います。つまり、spark.kubernetes.context などのような同じプロパティが再利用できます。

例えば:

$ spark-submit --kill spark:spark-pi-1547948636094-driver --master k8s://https://192.168.2.8:8443

ユーザは --status フラグを使ってアプリケーションの状態を一覧表示することもできます:

$ spark-submit --status spark:spark-pi-1547948636094-driver --master  k8s://https://192.168.2.8:8443

どちらの操作も glob パターンをサポートします。例えば、ユーザは以下を実行することができます:

$ spark-submit --kill spark:spark-pi* --master  k8s://https://192.168.2.8:8443

上記は特定のプレフィックスを持つ全てのアプリケーションを強制終了します。

ユーザは、spark.kubernetes.appKillPodDeletionGracePeriod プロパティを使ってポッド終了の猶予期間を指定することができます。これを提供する手段として --conf を使うことができます (全ての K8s ポッドのデフォルト値は30秒です)。

将来の作業

現在作業中あるいは作業予定の幾つかのSpark on Kubernetesの機能があります。これらの機能は、最終的にspark-kubernetes統合の将来のバージョンに組み込まれる予定です。

これらの幾つかには、以下が含まれます:

設定

Sparkの設定の情報については 設定ページを見てください。以下の設定はKubernetes上のSparkに固有です。

Sparkのプロパティ

</tr> </table> #### ポッドテンプレートプロパティ sparkによって上書きされるポッド仕様の完全なリストについては、以下の表を参照してください。### Pod Metadata
プロパティ名デフォルト意味これ以降のバージョンから
spark.kubernetes.context (none) Kubernetes クライアントライブラリの初期自動構成に使われるユーザ Kubernetes 構成ファイルのコンテキスト。指定しない場合、ユーザの現在のコンテキストが使われます。NB: 自動構成された設定の多くは、他の Spark 構成プロパティを使って上書きすることができます。例えば spark.kubernetes.namespace 3.0.0
spark.kubernetes.driver.master https://kubernetes.default.svc ドライバが executor を要求するために使われる内部的な Kubernetes マスター(API サーバ)のアドレス。 3.0.0
spark.kubernetes.namespace デフォルト: ドライバとexecutor podを実行するために使われる名前空間。 2.3.0
spark.kubernetes.container.image (none) Sparkアプリケーションのために使うコンテナのイメージ。これは通常はexample.com/repo/spark:v1.0.0の形式です。明示的なイメージがそれぞれ異なるコンテナタイプについて提供されない場合は、この設定はユーザによって必要とされ提供されなければなりません 2.3.0
spark.kubernetes.driver.container.image (spark.kubernetes.container.image の値) ドライバのために使用する独自のコンテナイメージ。 2.3.0
spark.kubernetes.executor.container.image (spark.kubernetes.container.image の値) executorのために使用する独自のコンテナイメージ。 2.3.0
spark.kubernetes.container.image.pullPolicy IfNotPresent Kubernetes内でイメージをプルする時に使われるコンテナイメージのプル ポリシー。有効な値は、Always, Never, IfNotPresentです。 2.3.0
spark.kubernetes.container.image.pullSecrets プライベート イメージ レジストリからイメージをプルするために使われるKubernetesの秘密鍵のカンマ区切りのリスト。 2.4.0
spark.kubernetes.allocation.batch.size 5 executor pod 割り当ての各回で一時に起動するpodの数。 2.3.0
spark.kubernetes.allocation.batch.delay 1s executorのpod割り当ての各回の間で待つ時間。1秒未満の値を指定するとsparkドライバ上での過度なCPUの使用率に繋がるかもしれません。 2.3.0
spark.kubernetes.authenticate.submission.caCertFile (none) ドライバを開始する時のTLS上でKubernetes APIサーバに接続するためのCA証明書ファイルのパス。このファイルはサブミットするマシーンのディスク上になければなりません。URIに対するパスとしてこれを指定します (つまりスキーマを与えないでください)。クライアントモードでは、代わりにspark.kubernetes.authenticate.caCertFileを使ってください。 2.3.0
spark.kubernetes.authenticate.submission.clientKeyFile (none) ドライバを開始する時にKubernetes APIサーバに対する認証のためのクライアント キー ファイルへのパス。このファイルはサブミットするマシーンのディスク上になければなりません。URIに対するパスとしてこれを指定します (つまりスキーマを与えないでください)。クライアントモードでは、代わりにspark.kubernetes.authenticate.clientKeyFileを使ってください。 2.3.0
spark.kubernetes.authenticate.submission.clientCertFile (none) ドライバを開始する時にKubernetes APIサーバに対する認証のためのクライアント証明書ファイルへのパス。このファイルはサブミットするマシーンのディスク上になければなりません。URIに対するパスとしてこれを指定します (つまりスキーマを与えないでください)。クライアントモードでは、代わりにspark.kubernetes.authenticate.clientCertFileを使ってください。 2.3.0
spark.kubernetes.authenticate.submission.oauthToken (none) ドライバを開始する時にKubernetes APIサーバに対する認証時に使うOAuthトークン。他の認証オプションと異なり、これは認証のために使われるトークンの正確な文字列値であることを期待されることに注意してください。クライアントモードでは、代わりにspark.kubernetes.authenticate.oauthTokenを使ってください。 2.3.0
spark.kubernetes.authenticate.submission.oauthTokenFile (none) ドライバを開始する時にKubernetes APIサーバに対する認証時に使うトークンを含んでいるOAuthトークンファイルへのパス。このファイルはサブミットするマシーンのディスク上になければなりません。URIに対するパスとしてこれを指定します (つまりスキーマを与えないでください)。クライアントモードでは、代わりにspark.kubernetes.authenticate.oauthTokenFileを使ってください。 2.3.0
spark.kubernetes.authenticate.driver.caCertFile (none) executorをリクエストする時にドライバpodからTLS上でKubernetes APIサーバへ接続するためのCA証明書ファイルへのパス。このファイルはサブミットするマシーンのディスク上になければならず、ドライバpodへアップロードされるでしょう。URIに対するパスとしてこれを指定します (つまりスキーマを与えないでください)。クライアントモードでは、代わりにspark.kubernetes.authenticate.caCertFileを使ってください。 2.3.0
spark.kubernetes.authenticate.driver.clientKeyFile (none) executorをリクエストする時にドライバpodからKubernetes APIサーバに対する認証のためのクライアント キー ファイルへのパス。このファイルはサブミットするマシーンのディスク上になければならず、ドライバpodへKubernetesの秘密鍵としてアップロードされるでしょう。URIに対するパスとしてこれを指定します (つまりスキーマを与えないでください)。クライアントモードでは、代わりにspark.kubernetes.authenticate.clientKeyFileを使ってください。 2.3.0
spark.kubernetes.authenticate.driver.clientCertFile (none) executorをリクエストする時にドライバpodからKubernetes APIサーバに対する認証のためのクライアント証明書ファイルへのパス。このファイルはサブミットするマシーンのディスク上になければならず、ドライバpodへKubernetesの秘密鍵としてアップロードされるでしょう。URIに対するパスとしてこれを指定します (つまりスキーマを与えないでください)。クライアントモードでは、代わりにspark.kubernetes.authenticate.clientCertFileを使ってください。 2.3.0
spark.kubernetes.authenticate.driver.oauthToken (none) executorをリクエストする時にドライバpodからKubernetes APIサーバに対する認証時に使われるOAuthトークン。他の認証オプションと異なり、これは認証のために使われるトークンの正確な文字列値でなければならないことに注意してください。このトークン値はドライバpodにKubernetesの秘密鍵としてアップロードされます。クライアントモードでは、代わりにspark.kubernetes.authenticate.oauthTokenを使ってください。 2.3.0
spark.kubernetes.authenticate.driver.oauthTokenFile (none) executorをリクエストする時にドライバpodからKubernetes APIサーバに対して認証時に使うトークンを含むOAuthトークンファイルへのパス。他の認証オプションと異なり、このファイルは認証のために使われるトークンの正確な文字列値を含まなければならないことに注意してください。このトークン値はドライバpodに秘密鍵としてアップロードされます。クライアントモードでは、代わりにspark.kubernetes.authenticate.oauthTokenFileを使ってください。 2.3.0
spark.kubernetes.authenticate.driver.mounted.caCertFile (none) executorをリクエストする時にドライバpodからTLS上でKubernetes APIサーバへ接続するためのCA証明書ファイルへのパス。このパスはドライバpodからアクセス可能でなければなりません。URIに対するパスとしてこれを指定します (つまりスキーマを与えないでください)。クライアントモードでは、代わりにspark.kubernetes.authenticate.caCertFileを使ってください。 2.3.0
spark.kubernetes.authenticate.driver.mounted.clientKeyFile (none) executorをリクエストする時にドライバpodからKubernetes APIサーバに対する認証のためのクライアント キー ファイルへのパス。このパスはドライバpodからアクセス可能でなければなりません。URIに対するパスとしてこれを指定します (つまりスキーマを与えないでください)。クライアントモードでは、代わりにspark.kubernetes.authenticate.clientKeyFileを使ってください。 2.3.0
spark.kubernetes.authenticate.driver.mounted.clientCertFile (none) executorをリクエストする時にドライバpodからKubernetes APIサーバに対する認証のためのクライアント証明書ファイルへのパス。このパスはドライバpodからアクセス可能でなければなりません。URIに対するパスとしてこれを指定します (つまりスキーマを与えないでください)。クライアントモードでは、代わりにspark.kubernetes.authenticate.clientCertFileを使ってください。 2.3.0
spark.kubernetes.authenticate.driver.mounted.oauthTokenFile (none) executorをリクエストする時にドライバpodからKubernetes APIサーバに対して認証時に使うOAuthトークンを含むファイルへのパス。このパスはドライバpodからアクセス可能でなければなりません。他の認証オプションと異なり、このファイルは認証のために使われるトークンの正確な文字列値を含まなければならないことに注意してください。クライアントモードでは、代わりにspark.kubernetes.authenticate.oauthTokenFileを使ってください。 2.3.0
spark.kubernetes.authenticate.driver.serviceAccountName デフォルト: ドライバpodを実行する時に使われるサービスアカウント。APIサーバからexecutor podをリクエストする時に、ドライバpodはこのサービスアカウントを使います。これはCA証明書ファイル、クライアント キー ファイル、クライアント証明書ファイル および/あるいはOAuthトークンと一緒に指定できないことに注意してください。クライアントモードでは、代わりにspark.kubernetes.authenticate.serviceAccountNameを使ってください。 2.3.0
spark.kubernetes.authenticate.executor.serviceAccountName (spark.kubernetes.authenticate.driver.serviceAccountNameの値) executorポッドを実行する時に使われるサービスアカウント。パラメータがセットアップされない場合、フォールバックロジックはドライバのサービスアカウントを使います。 3.1.0
spark.kubernetes.authenticate.caCertFile (none) クライアントモードでは、executorを要求する時にTLS経由で Kubernetes API サーバに接続するためのCA証明書ファイルへのパス。URIに対するパスとしてこれを指定します (つまりスキーマを与えないでください)。 2.4.0
spark.kubernetes.authenticate.clientKeyFile (none) クライアントモードでは、executorを要求する時に Kubernetes API サーバに対して認証するためのクライアント キーファイルへのパス。URIに対するパスとしてこれを指定します (つまりスキーマを与えないでください)。 2.4.0
spark.kubernetes.authenticate.clientCertFile (none) クライアントモードでは、executorを要求する時に Kubernetes API サーバに対して認証するためのクライアント証明書ファイルへのパス。URIに対するパスとしてこれを指定します (つまりスキーマを与えないでください)。 2.4.0
spark.kubernetes.authenticate.oauthToken (none) クライアントモードでは、executorを要求する時に Kubernetes API サーバに対して認証する時に使用するOAuthトークン。他の認証オプションと異なり、これは認証のために使われるトークンの正確な文字列値でなければならないことに注意してください。 2.4.0
spark.kubernetes.authenticate.oauthTokenFile (none) クライアントモードでは、executorを要求する時に Kubernetes API サーバに対して認証する時に使用するOAuthトークンを含むファイルへのパス。 2.4.0
spark.kubernetes.driver.label.[LabelName] (none) LabelNameによって指定されるラベルをドライバpodに追加する。例えば、spark.kubernetes.driver.label.something=true。Sparkは記録のためにドライバpodに独自のラベルも追加することに注意してください。 2.3.0
spark.kubernetes.driver.annotation.[AnnotationName] (none) AnnotationName で指定される Kubernetes annotation をドライバポッドに追加する。例えば、spark.kubernetes.driver.annotation.something=true 2.3.0
spark.kubernetes.driver.service.annotation.[AnnotationName] (none) AnnotationName で指定される Kubernetes annotation をドライバサービスに追加する。例えば、spark.kubernetes.driver.service.annotation.something=true 3.0.0
spark.kubernetes.executor.label.[LabelName] (none) LabelNameによって指定されるラベルをexecutor podに追加する。例えば、spark.kubernetes.executor.label.something=true。Spark は予約のために独自のラベルを executor にも追加することに注意してください。 2.3.0
spark.kubernetes.executor.annotation.[AnnotationName] (none) AnnotationName によって指定される Kubernetes annotation を executor ポッドに追加する。例えば、spark.kubernetes.executor.annotation.something=true 2.3.0
spark.kubernetes.driver.pod.name (none) ドライバ podの名前。クラスタモードでは、もし設定されない場合、名前の衝突を避けるためにドライバpod名は現在のタイムスタンプが後についた"spark.app.name"に設定されます。クライアントモードでは、もしアプリケーションがpod内で実行している場合、これをドライバが実行しているpodの名前に設定することをお勧めします。クライアントモードでこの値を設定すると、ドライバは executor ポッドの所有者になることができ、executor ポッドがクラスタによってガベージコレクションされるようにできます。 2.3.0
spark.kubernetes.executor.podNamePrefix (none) Prefix to use in front of the executor pod names. 2.3.0
spark.kubernetes.executor.lostCheck.maxAttempts 10 ドライバが特定のexecutorについて喪失の理由の突き止めようとする回数。喪失の理由は、executorの障害がフレームワークまたはアプリケーションエラーのいずれに起因するかを確認するために使われ、executorが削除され交換されるか、デバッグのために障害状態のままでいるかを決定します。 2.3.0
spark.kubernetes.submission.waitAppCompletion true クラスタモードで、起動プロセスが終了する前にアプリケーションが終了するのを待つかどうか。falseに変更された場合、ランチャーはSparkジョブを開始する時に"fire-and-forget"の挙動をします。 2.3.0
spark.kubernetes.report.interval 1s クラスタモードでの現在のSparkジョブのステータスを報告する間隔。 2.3.0
spark.kubernetes.executor.apiPollingInterval 30s executorの状態を調査するためにKubernetes APIをポーリングする間隔。 2.4.0
spark.kubernetes.driver.request.cores (none) ドライバポッドのための CPU リクエストを指定します。値は Kubernetes の規約に準拠します。値の例としては 0.1, 500m, 1.5, 5 などがあり、cpuユニットの定義はCPU ユニットに記載されています。これは、設定されている場合、ドライバーポッド cpu リクエストを指定するために、spark.driver.cores よりも優先されます。 3.0.0
spark.kubernetes.driver.limit.cores (none) ドライバーpodのための cpu limit を指定します。 2.3.0
spark.kubernetes.executor.request.cores (none) 各executor podのためにcpuリクエストを指定します。値は Kubernetes の規約に準拠します。値の例としては 0.1, 500m, 1.5, 5 などがあり、cpuユニットの定義はCPU ユニットに記載されています。これはspark.executor.coresとは異なります: 設定されている場合はexecutorポッドのCPUリクエストを指定するためにのみ使われspark.executor.coresよりも優先されます。タスクの並行度、例えば executorが同時に実行できるタスクの数は、これに影響をうけません。 2.4.0
spark.kubernetes.executor.limit.cores (none) Sparkアプリケーションのために起動された各executor podのための hard cpu limitを指定します。 2.3.0
spark.kubernetes.node.selector.[labelKey] (none) キーlabelKeyと値を設定値として持つ、ドライバpodとexecutor podのノード セレクタを追加します。 例えば、spark.kubernetes.node.selector.identifiermyIdentifier に設定するとdriver podとexecutor がキー identifier と値myIdentifierを持つようになります。このプリフィックスを使って複数の設定を設定することで、複数のノード セレクタ キーを追加することができます。 2.3.0
spark.kubernetes.driverEnv.[EnvironmentVariableName] (none) EnvironmentVariableNameによって指定される環境変数をドライバのプロセスに追加します。ユーザは複数の環境変数を設定するために複数のそれらを指定することができます。 2.3.0
spark.kubernetes.driver.secrets.[SecretName] (none) 値の中で指定されたパス上のドライバのpodへSecretName という名前のKubernetes Secretを追加します。例えば、spark.kubernetes.driver.secrets.spark-secret=/etc/secrets 2.3.0
spark.kubernetes.executor.secrets.[SecretName] (none) 値の中で指定されたパス上のexecutorのpodへSecretName という名前のKubernetes Secretを追加します。例えば、spark.kubernetes.executor.secrets.spark-secret=/etc/secrets 2.3.0
spark.kubernetes.driver.secretKeyRef.[EnvName] (none) EnvName (大文字と小文字を区別) という名前を持つドライバコンテナに環境変数として追加します。この値は、Kubernetes Secret で参照されるデータ内のキー key で参照されます。例えば、spark.kubernetes.driver.secretKeyRef.ENV_VAR=spark-secret:key 2.4.0
spark.kubernetes.executor.secretKeyRef.[EnvName] (none) EnvName (大文字と小文字を区別) という名前を持つ executor コンテナに環境変数として追加します。この値は、Kubernetes Secret で参照されるデータ内のキー key で参照されます。例えば、spark.kubernetes.executor.secrets.ENV_VAR=spark-secret:key 2.4.0
spark.kubernetes.driver.volumes.[VolumeType].[VolumeName].mount.path (none) VolumeType型のVolumeNameという名前のKubernetes ボリューム を、値で指定されたパス上のドライバ ポッドに追加します。例えば、spark.kubernetes.driver.volumes.persistentVolumeClaim.checkpointpvc.mount.path=/checkpoint 2.4.0
spark.kubernetes.driver.volumes.[VolumeType].[VolumeName].mount.subPath (none) ボリュームからドライバーポッドにマウントされる subpath を指定します。spark.kubernetes.driver.volumes.persistentVolumeClaim.checkpointpvc.mount.subPath=checkpoint. 3.0.0
spark.kubernetes.driver.volumes.[VolumeType].[VolumeName].mount.readOnly (none) マウントされたボリュームが読み込みのみかそうでないかを指定します。例えば、spark.kubernetes.driver.volumes.persistentVolumeClaim.checkpointpvc.mount.readOnly=false 2.4.0
spark.kubernetes.driver.volumes.[VolumeType].[VolumeName].options.[OptionName] (none) 指定された値を持つキーとして、OptionNameを使ってKubernetesに渡されるKubernetes ボリュームを設定します。Kubernetes のオプション形式に従う必要があります。例えば、spark.kubernetes.driver.volumes.persistentVolumeClaim.checkpointpvc.options.claimName=spark-pvc-claim 2.4.0
spark.kubernetes.executor.volumes.[VolumeType].[VolumeName].mount.path (none) VolumeType型のVolumeNameという名前のKubernetes ボリューム を、値で指定されたパス上のexecutor ポッドに追加します。例えば、spark.kubernetes.executor.volumes.persistentVolumeClaim.checkpointpvc.mount.path=/checkpoint 2.4.0
spark.kubernetes.executor.volumes.[VolumeType].[VolumeName].mount.subPath (none) ボリュームから executor ポッドにマウントされる subpath を指定します。spark.kubernetes.executor.volumes.persistentVolumeClaim.checkpointpvc.mount.subPath=checkpoint. 3.0.0
spark.kubernetes.executor.volumes.[VolumeType].[VolumeName].mount.readOnly false マウントされたボリュームが読み込みのみかそうでないかを指定します。例えば、spark.kubernetes.executor.volumes.persistentVolumeClaim.checkpointpvc.mount.readOnly=false 2.4.0
spark.kubernetes.executor.volumes.[VolumeType].[VolumeName].options.[OptionName] (none) 指定された値を持つキーとして、OptionNameを使ってKubernetesに渡されるKubernetes ボリュームを設定します。例えば、spark.kubernetes.executor.volumes.persistentVolumeClaim.checkpointpvc.options.claimName=spark-pvc-claim 2.4.0
spark.kubernetes.local.dirs.tmpfs false Configure the emptyDir volumes used to back SPARK_LOCAL_DIRS within the Spark driver and executor pods to use tmpfs backing i.e. RAM. See Local Storage earlier on this page for more discussion of this. 3.0.0
spark.kubernetes.memoryOverheadFactor 0.1 これは非JVMメモリにメモリを割り当てるメモリ オーバーヘッド係数を設定します。非JVMメモリには、オフヒープメモリ割り当て、非JVMタスク、そして様々なシステムプロセスが含まれます。JVMベースのジョブについては、この値はデフォルトで 0.10で、非JVMジョブについては 0.40 です。非JVMタスクはより多くの非JVMヒープ空間を必要とし、そのようなタスクは一般的に "Memory Overhead Exceeded" エラーで失敗するためにこれが行われます。This preempts this error with a higher default. 2.4.0
spark.kubernetes.pyspark.pythonVersion "3" これは、ドライバとexecutorのコンテナを実行するために使われるdockerイメージのPythonのメジャー バージョンを設定します。"3"のみにすることができます。この設定はSpark 3.1.0から非推奨になり、事実上何も動作しません。ユーザは、'spark.pyspark.python'と'spark.pyspark.driver.python'の設定、または'PYSPARK_PYTHON'と'PYSPARK_DRIVER_PYTHON'環境変数を設定する必要があります。 2.4.0
spark.kubernetes.kerberos.krb5.path (none) Kerberos とのやりとりのために、ドライバと executor にマウントされる krb5.conf ファイルのローカルの場所を指定します。定義された KDC はコンテナ内部から見えるようにする必要があることに注意してください。 3.0.0
spark.kubernetes.kerberos.krb5.configMapName (none) Kerberos とのやりとりのために、ドライバと executor にマウントされる krb5.conf ファイルを含む ConfigMap の名前をしています。定義された KDC はコンテナ内部から見えるようにする必要があります。ConfigMap もドライバと executor ポッドの同じ名前空間にある必要があります。 3.0.0
spark.kubernetes.hadoop.configMapName (none) HADOOP_CONF_DIR ファイルを含む、ConfigMap の名前を指定し、カスタム Hadoop 構成のドライバと executor にマウントします。 3.0.0
spark.kubernetes.kerberos.tokenSecret.name (none) 既存の移譲トークンが格納されている秘密鍵の名前を指定します。これにより、ジョブのユーザがジョブを起動するための kerberos 証明書を提供する必要が無くなります。 3.0.0
spark.kubernetes.kerberos.tokenSecret.itemKey (none) 既存の移譲トークンが格納されているデータの項目キーを指定します。これにより、ジョブのユーザがジョブを起動するための kerberos 証明書を提供する必要が無くなります。 3.0.0
spark.kubernetes.driver.podTemplateFile (none) ドライバの pod テンプレートを含むローカルファイルを指定します。例えば、spark.kubernetes.driver.podTemplateFile=/path/to/driver-pod-template.yaml 3.0.0
spark.kubernetes.driver.podTemplateContainerName (none) 指定されたポッドテンプレートでドライバのベースとして使われるコンテナ名を指定します。例えば、spark.kubernetes.driver.podTemplateContainerName=spark-driver 3.0.0
spark.kubernetes.executor.podTemplateFile (none) executor の pod テンプレートを含むローカルファイルを指定します。例えば、spark.kubernetes.executor.podTemplateFile=/path/to/executor-pod-template.yaml 3.0.0
spark.kubernetes.executor.podTemplateContainerName (none) 指定されたポッドテンプレートで executor のベースとして使われるコンテナ名を指定します。例えば、spark.kubernetes.executor.podTemplateContainerName=spark-executor 3.0.0
spark.kubernetes.executor.deleteOnTermination true 障害または正常終了の場合に、executor ポッドが削除されなければならないかを指定します。 3.0.0
spark.kubernetes.executor.checkAllContainers false ポッドの状態を決定する時に、executorポッドが(サイドカーを含む)全てのコンテナを調査するか、executorコンテナのみを調査するかを指定します。 3.1.0
spark.kubernetes.submission.connectionTimeout 10000 kubernetes クライアントがドライバの起動に使用する接続タイムアウトのミリ秒。 3.0.0
spark.kubernetes.submission.requestTimeout 10000 kubernetes クライアントがドライバの起動に使用するリクエストタイムアウトのミリ秒。 3.0.0
spark.kubernetes.driver.connectionTimeout 10000 executor をリクエストする時にドライバ内の kubernetes が使用する接続タイムアウトのミリ秒。 3.0.0
spark.kubernetes.driver.requestTimeout 10000 executor をリクエストする時にドライバ内の kubernetes が使用するリクエストタイムアウトのミリ秒。 3.0.0
spark.kubernetes.appKillPodDeletionGracePeriod (none) spark-submit を使用して Spark アプリケーションを削除する時の猶予時間を秒で指定します。 3.0.0
spark.kubernetes.dynamicAllocation.deleteGracePeriod 5s 強制的にkillする前に、executorがgracefullyにシャットダウンするためにどれだけ待つか。 3.0.0
spark.kubernetes.file.upload.path (none) クラスタモードの spark submit 側でファイルを保持するパス。例えば: spark.kubernetes.file.upload.path=s3a://<s3-bucket>/path ファイルは file://path/to/file または絶対パスとして指定する必要があります。 3.0.0
spark.kubernetes.executor.scheduler.name</td> (none) Specify the scheduler name for each executor pod. 3.0.0
spark.kubernetes.configMap.maxSize 1572864 設定マップのための最大サイズ制限。これは、k8sサーバエンドのlimitごとに設定可能です。 3.1.0
spark.kubernetes.executor.missingPodDetectDelta 30s 登録されたexecutorのPODがKubernetes APIサーバのポーリングされたPODのリストの中に無い場合、このデルタ時間は登録時間とポーリング時間の間の許容された時間差と見なされます。この時間の後、PODはクラスタから欠落していると見なされ、executorは削除されます。 3.1.1
spark.kubernetes.decommission.script /opt/decom.sh gracefulな廃止のために使うスクリプトの場所。 3.2.0
spark.kubernetes.driver.service.deleteOnTermination true trueの場合、ドライバサービスはSparkアプリケーションの終了時に削除されます。falseの場合、ドライバサービスはドライバポッドが削除される時にクリーンアップされます。 3.2.0
spark.kubernetes.driver.ownPersistentVolumeClaim false trueの場合、executorポッドではなく、ドライバポッドがオンデマンドの永続的なボリュームクレームになります。 3.2.0
spark.kubernetes.driver.reusePersistentVolumeClaim false trueの場合、ドライバポッドは、削除されたexecutorポッドのドライバ所有のオンデマンド永続化ボリュームクレームが存在すればそれを再利用しようとします。これは永続的なボリュームの作成のスキップすることにより、executorポッドの作成の遅延を減らすのに役立ちます。`Terminating`のポッドステータスのポッドは、定義上削除されたポッドではなく、永続化ボリュームクレームを含むそのリソースはまだ再利用できないことに注意してください。再利用可能な永続化ボリュームクレームが存在しない場合、Sparkは新しい永続化ボリュームクレームを作成します。つまり、永続化ボリュームクレームの総数は、実行中のexecutorの数よりも多くなる場合があります。この設定は、spark.kubernetes.driver.ownPersistentVolumeClaim=trueが必要です。 3.2.0
spark.kubernetes.executor.disableConfigMap false trueの場合、executorのためのConfigMap作成を無効にします。 3.2.0
spark.kubernetes.driver.pod.featureSteps (none) `KubernetesFeatureConfigStep`を実装する追加のドライバポッド機能ステップのクラス名。これは開発者用APIです。カンマ区切り。Sparkの全ての内部機能ステップの後で実行されます。 3.2.0
spark.kubernetes.executor.pod.featureSteps (none) `KubernetesFeatureConfigStep`を実装する追加のexecutorポッド機能ステップのクラス名。これは開発者用APIです。カンマ区切り。Sparkの全ての内部機能ステップの後で実行されます。 3.2.0
spark.kubernetes.allocation.maxPendingPods Int.MaxValue このアプリケーションのexecutor割り当て中に許可される保留中のポッドの最大数。Kubernetesにとってまだ不明な、新しくリクエストされたexecutorも、時間の経過とともに保留中のポッドに変換されるため、この制限にカウントされます。この制限は、使われる全てのリソースプロファイルの全ての割り当ての合計を制限するため、リソースプロファイルから独立しています。 3.2.0
spark.kubernetes.allocation.executor.timeout 600s 新しく作成されたexecutorポッドリクエストが、まだポッド保留状態に達していない場合、タイムアウトと見なされて削除されるまで待機する時間。 3.1.0
spark.kubernetes.allocation.driver.readinessTimeout 1s executorポッドを作成する前に、ドライバポッドの準備が整うのを待つ時間。この待機は、アプリケーションの起動時にのみ発生します。タイムアウトが発生した場合でも、executorポッドは作成されます。 3.1.3
ポッドメタデータキー修正値説明
名前 spark.kubernetes.driver.pod.name の値 ドライバポッド名は設定済みまたはデフォルト値の spark.kubernetes.driver.pod.name で上書きされます。executor ポッド名は影響を受けません。
名前空間 spark.kubernetes.namespace の名前 Spark はドライバと executor の名前空間について強力な前提を持っています。ドライバと executor の名前空間は、構成済みあるいはデフォルトの spark 構成値によって置き換えられます。
ラベル spark.kubernetes.{driver,executor}.label.* からラベルを追加します Spark は spark 構成によって指定される追加のラベルを追加します。
注釈 spark.kubernetes.{driver,executor}.annotation.* から注釈を追加します Spark は spark 構成によって指定される追加の注釈を追加します。
### Pod Spec
ポッド仕様キー修正値説明
imagePullSecrets spark.kubernetes.container.image.pullSecrets から画像プル秘密鍵を追加します 追加のプル秘密鍵が、spark 構成から両方の executor ポッドに追加されます。
nodeSelector spark.kubernetes.node.selector.* からノードセレクタを追加します 追加のノードセレクタが、spark 構成から両方の executor ポッドに追加されます。
restartPolicy "never" Spark はドライバと executor の両方が再起動しないことを前提としています。
serviceAccount spark.kubernetes.authenticate.driver.serviceAccountName の値 Spark は、ドライバポッドのみ、および spark 構成が指定されている場合のみ、spark 構成の値で serviceAccount を上書きします。executor ポッドは影響を受けません。
serviceAccountName spark.kubernetes.authenticate.driver.serviceAccountName の値 Spark は、ドライバポッドのみ、および spark 構成が指定されている場合のみ、spark 構成の値で serviceAccountName を上書きします。executor ポッドは影響を受けません。
volumes spark.kubernetes.{driver,executor}.volumes.[VolumeType].[VolumeName].mount.path からボリュームを追加します Spark は、spark 構成で指定されたボリュームと、spark 構成とポッドテンプレートファイルを渡すために必要な追加のボリュームを追加します。
### コンテナ仕様 以下はドライバとexecutorコンテナに影響します。ポッド仕様の他の全てのコンテナは影響を受けません。
コンテナ仕様キー修正値説明
env spark.kubernetes.driverEnv.[EnvironmentVariableName] から環境変数を追加します Spark は、spark.kubernetes.driverEnv.[EnvironmentVariableName] からドライバ環境変数と、spark.executorEnv.[EnvironmentVariableName] から executor 環境変数を追加します。
image spark.kubernetes.{driver,executor}.container.image の値 画像は spark 構成によって定義されます。
imagePullPolicy spark.kubernetes.container.image.pullPolicy の値 Spark はドライバと executor の両方のプルポリシーを上書きします。
名前 詳細を見てください コンテナ名は、ポッドテンプレートで定義されていない場合、spark (ドライバコンテナの場合 "spark-kubernetes-executor"、各 executor の場合 "executor") によって割り当てられます。コンテナがテンプレートによって定義されている場合は、テンプレート名が使われます。
resources 詳細を見てください CPU 制限は、spark.kubernetes.{driver,executor}.limit.cores によって設定されます。cpu は spark.{driver,executor}.cores によって設定されます。メモリ要求と制限は、spark.{driver,executor}.memoryspark.{driver,executor}.memoryOverhead の値の合計によって設定されます。他のリソースの制限は、spark.{driver,executor}.resources.{resourceName}.* 構成によって設定されます。
volumeMounts spark.kubernetes.driver.volumes.[VolumeType].[VolumeName].mount.{path,readOnly} からボリュームを追加します Spark は、spark 構成で指定されたボリュームと、spark 構成とポッドテンプレートファイルを渡すために必要な追加のボリュームを追加します。
### リソース割り当てと設定の概要 [設定ページ](configuration.html)の独自のリソーススケジューリングと設定の概要セクションを必ず読んでください。このセクションでは、リソーススケジューリングの Kubernetes 固有の側面についてのみ説明します。ユーザは、リソースを利用できるように Kubernetes クラスタを適切に構成し、理想的には、コンテナごとに各リソースを分離して、リソースが複数のコンテナ間で共有されないようにします。リソースが分離されていない場合、ユーザはリソースがコンテナ間で共有されないように検出スクリプトを作成する必要があります。[カスタムリソース](https://kubernetes.io/docs/concepts/extend-kubernetes/compute-storage-net/device-plugins/) でKubernetesを設定する方法については、Kubernetesドキュメントを見てください。Spark は、Kubernetes のリソースタイプが `vendor-domain/resourcetype` のKubernetes デバイスプラグイン形式に従う限り、Spark 構成 spark.{driver/executor}.resource.{resourceType} から kubernetes 構成への変換を自動的に処理します。ユーザは、spark.{driver/executor}.resource.{resourceType}.vendor 構成を使ってベンダーを指定する必要があります。ポッドテンプレートを使っている場合は、ユーザは明示的に何も追加する必要はありません。参照と例として、[GPUs](https://kubernetes.io/docs/tasks/manage-gpus/scheduling-gpus/)のスケジューリングのためのkubernetesドキュメントを見てください。Spark はリソースの制限の設定のみをサポートします。Kubernetes は、各コンテナに割り当てられたリソースのアドレスを Spark に通知しません。そのため、ユーザは起動時に executor によって実行される検出スクリプトを指定して、その executor が利用可能なリソースを検出する必要があります。サンプルスクリプトは`examples/src/main/scripts/getGpusResources.sh`にあります。スクリプトには実行権限が設定されている必要があり、ユーザは悪意のあるユーザがスクリプトを変更できないように権限を設定する必要があります。スクリプトは STDOUT に ResourceInformation クラスの形式で JSON 文字列を書き込む必要があります。これは、リソース名とその executor だけが利用できるリソースアドレスの配列を持ちます。### ステージレベルのスケジューリングの概要 動的割り当てが有効な場合、Kubernetesでステージレベルのスケジューリングがサポートされます。現時点では、Kubernetesは外部シャッフルサービスをサポートしないため、spark.dynamicAllocation.shuffleTracking.enabledを有効にする必要もあります。様々なプロファイルのコンテナがKubernetesからリクエストされる順序は保証されません。Kubernetsでの動的割り当てにはシャッフルトラッキング機能が必要であるため、異なるResourceProfileを使った前のステージのexecutorは、シャッフルデータがあるためにタイムアウトをアイドル状態にしない可能性があることに注意してください。これにより、より多くのクラスタリソースが使われる可能性があり、最悪の場合、Kubernetesクラスタにリソースが残っていない場合、Sparkがハングする可能性があります。タイムアウトを設定するために設定spark.dynamicAllocation.shuffleTracking.timeoutを調べることを検討できますが、シャッフルデータが本当に必要な場合は、データを再計算する必要があります。基本のデフォルトプロファイルと独自のResourceProfileの間でポッドテンプレートリソースの処理方法に違いがあることに注意してください。ポッドテンプレートファイルで指定されたリソースは、基本のデフォルトプロファイルでのみ使われます。独自のResourceProfileを作成する場合は、テンプレートファイルのリソースが独自のResourceProfileに伝播されないため、必要な全てのリソースを必ず含めてください。
TOP
inserted by FC2 system