Я пытаюсь использовать spark-submit
с режимом client
в модуле kubernetes для отправки заданий в EMR (из-за некоторых других проблем с инфраструктурой мы не разрешаем режим cluster
). По умолчанию spark-submit
использует hostname
модуля в качестве spark.driver.host
, а hostname
- имя хоста модуля, поэтому spark executor
не может его разрешить. И spark.driver.port
также локально для стручка (контейнера).
Я знаю способ передать некоторые конфы spark-submit
, чтобы spark executor
мог общаться с driver
, эти конфиги:
--conf spark.driver.bindAddress=0.0.0.0 --conf spark.driver.host=$HOST_IP_OF_K8S_WORKER --conf spark.driver.port=32000 --conf spark.driver.blockManager.port=32001
и создать службу в kubernetes, чтобы spark executor
мог общаться с driver
:
apiVersion: v1
kind: Service
metadata:
name: spark-block-manager
namespace: my-app
spec:
selector:
app: my-app
type: NodePort
ports:
- name: port-0
nodePort: 32000
port: 32000
protocol: TCP
targetPort: 32000
- name: port-1
nodePort: 32001
port: 32001
protocol: TCP
targetPort: 32001
- name: port-2
nodePort: 32002
port: 32002
protocol: TCP
targetPort: 32002
Но проблема в том, что на одном k8s может работать более 1 модуля. рабочий и даже более 1 spark-submit
рабочих мест в одном пакете. Поэтому, прежде чем запускать модуль, нам нужно динамически выбрать несколько доступных портов в узле k8s и создать службу для сопоставления портов, а затем во время запуска модуля передать эти порты в модуль, чтобы сообщить spark-submit
об их использовании. Я чувствую, что это немного сложно.
Использование hostNetwork: true
потенциально может решить эту проблему, но это приводит к множеству других проблем в нашей инфраструктуре, поэтому это не вариант.
Если spark-submit
может поддерживать концепцию bindPort
точно так же, как driver.bindAddress
и driver.host
или поддержку proxy
, решение проблемы будет чище.
Есть ли у кого-нибудь похожая ситуация? Пожалуйста, поделитесь некоторыми идеями.
Спасибо.
Дополнительный контекст: spark version
: 2.4