从 Python 在 kubernetes 集群上提交 Spark (2.3)

amz*_*mza 5 python apache-spark kubernetes aws-lambda

因此,既然 k8s 在 2.3 中直接与 spark 集成,我从控制台提交的 spark 提交在 kuberenetes master 上正确执行,而没有运行任何 spark master pod,spark 处理所有 k8s 详细信息:

spark-submit \
  --deploy-mode cluster \
  --class com.app.myApp \
  --master k8s://https://myCluster.com \
  --conf spark.kubernetes.authenticate.driver.serviceAccountName=spark \
  --conf spark.app.name=myApp \
  --conf spark.executor.instances=10 \
  --conf spark.kubernetes.container.image=myImage \
  local:///myJar.jar
Run Code Online (Sandbox Code Playgroud)

我想要做的是通过 AWS lambda 向我的 k8s 集群进行 spark-submit。以前我直接通过 spark master REST API 使用命令(没有 kubernetes):

request = requests.Request(
    'POST',
    "http://<master-ip>:6066/v1/submissions/create",
    data=json.dumps(parameters))
prepared = request.prepare()
session = requests.Session()
response = session.send(prepared)
Run Code Online (Sandbox Code Playgroud)

它奏效了。现在我想集成 Kubernetes 并在我从 python 向我的 kubernetes 集群提交 API 请求的情况下执行类似的操作,并让 spark 处理所有 k8s 细节,理想情况下是这样的:

request = requests.Request(
    'POST',
    "k8s://https://myK8scluster.com:443",
    data=json.dumps(parameters))
Run Code Online (Sandbox Code Playgroud)

是否可以在 Spark 2.3/Kubernetes 集成中使用?

Ant*_*nko 3

如果您使用原生 Kubernetes 支持,恐怕这对于 Spark 2.3 来说是不可能的。

\n\n

根据部署指令的描述,容器提交过程分为以下几个步骤:

\n\n
    \n
  1. Spark 创建一个在 Kubernetes Pod 中运行的 Spark 驱动程序。
  2. \n
  3. 驱动程序创建也在 Kubernetes Pod 中运行的执行器并连接到它们,并执行应用程序代码。
  4. \n
  5. 当应用程序完成时,执行程序 Pod 将终止并被清理,但驱动程序 Pod 会保留日志并在 Kubernetes API 中保持 \xe2\x80\x9ccompleted\xe2\x80\x9d 状态,直到 \xe2\x80\x99s 最终变成垃圾收集或人工清理。
  6. \n
\n\n

因此,事实上,在开始提交过程之前,您没有地方可以提交作业,这将为您启动第一个 Spark 的 pod(驱动程序)。申请完成后,一切都结束了。

\n\n

因为在 AWS Lambda 上运行胖容器并不是最好的解决方案,而且也因为这不是在容器本身中运行任何命令的方法(这是可能的,但是通过 hack,这里是关于在 AWS Lambda 中执行 Bash 的蓝图)最简单的方法是编写一些小型自定义服务,它将在 AWS Lambda 之外的计算机上运行,​​并在应用程序和spark-submit实用程序之间提供 REST 接口。我看不出有任何其他方法可以不痛苦地做到这一点。

\n