大変遅れてクリスマスに投稿ですが、こちらはOpt Technologies Advent Calendar 201614日目の記事です。
2016/12/25現在、Apache Sparkは以下の3種類のクラスタマネージャをサポートしています。
- Standalone
- YARN
- Mesos
これに加えてkubernetesをサポートするissueが、最近活発に動いています。
(k8s公式のSpark Exampleは、k8sでStandaloneクラスタを組む例なので、native supportではない)
ここでは、k8sで下記のforkを動かして、kubernetes native supportを体験してみます。(当該issueを解決するPRのプロトタイプにあたるもののようです)
前提
- jdk 1.7以上
- mvn
- kubernetesクラスタの用意(minikubeでも可)
動かす
こちらのREADMEをなぞっていくだけです。
$ git clone git@github.com:foxish/spark.git -b k8s-support --depth 1
$ cd spark
$ ./build/mvn -Pkubernetes -Phadoop-2.4 -Dhadoop.version=2.4.0 -DskipTests package
ビルドが無事終了したら、Spark Jobをsubmitしてみます。
k8s-supportブランチではspark.kubernetes.sparkImage
オプションでdockerイメージ?が渡せるようになっています。
$ ./bin/spark-submit --deploy-mode cluster --class org.apache.spark.examples.SparkPi --master k8s://default --conf spark.executor.instances=5 --conf spark.kubernetes.sparkImage=manyangled/kube-spark:dynamic http://storage.googleapis.com/foxish-spark-distro/original-spark-examples_2.11-2.1.0-SNAPSHOT.jar 10000
2016-12-25 11:47:32 WARN NativeCodeLoader:62 - Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
2016-12-25 11:47:32 INFO KubernetesClusterScheduler:54 - Created KubernetesClusterScheduler instance
2016-12-25 11:47:33 WARN KubernetesClusterScheduler:66 - Instances: 5
2016-12-25 11:47:33 INFO KubernetesClusterScheduler:54 - Starting spark driver on kubernetes cluster
2016-12-25 11:47:33 INFO KubernetesClusterScheduler:54 - Using as kubernetes-master: k8s://192.168.99.100
...
ここでkubectl
でk8sクラスタ内部の状態を見てみます。
$ kubectl get pods k8s-support
NAME READY STATUS RESTARTS AGE
spark-driver-fp7sd 1/1 Running 0 23s
spark-executor-impz7-1 1/1 Running 0 13s
spark-executor-impz7-2 1/1 Running 0 13s
spark-executor-impz7-3 1/1 Running 0 13s
spark-executor-impz7-4 1/1 Running 0 13s
spark-executor-impz7-5 1/1 Running 0 13s
$ kubectl logs -f spark-driver-fp7sd
...
2016-12-25 02:52:29 INFO TaskSetManager:54 - Finished task 6924.0 in stage 0.0 (TID 6927) in 357 ms on localhost (executor 2) (6925/10000)
2016-12-25 02:52:29 INFO TaskSetManager:54 - Starting task 6929.0 in stage 0.0 (TID 6932, localhost, executor 5, partition 6929, PROCESS_LOCAL, 5863 bytes)
2016-12-25 02:52:29 INFO TaskSetManager:54 - Starting task 6930.0 in stage 0.0 (TID 6933, localhost, executor 4, partition 6930, PROCESS_LOCAL, 5863 bytes)
2016-12-25 02:52:29 INFO TaskSetManager:54 - Finished task 6926.0 in stage 0.0 (TID 6929) in 288 ms on localhost (executor 4) (6926/10000)
2016-12-25 02:52:29 INFO TaskSetManager:54 - Finished task 6925.0 in stage 0.0 (TID 6928) in 333 ms on localhost (executor 5) (6927/10000)
2016-12-25 02:52:29 INFO TaskSetManager:54 - Starting task 6931.0 in stage 0.0 (TID 6934, localhost, executor 3, partition 6931, PROCESS_LOCAL, 5863 bytes)
2016-12-25 02:52:29 INFO TaskSetManager:54 - Finished task 6927.0 in stage 0.0 (TID 6930) in 287 ms on localhost (executor 3) (6928/10000)
...
指定した数のexecutorが立ち上がって、タスクが進捗していることが分かります。
まとめ
SPARK-18278を見る限り、長期化しそうに見えます。(YARN/Mesosをサポートした際にバグが増えてリリースサイクルに影響が出た、などが懸念されています)
とはいえk8sはかなりメジャーなクラスタ管理ツールとなってきていて、サポートされればSparkのユースケースも増えそうですので、今後も動向に注目です。