在Kubernetes上集成Argo工作流和spark

在Kubernetes上集成Argo工作流和spark_第1张图片

在我的第一篇文章中,我谈到了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工作流程!

在Kubernetes上集成Argo工作流和spark_第2张图片

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资源。

在Kubernetes上集成Argo工作流和spark_第3张图片

spark-submit是在Kubernetes上运行Spark的最简单方法。查看代码段后,您会注意到两个小的更改。一种是更改Kubernetes集群端点。其次,是托管您的Spark应用程序的容器镜像。

./bin/spark-submit \ — master k8s://https:// \ — 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作业。这些示例可在此处找到。

在Kubernetes上集成Argo工作流和spark_第4张图片

现在,我们如何从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 镜像,这是一个很好的参考

在Kubernetes上集成Argo工作流和spark_第5张图片

Argo Workflow和Spark集成的相关资料比较少,所以写了这篇文章,希望可以对大家有所帮助。

PS:本文属于翻译,原文

你可能感兴趣的:(k8s,kubernetes,spark)