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 2.3以上の実行可能な配布物。
- kubectlを使ってアクセスが設定された version >= 1.6 の 実行中のKubernetes クラスタ。動作するKubernetesクラスタをまだ持っていない場合は、minikubeを使ってローカルマシーン上にテストクラスタをセットアップできます。
- DNSのアドオンが有効にされたminikubeの最新リリースを使うことをお勧めします。
- デフォルトのminikubeの設定はSparkアプリケーションを実行するためには十分では無いことに注意してください。1つのexecutorを持つ1つのSparkアプリケーションを開始できるように3つのCPUと4Gのメモリをお勧めします。
- クラスタ内の list, create, edit および delete ポッド に適切なパーミッションを持つ必要があります。
kubectl auth can-i <list|create|edit|delete> pods
を実行することでこれらのリソースをリスト化することを検証することができます。- ドライバpodによって使われるサービスアカウントの証明書がpod、サービスおよび設定マップを作成できる必要があります。
- クラスタ内に設定されたKubernetes DNS を持たなければなりません。
どのように動くか
spark-submit
はSparkアプリケーションをKubernetesクラスタにサブミットするために直接使うことができます。サブミットの仕組みは以下のように動作します:
- SparkはKubernetes pod内で実行するSparkドライバを作成します。
- ドライバは同じくKubernetes pod内で実行するexecutorを作成し、それらに接続し、アプリケーションコードを実行します。
- アプリケーションが完了する時、executor podは終了し一掃されますが、ドライバpodがログに残り、結果的にガベージコレクトあるいは手動で一掃されるまでKubernetes API内で“completed” 状態で残ります。
完了状態で、ドライバ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ポッドにマウントできます。
- hostPath: ホストノードのファイルシステムからファイルまたはディレクトリをポッドにマウントします。
- emptyDir: ポッドがノードに割り当てられた時に作成される、初期の空のボリューム。
- persistentVolumeClaim:
PersistentVolume
をポッドにマウンストするために使われます。
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
および persistentVolumeClaim
。VolumeName
はポッドの仕様のvolumes
フィールドの下のボリュームで使いたい名前です。
サポートされる各タイプのボリュームは、以下の形式の設定プロパティを使って指定することができる特定の設定オプションを持ちます:
spark.kubernetes.driver.volumes.[VolumeType].[VolumeName].options.[OptionName]=<value>
例えば、ボリューム名がcheckpointpvc
のpersistentVolumeClaim
の要求名は、以下のプロパティを使って指定することができます:
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 アプリケーション管理
- ジョブ キューとリソース管理
設定
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.identifier を myIdentifier に設定すると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のいずれかです。 |