Я пытаюсь отправить задание spark 2.3 в кластер kubernetes в scala, используя платформу play.
Я также пробовал использовать простую программу Scala без использования игровой среды.
Задание отправляется в кластер k8, но stateChanged и infoChanged не вызываются. Я также хочу иметь возможность получить handle.getAppId.
Я использую spark submit для отправки задания, как описано здесь
$ 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
Вот код задания:
def index = Action {
try {
val spark = new SparkLauncher()
.setMaster("my k8 apiserver host")
.setVerbose(true)
.addSparkArg("--verbose")
.setMainClass("myClass")
.setAppResource("hdfs://server/inputs/my.jar")
.setConf("spark.app.name","myapp")
.setConf("spark.executor.instances","5")
.setConf("spark.kubernetes.container.image","mydockerimage")
.setDeployMode("cluster")
.startApplication(new SparkAppHandle.Listener(){
def infoChanged(handle: SparkAppHandle): Unit = {
System.out.println("Spark App Id ["
+ handle.getAppId
+ "] Info Changed. State ["
+ handle.getState + "]")
}
def stateChanged(handle: SparkAppHandle): Unit = {
System.out.println("Spark App Id ["
+ handle.getAppId
+ "] State Changed. State ["
+ handle.getState + "]")
if (handle.getState.toString == "FINISHED") System.exit(0)
}
} )
Ok(spark.getState().toString())
} catch {
case NonFatal(e)=>{
println("failed with exception: " + e)
}
}
Ok
}
Удалось ли вам получить состояние SUBMITTED из дескриптора sparklauncher в методе прослушивателя, если задание успешно отправлено в кластере k8s?
@shiv455 да, я сделал. Я также забыл упомянуть в исходном коде, что вы забыли добавить метод
setMainClass
.на самом деле я добавил в свой код, но забыл добавить сюда!!
Дай мне попробовать и посмотреть!
Я не запускал на реальном k8s, а на minikube. для запуска задания и завершения его для простого примера Spark pi потребовалась пара секунд.
Нет, у меня тайм-аут от клиента, хотя задание было успешно отправлено в кластер k8s (с панели управления k8s), что происходило еще до этого изменения.
хм, странно. не могли бы вы поделиться, где вы запускаете k8s? если вы сделаете
println(launcher.getState)
, какое состояние он напечатает для вас?Я работаю на AWS
И я не думаю, что мы должны использовать finalstate, так как я не хочу ждать, пока задание будет ЗАВЕРШЕНО, я просто хочу знать, успешно ли отправлено задание.
Я запускаю k8s в Azure, и даже используя
kubectl proxy
или открытый API k8s, метод stateChange никогда не вызывается. Только когда задание завершается, но состояние ПОТЕРЯНО без какой-либо другой информации, было ли оно успешным или нет.