Kubernetes上でSparkを実行

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

Kubernetes スケジューラは現在のところ実験的なものです。将来のバージョンでは、設定、コンテナイメージおよびエントリポイント周りの挙動の変更があるかもしれません。

セキュリティ

SparkでのセキュリティはデフォルトではOFFです。これはデフォルトでは攻撃に脆弱性があることを意味します。Sparkを実行する前に、Spark セキュリティ と以下の具体的なアドバイスを見てください。

User Identity

Dockerfilesが提供するプロジェクトからビルドされたイメージには、USER ディレクティブが含まれません。これは結果のイメージがコンテナ内でrootとしてSparkプロセスを実行することを意味します。安全ではないクラスタでは、これは特権の昇格とコンテナのブレイクアウトの攻撃経路を提供するかもしれません。従って、セキュリティを考慮する配備では、カスタムイメージに非特権UIDとGIDを指定するUSER ディレクティブを提供することを考慮する必要があります。

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

Volume Mounts

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

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

必要条件

どのように動くか

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

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

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

ドライバとexecutor pode のスケジューリングはKubernetesによって扱われます。設定プロパティを使って 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

クラスタ モード

クラスタモードで 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_url>の形式を持つURLでなければなりません。マスター文字列に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とメモリ)を消費すべきではありません。

認証のパラメータ

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

依存性の管理

アプリケーションの依存がHDFSあるいはHTTPサーバのようなリモートの場所でホストされる場合、それらは適切なリモートURIで参照されるかもしれません。また、アプリケーションの依存は独自のビルドDockerイメージへあらかじめマウントすることができます。それらの依存はDockerファイル内でlocal:// URI および/あるいは SPARK_EXTRA_CLASSPATH環境変数を使って参照されるクラスパスに追加することができます。spark-submit内の独自のビルドDockerイメージ内で依存物を参照する場合、local:// スキーマも必要です。クライアントのローカルファイルシステムのサブミットからのアプリケーションの依存の使用は現在のところまだサポートされません。

秘密鍵の管理

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

Kubernetes ボリュームの使用

Spark 2.4.0 から、ユーザは以下の種類の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>

具体的には、VolumeType は以下の値のいずれかです: hostPath, emptyDir および persistentVolumeClaimVolumeName はポッドの仕様のvolumes フィールドの下のボリュームで使いたい名前です。

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

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

例えば、ボリューム名がcheckpointpvcpersistentVolumeClaimの要求名は、以下のプロパティを使って指定することができます:

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

ボリュームをexecutorポッドにマウントするための設定プロパティは、プリフィックスspark.kubernetes.driver.の代わりにspark.kubernetes.executor.を使います。サポートされる各種類のボリュームで利用可能なオプションの完全なリストについては、以下のSpark Properties の章を参照してください。

内省とデバッグ

これらは、実行中/完了した 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は名前空間の概念を持ちます。名前空間はクラスタのリソースを複数のユーザ間で(リソース クォータを使って)分ける方法です。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 on Kubernetesの機能があります。これらの機能は、最終的にspark-kubernetes統合の将来のバージョンに組み込まれる予定です。

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

設定

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

Sparkのプロパティ

プロパティ名デフォルト意味
spark.kubernetes.namespace デフォルト: ドライバとexecutor podを実行するために使われる名前空間。
spark.kubernetes.container.image (none) Sparkアプリケーションのために使うコンテナのイメージ。これは通常はexample.com/repo/spark:v1.0.0の形式です。明示的なイメージがそれぞれ異なるコンテナタイプについて提供されない場合は、この設定はユーザによって必要とされ提供されなければなりません
spark.kubernetes.driver.container.image (spark.kubernetes.container.image の値) ドライバのために使用する独自のコンテナイメージ。
spark.kubernetes.executor.container.image (spark.kubernetes.container.image の値) executorのために使用する独自のコンテナイメージ。
spark.kubernetes.container.image.pullPolicy IfNotPresent Kubernetes内でイメージをプルする時に使われるコンテナイメージのプル ポリシー。
spark.kubernetes.container.image.pullSecrets プライベート イメージ レジストリからイメージをプルするために使われるKubernetesの秘密鍵のカンマ区切りのリスト。
spark.kubernetes.allocation.batch.size 5 executor pod 割り当ての各回で一時に起動するpodの数。
spark.kubernetes.allocation.batch.delay 1s executorのpod割り当ての各回の間で待つ時間。1秒未満の値を指定するとsparkドライバ上での過度なCPUの使用率に繋がるかもしれません。
spark.kubernetes.authenticate.submission.caCertFile (none) ドライバを開始する時のTLS上でKubernetes APIサーバに接続するためのCA証明書ファイルのパス。このファイルはサブミットするマシーンのディスク上になければなりません。URIに対するパスとしてこれを指定します (つまりスキーマを与えないでください)。クライアントモードでは、代わりにspark.kubernetes.authenticate.caCertFileを使ってください。
spark.kubernetes.authenticate.submission.clientKeyFile (none) ドライバを開始する時にKubernetes APIサーバに対する認証のためのクライアント キー ファイルへのパス。このファイルはサブミットするマシーンのディスク上になければなりません。URIに対するパスとしてこれを指定します (つまりスキーマを与えないでください)。クライアントモードでは、代わりにspark.kubernetes.authenticate.clientKeyFileを使ってください。
spark.kubernetes.authenticate.submission.clientCertFile (none) ドライバを開始する時にKubernetes APIサーバに対する認証のためのクライアント証明書ファイルへのパス。このファイルはサブミットするマシーンのディスク上になければなりません。URIに対するパスとしてこれを指定します (つまりスキーマを与えないでください)。クライアントモードでは、代わりにspark.kubernetes.authenticate.clientCertFileを使ってください。
spark.kubernetes.authenticate.submission.oauthToken (none) ドライバを開始する時にKubernetes APIサーバに対する認証時に使うOAuthトークン。他の認証オプションと異なり、これは認証のために使われるトークンの正確な文字列値であることを期待されることに注意してください。クライアントモードでは、代わりにspark.kubernetes.authenticate.oauthTokenを使ってください。
spark.kubernetes.authenticate.submission.oauthTokenFile (none) ドライバを開始する時にKubernetes APIサーバに対する認証時に使うトークンを含んでいるOAuthトークンファイルへのパス。このファイルはサブミットするマシーンのディスク上になければなりません。URIに対するパスとしてこれを指定します (つまりスキーマを与えないでください)。クライアントモードでは、代わりにspark.kubernetes.authenticate.oauthTokenFileを使ってください。
spark.kubernetes.authenticate.driver.caCertFile (none) executorをリクエストする時にドライバpodからTLS上でKubernetes APIサーバへ接続するためのCA証明書ファイルへのパス。このファイルはサブミットするマシーンのディスク上になければならず、ドライバpodへアップロードされるでしょう。URIに対するパスとしてこれを指定します (つまりスキーマを与えないでください)。クライアントモードでは、代わりにspark.kubernetes.authenticate.caCertFileを使ってください。
spark.kubernetes.authenticate.driver.clientKeyFile (none) executorをリクエストする時にドライバpodからKubernetes APIサーバに対する認証のためのクライアント キー ファイルへのパス。このファイルはサブミットするマシーンのディスク上になければならず、ドライバpodへKubernetesの秘密鍵としてアップロードされるでしょう。URIに対するパスとしてこれを指定します (つまりスキーマを与えないでください)。クライアントモードでは、代わりにspark.kubernetes.authenticate.clientKeyFileを使ってください。
spark.kubernetes.authenticate.driver.clientCertFile (none) executorをリクエストする時にドライバpodからKubernetes APIサーバに対する認証のためのクライアント証明書ファイルへのパス。このファイルはサブミットするマシーンのディスク上になければならず、ドライバpodへKubernetesの秘密鍵としてアップロードされるでしょう。URIに対するパスとしてこれを指定します (つまりスキーマを与えないでください)。クライアントモードでは、代わりにspark.kubernetes.authenticate.clientCertFileを使ってください。
spark.kubernetes.authenticate.driver.oauthToken (none) executorをリクエストする時にドライバpodからKubernetes APIサーバに対する認証時に使われるOAuthトークン。他の認証オプションと異なり、これは認証のために使われるトークンの正確な文字列値でなければならないことに注意してください。このトークン値はドライバpodにKubernetesの秘密鍵としてアップロードされます。クライアントモードでは、代わりにspark.kubernetes.authenticate.oauthTokenを使ってください。
spark.kubernetes.authenticate.driver.oauthTokenFile (none) executorをリクエストする時にドライバpodからKubernetes APIサーバに対して認証時に使うトークンを含むOAuthトークンファイルへのパス。他の認証オプションと異なり、このファイルは認証のために使われるトークンの正確な文字列値を含まなければならないことに注意してください。このトークン値はドライバpodに秘密鍵としてアップロードされます。クライアントモードでは、代わりにspark.kubernetes.authenticate.oauthTokenFileを使ってください。
spark.kubernetes.authenticate.driver.mounted.caCertFile (none) executorをリクエストする時にドライバpodからTLS上でKubernetes APIサーバへ接続するためのCA証明書ファイルへのパス。このパスはドライバpodからアクセス可能でなければなりません。URIに対するパスとしてこれを指定します (つまりスキーマを与えないでください)。クライアントモードでは、代わりにspark.kubernetes.authenticate.caCertFileを使ってください。
spark.kubernetes.authenticate.driver.mounted.clientKeyFile (none) executorをリクエストする時にドライバpodからKubernetes APIサーバに対する認証のためのクライアント キー ファイルへのパス。このパスはドライバpodからアクセス可能でなければなりません。URIに対するパスとしてこれを指定します (つまりスキーマを与えないでください)。クライアントモードでは、代わりにspark.kubernetes.authenticate.clientKeyFileを使ってください。
spark.kubernetes.authenticate.driver.mounted.clientCertFile (none) executorをリクエストする時にドライバpodからKubernetes APIサーバに対する認証のためのクライアント証明書ファイルへのパス。このパスはドライバpodからアクセス可能でなければなりません。URIに対するパスとしてこれを指定します (つまりスキーマを与えないでください)。クライアントモードでは、代わりにspark.kubernetes.authenticate.clientCertFileを使ってください。
spark.kubernetes.authenticate.driver.mounted.oauthTokenFile (none) executorをリクエストする時にドライバpodからKubernetes APIサーバに対して認証時に使うOAuthトークンを含むファイルへのパス。このパスはドライバpodからアクセス可能でなければなりません。他の認証オプションと異なり、このファイルは認証のために使われるトークンの正確な文字列値を含まなければならないことに注意してください。クライアントモードでは、代わりにspark.kubernetes.authenticate.oauthTokenFileを使ってください。
spark.kubernetes.authenticate.driver.serviceAccountName デフォルト: ドライバpodを実行する時に使われるサービスアカウント。APIサーバからexecutor podをリクエストする時に、ドライバpodはこのサービスアカウントを使います。これはCA証明書ファイル、クライアント キー ファイル、クライアント証明書ファイル および/あるいはOAuthトークンと一緒に指定できないことに注意してください。クライアントモードでは、代わりにspark.kubernetes.authenticate.serviceAccountNameを使ってください。
spark.kubernetes.authenticate.caCertFile (none) クライアントモードでは、executorを要求する時にTLS経由で Kubernetes API サーバに接続するためのCA証明書ファイルへのパス。URIに対するパスとしてこれを指定します (つまりスキーマを与えないでください)。
spark.kubernetes.authenticate.clientKeyFile (none) クライアントモードでは、executorを要求する時に Kubernetes API サーバに対して認証するためのクライアント キーファイルへのパス。URIに対するパスとしてこれを指定します (つまりスキーマを与えないでください)。
spark.kubernetes.authenticate.clientCertFile (none) クライアントモードでは、executorを要求する時に Kubernetes API サーバに対して認証するためのクライアント証明書ファイルへのパス。URIに対するパスとしてこれを指定します (つまりスキーマを与えないでください)。
spark.kubernetes.authenticate.oauthToken (none) クライアントモードでは、executorを要求する時に Kubernetes API サーバに対して認証する時に使用するOAuthトークン。他の認証オプションと異なり、これは認証のために使われるトークンの正確な文字列値でなければならないことに注意してください。
spark.kubernetes.authenticate.oauthTokenFile (none) クライアントモードでは、executorを要求する時に Kubernetes API サーバに対して認証する時に使用するOAuthトークンを含むファイルへのパス。
spark.kubernetes.driver.label.[LabelName] (none) LabelNameによって指定されるラベルをドライバpodに追加する。例えば、spark.kubernetes.driver.label.something=true。Sparkは記録のためにドライバpodに独自のラベルも追加することに注意してください。
spark.kubernetes.driver.annotation.[AnnotationName] (none) AnnotationNameによって指定されるアノテーションをドライバpodに追加する。例えば、spark.kubernetes.driver.annotation.something=true
spark.kubernetes.executor.label.[LabelName] (none) LabelNameによって指定されるラベルをexecutor podに追加する。例えば、spark.kubernetes.executor.label.something=true。Sparkは記録のためにドライバpodに独自のラベルも追加することに注意してください。
spark.kubernetes.executor.annotation.[AnnotationName] (none) AnnotationNameによって指定されるアノテーションをexecutor podに追加する。例えば、spark.kubernetes.executor.annotation.something=true
spark.kubernetes.driver.pod.name (none) ドライバ podの名前。クラスタモードでは、もし設定されない場合、名前の衝突を避けるためにドライバpod名は現在のタイムスタンプが後についた"spark.app.name"に設定されます。クライアントモードでは、もしアプリケーションがpod内で実行している場合、これをドライバが実行しているpodの名前に設定することをお勧めします。Setting this value in client mode allows the driver to become the owner of its executor pods, which in turn allows the executor pods to be garbage collected by the cluster.
spark.kubernetes.executor.lostCheck.maxAttempts 10 ドライバが特定のexecutorについて喪失の理由の突き止めようとする回数。喪失の理由は、executorの障害がフレームワークまたはアプリケーションエラーのいずれに起因するかを確認するために使われ、executorが削除され交換されるか、デバッグのために障害状態のままでいるかを決定します。
spark.kubernetes.submission.waitAppCompletion true クラスタモードで、起動プロセスが終了する前にアプリケーションが終了するのを待つかどうか。falseに変更された場合、ランチャーはSparkジョブを開始する時に"fire-and-forget"の挙動をします。
spark.kubernetes.report.interval 1s クラスタモードでの現在のSparkジョブのステータスを報告する間隔。
spark.kubernetes.driver.limit.cores (none) ドライバーpodのための cpu limit を指定します。
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が同時に実行できるタスクの数は、これに影響をうけません。
spark.kubernetes.executor.limit.cores (none) Sparkアプリケーションのために起動された各executor podのための hard cpu limitを指定します。
spark.kubernetes.node.selector.[labelKey] (none) キーlabelKeyと値を設定値として持つ、ドライバpodとexecutor podのノード セレクタを追加します。 例えば、spark.kubernetes.node.selector.identifiermyIdentifier に設定するとdriver podとexecutor がキー identifier と値myIdentifierを持つようになります。このプリフィックスを使って複数の設定を設定することで、複数のノード セレクタ キーを追加することができます。
spark.kubernetes.driverEnv.[EnvironmentVariableName] (none) EnvironmentVariableNameによって指定される環境変数をドライバのプロセスに追加します。ユーザは複数の環境変数を設定するために複数のそれらを指定することができます。
spark.kubernetes.driver.secrets.[SecretName] (none) 値の中で指定されたパス上のドライバのpodへSecretName という名前のKubernetes Secretを追加します。例えば、spark.kubernetes.driver.secrets.spark-secret=/etc/secrets
spark.kubernetes.executor.secrets.[SecretName] (none) 値の中で指定されたパス上のexecutorのpodへSecretName という名前のKubernetes Secretを追加します。例えば、spark.kubernetes.executor.secrets.spark-secret=/etc/secrets
spark.kubernetes.driver.secretKeyRef.[EnvName] (none) Add as an environment variable to the driver container with name EnvName (case sensitive), the value referenced by key key in the data of the referenced Kubernetes Secret. 例えば、spark.kubernetes.driver.secretKeyRef.ENV_VAR=spark-secret:key
spark.kubernetes.executor.secretKeyRef.[EnvName] (none) Add as an environment variable to the executor container with name EnvName (case sensitive), the value referenced by key key in the data of the referenced Kubernetes Secret. 例えば、spark.kubernetes.executor.secrets.ENV_VAR=spark-secret:key
spark.kubernetes.driver.volumes.[VolumeType].[VolumeName].mount.path (none) VolumeType型のVolumeNameという名前のKubernetes ボリューム を、値で指定されたパス上のドライバ ポッドに追加します。例えば、spark.kubernetes.driver.volumes.persistentVolumeClaim.checkpointpvc.mount.path=/checkpoint
spark.kubernetes.driver.volumes.[VolumeType].[VolumeName].mount.readOnly (none) マウントされたボリュームが読み込みのみかそうでないかを指定します。例えば、spark.kubernetes.driver.volumes.persistentVolumeClaim.checkpointpvc.mount.readOnly=false
spark.kubernetes.driver.volumes.[VolumeType].[VolumeName].options.[OptionName] (none) Configure Kubernetes Volume options passed to the Kubernetes with OptionName as key having specified value, must conform with Kubernetes option format. 例えば、spark.kubernetes.driver.volumes.persistentVolumeClaim.checkpointpvc.options.claimName=spark-pvc-claim
spark.kubernetes.executor.volumes.[VolumeType].[VolumeName].mount.path (none) VolumeType型のVolumeNameという名前のKubernetes ボリューム を、値で指定されたパス上のexecutor ポッドに追加します。例えば、spark.kubernetes.executor.volumes.persistentVolumeClaim.checkpointpvc.mount.path=/checkpoint
spark.kubernetes.executor.volumes.[VolumeType].[VolumeName].mount.readOnly false マウントされたボリュームが読み込みのみかそうでないかを指定します。例えば、spark.kubernetes.executor.volumes.persistentVolumeClaim.checkpointpvc.mount.readOnly=false
spark.kubernetes.executor.volumes.[VolumeType].[VolumeName].options.[OptionName] (none) 指定された値を持つキーとして、OptionNameを使ってKubernetesに渡されるKubernetes ボリュームを設定します。例えば、spark.kubernetes.executor.volumes.persistentVolumeClaim.checkpointpvc.options.claimName=spark-pvc-claim
spark.kubernetes.memoryOverheadFactor 0.1 これは非JVMメモリにメモリを割り当てるメモリ オーバーヘッド係数を設定します。非JVMメモリには、オフヒープメモリ割り当て、非JVMタスク、そして様々なシステムプロセスが含まれます。JVMベースのジョブについては、この値はデフォルトで 0.10で、非JVMジョブについては 0.40 です。非JVMタスクはより多くの非JVMヒープ空間を必要とし、そのようなタスクは一般的に "Memory Overhead Exceeded" エラーで失敗するためにこれが行われます。より高いデフォルトで、このエラーが回避されます。
spark.kubernetes.pyspark.pythonVersion "2" これは、ドライバとexecutorのコンテナを実行するために使われるdockerイメージのPythonのメジャー バージョンを設定します。2または3のいずれかです。
TOP
inserted by FC2 system