加入收藏 | 设为首页 | 会员中心 | 我要投稿 湖南网 (https://www.hunanwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 移动互联 > 正文

Spark on Kubernetes 的现状与挑战

发布时间:2019-08-02 21:56:45 所属栏目:移动互联 来源:尼不要逗了
导读:云原生期间,Kubernetes 的重要性日益凸显,这篇文章以 Spark 为例来看一下大数据生态 on Kubernetes 生态的近况与挑衅。 1. Standalone 模式 Spark 运行在 Kubernetes 集群上的第一种可行方法是将 Spark 以 Standalone 模式运行,可是很快社区就提出行使
副问题[/!--empirenews.page--]

云原生期间,Kubernetes 的重要性日益凸显,这篇文章以 Spark 为例来看一下大数据生态 on Kubernetes 生态的近况与挑衅。

1. Standalone 模式

Spark 运行在 Kubernetes 集群上的第一种可行方法是将 Spark 以 Standalone 模式运行,可是很快社区就提出行使 Kubernetes 原生 Scheduler 的运行模式,也就是 Native 的模式。关于 Standalone 模式这里就没有继承接头的须要了。

2. Kubernetes Native 模式

Native 模式简而言之就是将 Driver 和 Executor Pod 化,用户将之前向 YARN 提交 Spark 功课的方法提交给 Kubernetes 的 apiserver,提交呼吁如下:

  1. $ bin/spark-submit  
  2.     --master k8s://https://<k8s-apiserver-host>:<k8s-apiserver-port>  
  3.     --deploy-mode cluster  
  4.     --name spark-pi  
  5.     --class org.apache.spark.examples.SparkPi  
  6.     --conf spark.executor.instances=5  
  7.     --conf spark.kubernetes.container.image=<spark-image>  
  8.     local:///path/to/examples.jar 

个中 master 就是 kubernetes 的 apiserver 地点。提交之后整个功课的运行方法如下,先将 Driver 通过 Pod 启动起来,然后 Driver 会启动 Executor 的 Pod。这些方法许多人应该都相识了,就不赘述了,具体信息可以参考:https://spark.apache.org/docs/latest/running-on-kubernetes.html 。

Spark on Kubernetes 的近况与挑衅

3. Spark Operator

除了这种直接想 Kubernetes Scheduler 提交功课的方法,还可以通过 Spark Operator 的方法来提交。Operator 在 Kubernetes 中是一个很是重要的里程碑。在 Kubernetes 刚面世的时辰,关于有状态的应用怎样陈设在 Kubernetes 上一向都是官方不肯意评论的话题,直到 StatefulSet 呈现。StatefulSet 为有状态应用的陈设实现了一种抽象,简朴来说就是担保收集拓扑和存储拓扑。可是状态应用千差万别,并不是全部应用都能抽象成 StatefulSet,强行适配横竖加重了开拓者的心智承担。

然后 Operator 呈现了。我们知道 Kubernetes 给开拓者提供了很是开放的一种生态,你可以自界说 CRD,Controller 乃至 Scheduler。而 Operator 就是 CRD + Controller 的组合情势。开拓者可以界说本身的 CRD,好比我界说一种 CRD 叫 EtcdCluster 如下:

  1. apiVersion: "etcd.database.coreos.com/v1beta2" 
  2. kind: "EtcdCluster" 
  3. metadata: 
  4.   name: "example-etcd-cluster" 
  5. spec: 
  6.   size: 3 
  7.   version: "3.1.10" 
  8.   repository: "quay.io/coreos/etcd" 

提交到 Kubernetes 之后 Etcd 的 Operator 就针对这个 yaml 中的各个字段举办处理赏罚,最后陈设出来一个节点局限为 3 个节点的 etcd 集群。你可以在 github 的这个 repo:https://github.com/operator-framework/awesome-operators 中查察今朝实现了 Operator 陈设的漫衍式应用。

Google 云平台,也就是 GCP 在 github 上面开源了 Spark 的 Operator,repo 地点:。Operator 陈设起来也长短常的利便,行使 Helm Chart 方法陈设如下,你可以简朴以为就是陈设一个 Kubernetes 的 API Object (Deployment)。

  1. $ helm repo add incubator http://storage.googleapis.com/kubernetes-charts-incubator 
  2. $ helm install incubator/sparkoperator --namespace spark-operator 

这个 Operator 涉及到的 CRD 如下:

  1. ScheduledSparkApplication 
  2. |__ ScheduledSparkApplicationSpec 
  3.     |__ SparkApplication 
  4. |__ ScheduledSparkApplicationStatus 
  5.  
  6. |__ SparkApplication 
  7. |__ SparkApplicationSpec 
  8.     |__ DriverSpec 
  9.         |__ SparkPodSpec 
  10.     |__ ExecutorSpec 
  11.         |__ SparkPodSpec 
  12.     |__ Dependencies 
  13.     |__ MonitoringSpec 
  14.         |__ PrometheusSpec 
  15. |__ SparkApplicationStatus 
  16.     |__ DriverInfo     

假如我要提交一个功课,那么我就可以界说如下一个 SparkApplication 的 yaml,关于 yaml 内里的字段寄义,可以参考上面的 CRD 文档。

  1. apiVersion: sparkoperator.k8s.io/v1beta1 
  2. kind: SparkApplication 
  3. metadata: 
  4.   ... 
  5. spec: 
  6.   deps: {} 
  7.   driver: 
  8.     coreLimit: 200m 
  9.     cores: 0.1 
  10.     labels: 
  11.       version: 2.3.0 
  12.     memory: 512m 
  13.     serviceAccount: spark 
  14.   executor: 
  15.     cores: 1 
  16.     instances: 1 
  17.     labels: 
  18.       version: 2.3.0 
  19.     memory: 512m 
  20.   image: gcr.io/ynli-k8s/spark:v2.4.0 
  21.   mainApplicationFile: local:///opt/spark/examples/jars/spark-examples_2.11-2.3.0.jar 
  22.   mainClass: org.apache.spark.examples.SparkPi 
  23.   mode: cluster 
  24.   restartPolicy: 
  25.       type: OnFailure 
  26.       onFailureRetries: 3 
  27.       onFailureRetryInterval: 10 
  28.       onSubmissionFailureRetries: 5 
  29.       onSubmissionFailureRetryInterval: 20 
  30.   type: Scala 
  31. status: 
  32.   sparkApplicationId: spark-5f4ba921c85ff3f1cb04bef324f9154c9 
  33.   applicationState: 
  34.     state: COMPLETED 
  35.   completionTime: 2018-02-20T23:33:55Z 
  36.   driverInfo: 
  37.     podName: spark-pi-83ba921c85ff3f1cb04bef324f9154c9-driver 
  38.     webUIAddress: 35.192.234.248:31064 
  39.     webUIPort: 31064 
  40.     webUIServiceName: spark-pi-2402118027-ui-svc 
  41.     webUIIngressName: spark-pi-ui-ingress 
  42.     webUIIngressAddress: spark-pi.ingress.cluster.com 
  43.   executorState: 
  44.     spark-pi-83ba921c85ff3f1cb04bef324f9154c9-exec-1: COMPLETED 
  45.   LastSubmissionAttemptTime: 2018-02-20T23:32:27Z 

提交功课。

  1. $ kubectl apply -f spark-pi.yaml 

比拟来看 Operator 的功课提交方法好像显得越发的冗长伟大,可是这也是一种更 kubernetes 化的 api 陈设方法,也就是 Declarative API,声明式 API。

4. 挑衅

根基上,今朝市面的大部分公司都是行使上面两种方法来做 Spark on Kubernetes 的,可是我们也知道在 Spark Core 内里对 Kubernetes 的这种 Native 方法支持着实并不是出格成熟,尚有许多可以改进的处所:

1.scheduler 差别。

(编辑:湖南网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读