У меня есть кластер Kubernetes, состоящий только из одной виртуальной машины (кластер minikube).
В этом кластере у меня работает мастер Spark и два рабочих. Я настроил аддон Ingress следующим образом (мои компоненты spark используют порты по умолчанию):
apiVersion: extensions/v1beta1
kind: Ingress
metadata:
name: minikube-ingress
annotations:
spec:
rules:
- host: spark-kubernetes
http:
paths:
- path: /web-ui
backend:
serviceName: spark-master
servicePort: 8080
- path: /
backend:
serviceName: spark-master
servicePort: 7077
И я добавил свой IP k8s в свой /etc/hosts
[MINIKUBE_IP] spark-kubernetes
Я могу подключиться к Master webui через http://spark-kubernetes/web-ui:

Теперь я хочу отправить JAR, хранящийся на моей локальной машине (например, искровые примеры). Я ожидал, что эта команда сработает:
./bin/spark-submit \
--master spark://spark-kubernetes \
--deploy-mode cluster \
--class org.apache.spark.examples.SparkPi \
./examples/jars/spark-examples_2.11-2.4.0.jar
Но я получаю следующую ошибку:
2019-04-04 08:52:36 WARN SparkSubmit$$anon$2:87 - Failed to load .
java.lang.ClassNotFoundException:
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:348)
at org.apache.spark.util.Utils$.classForName(Utils.scala:238)
at org.apache.spark.deploy.SparkSubmit.org$apache$spark$deploy$SparkSubmit$$runMain(SparkSubmit.scala:810)
at org.apache.spark.deploy.SparkSubmit.doRunMain$1(SparkSubmit.scala:167)
at org.apache.spark.deploy.SparkSubmit.submit(SparkSubmit.scala:195)
at org.apache.spark.deploy.SparkSubmit.doSubmit(SparkSubmit.scala:86)
at org.apache.spark.deploy.SparkSubmit$$anon$2.doSubmit(SparkSubmit.scala:924)
at org.apache.spark.deploy.SparkSubmit$.main(SparkSubmit.scala:933)
at org.apache.spark.deploy.SparkSubmit.main(SparkSubmit.scala)
Что я сделал не так?
Примечание :
Я запустил локальный искровой кластер без k8s и выполнил ту же самую отправку Spark с параметром master, установленным на `--master spark://127.0.1.1:7077`. В этом случае все работает нормально, так что это не похоже на проблему пути к классам. (Или я что-то упускаю?)
хм, образ окружения/установки/докера psark такой же?





Чтобы это работало, используйте либо клиентский режим, который раздает jar-файлы (--deploy-mode client), либо укажите путь к jar-файлу в образе контейнера. Поэтому вместо использования
./examples/jars/spark-examples_2.11-2.4.0.jar,
используйте что-то вроде:
/opt/spark/examples/jars/spark-examples_2.11-2.4.0.jar (в зависимости от используемого изображения)
также проверьте мой оператор искры для K8s: https://github.com/radanalyticsio/spark-оператор :)
Здорово ! Я был так сосредоточен на части K8S, что забыл, что проблема может исходить от Spark :) У меня все еще есть небольшая проблема. Когда я отправляю с --master spark://spark-kubernetes, я получаю Invalid master URL. Представление, похоже, принимает только URL-адрес с портом в конце. Как я могу обойти эту проблему?
проверьте гифку в этом spark-operator репозитории. Там я создаю службу NodePort для предоставления мастера искры, надеюсь, она сработает и для вас.