在我的第一篇文章中,我谈到了 Argo CD。这次是 Argo Workflow,它又来自 Argo 项目,Kubernetes 上的 Spark,以及我们如何使两者一起工作。
Argo Workflow
Argo Workflow 是一个云原生工作流引擎,我们可以在其中编排具有任务序列的作业(工作流中的每个步骤都作为容器)。使用工作流定义,我们可以使用 DAG 捕获任务之间的依赖关系。替代 Airflow?也许会!如果您正在寻找 kubernetes 的原生产品,我相信 Argo Workflow 不会让您失望。
将 Argo 工作流程部署到 K8s(请为 argo 工作流程创建一个名称空间):
1. 安装 helm:
curl -fsSL -o get_helm.sh https://raw.githubusercontent.com/helm/helm/master/scripts/get-helm-3
chmod 700 get_helm.sh
./get_helm.sh
2. 增加 argo repo 到 helm 并安装
helm repo add argo https://argoproj.github.io/argo-helm
helm repo update
helm install argo-wf argo/argo -n argo-wf -f values.yaml
在 values.yaml 中,您可以启用入口(如果集群中有入口控制器可用)
ingress:
enabled: true
annotations:
kubernetes.io/ingress.class: nginx
kubernetes.io/tls-acme:“true”hosts:
- argo.example.com
您将立即部署并运行 argo 工作流程!
Argo 中的工作流程自动化由 YAML 模板驱动。Argo 提供了丰富的文档以及相关示例。如果您正在寻找自动化,我们甚至可以通过 REST API 提交工作流程。我不会在这里做太多深入的介绍,因为文档详细且经过了很好的解释。让我们继续下一个主题。
Spark on Kubernetes
从 Spark 2.3 开始,您可以使用 Kubernetes 运行和管理 Spark 资源。Spark 可以在 Kubernetes 管理的集群上运行。此功能使用已添加到 Spark 的原生 Kubernetes 调度程序。我们可以按需运行 Spark 驱动程序和执行程序 Pod,这意味着没有专用的 Spark 集群。
有两种方法可以在 Kubernetes 上运行 Spark:使用 Spark-submit 和 Spark operator。
通过使用 spark-submit CLI,您可以使用 Kubernetes 支持的各种配置选项提交 Spark 作业。
- spark-submit
spark-submit 将作业提交委托给 Kubernetes 上的 Spark driver pod,最后通过与 Kubernetes API 服务器通信来创建相关的 Kubernetes 资源。
spark-submit 是在 Kubernetes 上运行 Spark 的最简单方法。查看代码段后,您会注意到两个小的更改。一种是更改 Kubernetes 集群端点。其次,是托管您的 Spark 应用程序的容器镜像。
./bin/spark-submit \ — master k8s://https://<KUBERNETES_CLUSTER_ENDPOINT> \ — deploy-mode cluster \ — name spark-pi \ — class org.apache.spark.examples.SparkPi \ — conf spark.executor.instances=3 \ — conf spark.kubernetes.container.image=aws/spark:2.4.5-SNAPSHOT \ — conf spark.kubernetes.driver.pod.name=sparkpi-test-driver \ — conf spark.kubernetes.authenticate.driver.serviceAccountName=spark local:///opt/spark/examples/jars/spark-examples_2.11–2.4.5-SNAPSHOT.jar
请参考此链接以获取所有可用的参数 / 属性。
- Spark operator
Spark operator 为 Spark 工作负载提供了原生 Kubernetes 体验。此外,您可以使用 kubectl 和 sparkctl 提交 Spark 作业。这些示例可在此处找到。
现在,我们如何从 Argo Workflow 提交 spark 作业?
Spark-submit:
apiVersion: argoproj.io/v1alpha1
kind: Workflow
metadata:
name: wf-spark-pi
namespace: argo
spec:
arguments: {}
entrypoint: sparkapp
templates:
- arguments: {}
container:
args:
- /opt/spark/bin/spark-submit
- --master
- k8s://https://kubernetes.default.svc
- --deploy-mode
- cluster
- --conf
- spark.kubernetes.namespace=spark-apps
- --conf
- spark.kubernetes.container.image=sparkimage
- --conf
- spark.executor.instances=2
- --class
- org.apache.spark.examples.SparkPi
- local:///opt/spark/examples/examples/jars/spark-examples_2.12-2.4.2.jar
command:
- sh
image: sparkimage
imagePullPolicy: Always
name: ""
resources: {}
inputs: {}
metadata: {}
name: sparkapp
outputs: {}
Spark operator:
我们可以使用 Argo Workflow 资源模板来实现此目的。
对于创建 spark 镜像,这是一个很好的参考。
Argo Workflow 和 Spark 集成的相关资料比较少,所以写了这篇文章,希望可以对大家有所帮助。
PS:本文属于翻译,原文