在我的第一篇文章中,我谈到了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-3chmod 700 get_helm.sh./get_helm.sh

2. 增加 argo repo 到 helm 并安装

helm repo add argo https://argoproj.github.io/argo-helmhelm repo updatehelm 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/v1alpha1kind: Workflowmetadata:  name: wf-spark-pi  namespace: argospec:  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:本文属于翻译,原文