Sparkのドキュメント読み
Hadoop(YARN)がすでに構築されている前提でSparkを導入するために、ドキュメントを読んでまとめる(YARNに関しての部分のみ)。この記事では実際に動かしてないので、とりあえずドキュメントに書いてあることをそのまままとめるだけ。
YARNでSparkを起動するために
セキュリティ
あとで詳しく言及するが、デフォルトではSparkはセキュリティ設定が無効になっている。Hadoop基盤の方で認証を掛けている場合は、こちらもその設定を行う必要がありそう。
Sparkのジョブ実行方法
YARN上でSparkを起動する際、実はあまり構築手順などは踏まなくていい。
必要なのは基本的には以下のみとなっているようだ。
クライアント機とHadoopクラスタの全ノードにSparkバイナリを配布
各マシンで必要に応じてSpark設定ファイルを変更(全マシン同じ設定にする)
Sparkは結局のところYARNのクライアントとして動いているだけっぽいので、なにかサーバを立てたりする必要はない。上記の手順を踏んだら、クライアント機で以下のコマンドを実行するだけで良いみたいだ。(おそらく円周率計算用のサンプルプログラム)
$ ./bin/spark-submit --class org.apache.spark.examples.SparkPi \
--master yarn \
--deploy-mode cluster \
--driver-memory 4g \
--executor-memory 2g \
--executor-cores 1 \
--queue thequeue \
examples/jars/spark-examples*.jar \
10
--deploy-modeというパラメータがあるが、これはYARNでSparkを実行する際にclusterとclientという二つのモードがあり、それを指定するためのパラメータとなっている。
clusterモードでは、Sparkドライバー(それぞれのジョブに指示を送る役)をYARNのApplication Master内部で動作させるらしく、クライアント機はジョブを送ったのちに接続を切ってもジョブはそのまま実行を続ける。
一方でclientモードは、Sparkドライバーをクライアント機上で動作させるため、ジョブの実行中はクライアント機をクラスタにつなげて置かなけらばならないし、さらにジョブの実行速度がクライアント機の性能にも依存してしまう。簡単なデバッグなどにこのclientモードは用いられるらしい。
準備
SparkをYARN上で動かすにはSparkバイナリが必要になるが、それは以下のページでバージョンや種類(Hadoop付き/なし)などを指定してダウンロードすることができる。
これをダウンロードした後に$SPARK_HOMEに指定した場所に展開し、設定ファイルを必要に応じて編集する。設定ファイルはメインとなるのが以下の3つとなっている。
spark-env.sh:$HADOOP_CONF_DIRなど環境変数
spark-defaults.conf:Spark全般の設定
log4j2.properties:ログ設定
環境変数は配布された設定ファイルにデフォルトが大体書いてある。Spark全般の設定については以下のページに大量に書いてあるので、適宜参考にして設定する。
デバッグ
デバッグを行うにはYARNのコマンドを使うのが良い。Sparkのジョブも結局はYARNでリソース管理をしているので、以下のコマンドでログを確認できる。
yarn logs -applicationId <app ID>
また、Sparkはジョブを実行している間に独自にSparkドライバーのマシンの4040ポートにWebUIを起動するようになっており、そのWebUIを確認することでログを見ることもできるらしい。(でもすぐに終わるようなサンプルのジョブとかは果たしてWebUIを確認できるのか…)
Kerberos
SparkはKerberos認証をサポートしており、Hadoop(YARN)も認証にKerberosを利用している。Sparkは以下の二つを設定ファイル/実行時ともに指定でき、どのプリンシパルの情報を渡すかを選べる。渡したプリンシパルはすべてのアプリケーションへ配布され、そのアプリケーションがユーザの権限で実行できるようになる。
spark.kerberos.keytab(--keytab)
spark.kerberos.principal(--principal)
Sparkの認証について
Spark RPC通信
認証
SparkはRPC通信で認証情報を全てのアプリケーションへ配布することで、各アプリケーションが適切な権限で実行できる。YARNの場合はKerberosの認証情報で、それをRPC通信で配布する。
YARNにはRPC通信の暗号化機能があり、この暗号化機能を利用して安全に認証情報を送るようになっているため、SparkではYARNのRPC暗号化機能に依存していると言える。
暗号化
Spark RPC通信はAESベースの暗号化をサポートしており、暗号化を利用するためには前段の認証が必須となっている。暗号化はバージョン1, 2があり後方互換性のためにバージョン1がデフォルトとなっているが、推奨されているのはバージョン2となる。設定では、暗号化方式やバージョン、SASLの有効化(非推奨)などが指定できる。
ローカルストレージ暗号化
Sparkは一時ファイルを書きだされるディレクトリの暗号化をサポートしており、ディスク上のシャッフルファイルやブロックデータなどを暗号化する。ユーザが明示的に作成した一時ファイルやアプリケーションの出力などは暗号化の対象とならない。
WebUI
認証/認可
WebUIはjavax servlet filtersを利用して認証をすることができるが、認証の実装はSparkでは提供されていない。そのため、自身で実装をしてそれを利用するように設定することが必要となる。認可についてはACLで設定する。
Kerberos
SparkではKerberosを利用した環境でのジョブの実行が出来るようになっている。これはSparkがkinitなどでログインしたユーザの権限を持つ委任トークンをHDFSなどに発行してもらうことでそれが実現されている。設定で各サービス(HDFSなど)の委任トークンの発行を有効化するかどうかを選べる。
Sparkは構築にそこまで手順は必要ないが、Kerberos認証を有効化したHadoopクラスタを利用する際には色々設定しないといけない点があった。ローカルストレージ暗号化やWebUIの認証/認可などは外部に公開する予定が出てきてからで良さそうなので、優先度は今のところ低め。
とりあえず明日、適当なプリンシパルでサンプルプログラムを実行させてみて、エラーが出るかどうか見てみよう。あまり深く理解できてない気がするので、多分1日くらいは沼りそう…