在Kubernetes上集成Argo工作流和spark

10次阅读

共计 2631 个字符,预计需要花费 7 分钟才能阅读完成。

在我的第一篇文章中,我谈到了 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:本文属于翻译,原文

正文完
 0