Spark on k8s

简介: 前言Spark 自从2.3版本以来就支持运行在k8s上,本文主要介绍如何运行Spark在阿里云容器服务-Kubernetes。前提条件1、 已经购买阿里云容器服务-Kubernetes。购买链接:Kubernetes控制台。

前言

Spark 自从2.3版本以来就支持运行在k8s上,本文主要介绍如何运行Spark在阿里云容器服务-Kubernetes。

前提条件

1、 已经购买阿里云容器服务-Kubernetes。购买链接:Kubernetes控制台。本例k8s集群类型为:Kubernetes 托管版。
2、 Spark镜像已构建。本例构建Spark的镜像的Dokerfile内容为:

# 基础镜像
FROM registry.cn-beijing.aliyuncs.com/acs/spark:v2.4.0

# 作者
LABEL maintainer "guangcheng.zgc@alibaba-inc.com"

#拷贝jar包到制定目录
COPY ./spark-examples-0.0.1-SNAPSHOT.jar /opt/spark/examples/jars/

镜像构建完后的registry的地址为:registry.cn-beijing.aliyuncs.com/bill_test/image_test:v2.4.0
3、 本例通过k8s 客户端提交yaml文件启动Spark任务。

下面详情介绍下每个步骤

制作Spark镜像

制作Spark镜像需要先在本地安装Docker,本例介绍Mac的安装方法。在Mac中执行:

brew cask install docker

安装完毕后执行docker命令显示如下内容说明安装成功。

Usage:    docker [OPTIONS] COMMAND

A self-sufficient runtime for containers

Options:
      --config string      Location of client config files (default "/Users/bill.zhou/.docker")
  -D, --debug              Enable debug mode
  -H, --host list          Daemon socket(s) to connect to
  -l, --log-level string   Set the logging level ("debug"|"info"|"warn"|"error"|"fatal") (default "info")
      --tls                Use TLS; implied by --tlsverify
      --tlscacert string   Trust certs signed only by this CA (default "/Users/bill.zhou/.docker/ca.pem")
      --tlscert string     Path to TLS certificate file (default "/Users/bill.zhou/.docker/cert.pem")
      --tlskey string      Path to TLS key file (default "/Users/bill.zhou/.docker/key.pem")
      --tlsverify          Use TLS and verify the remote
  -v, --version            Print version information and quit

制作docker镜像需要编写Dockerfile,本例的Dockerfile创建过程如下。

#进入目录:
cd /Users/bill.zhou/dockertest
#拷贝测试jar包到此目录:
cp /Users/jars/spark-examples-0.0.1-SNAPSHOT.jar ./
#创建文件Dockerfile
vi Dockerfile

在Dockerfile文件中输入如下内容:

# 基础镜像
FROM registry.cn-beijing.aliyuncs.com/acs/spark:v2.4.0

# 作者
LABEL maintainer "guangcheng.zgc@alibaba-inc.com"

#拷贝jar包到制定目录
COPY ./spark-examples-0.0.1-SNAPSHOT.jar /opt/spark/examples/jars/

本例镜像引用了别人的基础镜像:registry.cn-beijing.aliyuncs.com/acs/spark:v2.4.0,然加入了自己的测试代码jar包:spark-examples-0.0.1-SNAPSHOT.jar。
Dockerfile编写完毕后,开始构建镜像,命令如下:

docker build /Users/bill.zhou/dockertest/ -t registry.cn-beijing.aliyuncs.com/bill_test/image_test:v2.4.0

构建完毕后需要上传镜像到registry,命令如下:

#先登录自己的阿里云账号
docker login --username=zhouguangcheng007@aliyun.com registry.cn-beijing.aliyuncs.com
#上传镜像
docker push registry.cn-beijing.aliyuncs.com/bill_test/image_test:v2.4.0

镜像制作完毕后可以开始试用Spark镜像。

提交任务到k8s集群

本例通过k8s客户端kubectl提交yaml到k8s。
首先购买一次ECS(和k8s在同一个vpc下),安装k8s客户端kubectl。安装指导参考:安装k8s指导
安装完毕后配置集群的凭证后就可以访问k8s集群了。集群凭证配置方法,进入k8s集群“基本信息”页面获取凭证信息,如下图:
Snip20190724_11
然后参考如下步骤提交spark任务:

## 安装crd
kubectl apply -f manifest/spark-operator-crds.yaml 
## 安装operator的服务账号与授权策略
kubectl apply -f manifest/spark-operator-rbac.yaml 
## 安装spark任务的服务账号与授权策略
kubectl apply -f manifest/spark-rbac.yaml 
## 安装spark-on-k8s-operator 
kubectl apply -f manifest/spark-operator.yaml 
## 下发spark-pi任务
kubectl apply -f examples/spark-pi.yaml 

对应的文件参可以从开源社区下载最新版本。

运行完毕后可以通过命令查看运行日志。如下:

#查看pod -n指定命名空间
kubectl get pod -n spark-operator
#查看pod 日志
kubectl log spark-pi-driver -n spark-operator

看下如下内容说明执行成功:

2019-07-23 11:55:54 INFO  SparkContext:54 - Created broadcast 0 from broadcast at DAGScheduler.scala:1161
2019-07-23 11:55:54 INFO  DAGScheduler:54 - Submitting 2 missing tasks from ResultStage 0 (MapPartitionsRDD[1] at map at SparkPi.scala:17) (first 15 tasks are for partitions Vector(0, 1))
2019-07-23 11:55:54 INFO  TaskSchedulerImpl:54 - Adding task set 0.0 with 2 tasks
2019-07-23 11:55:55 INFO  TaskSetManager:54 - Starting task 0.0 in stage 0.0 (TID 0, 172.20.1.9, executor 1, partition 0, PROCESS_LOCAL, 7878 bytes)
2019-07-23 11:55:55 INFO  TaskSetManager:54 - Starting task 1.0 in stage 0.0 (TID 1, 172.20.1.9, executor 1, partition 1, PROCESS_LOCAL, 7878 bytes)
2019-07-23 11:55:57 INFO  BlockManagerInfo:54 - Added broadcast_0_piece0 in memory on 172.20.1.9:36662 (size: 1256.0 B, free: 117.0 MB)
2019-07-23 11:55:57 INFO  TaskSetManager:54 - Finished task 1.0 in stage 0.0 (TID 1) in 2493 ms on 172.20.1.9 (executor 1) (1/2)
2019-07-23 11:55:57 INFO  TaskSetManager:54 - Finished task 0.0 in stage 0.0 (TID 0) in 2789 ms on 172.20.1.9 (executor 1) (2/2)
2019-07-23 11:55:57 INFO  TaskSchedulerImpl:54 - Removed TaskSet 0.0, whose tasks have all completed, from pool
2019-07-23 11:55:58 INFO  DAGScheduler:54 - ResultStage 0 (reduce at SparkPi.scala:21) finished in 5.393 s
2019-07-23 11:55:58 INFO  DAGScheduler:54 - Job 0 finished: reduce at SparkPi.scala:21, took 6.501405 s
**Pi is roughly 3.142955714778574**
2019-07-23 11:55:58 INFO  AbstractConnector:318 - Stopped Spark@49096b06{HTTP/1.1,[http/1.1]}{0.0.0.0:4040}
2019-07-23 11:55:58 INFO  SparkUI:54 - Stopped Spark web UI at http://spark-test-1563882878789-driver-svc.spark-operator-t01.svc:4040
2019-07-23 11:55:58 INFO  KubernetesClusterSchedulerBackend:54 - Shutting down all executors
2019-07-23 11:55:58 INFO  KubernetesClusterSchedulerBackend$KubernetesDriverEndpoint:54 - Asking each executor to shut down
2019-07-23 11:55:58 WARN  ExecutorPodsWatchSnapshotSource:87 - Kubernetes client has been closed (this is expected if the application is shutting down.)
2019-07-23 11:55:59 INFO  MapOutputTrackerMasterEndpoint:54 - MapOutputTrackerMasterEndpoint stopped!
2019-07-23 11:55:59 INFO  MemoryStore:54 - MemoryStore cleared
2019-07-23 11:55:59 INFO  BlockManager:54 - BlockManager stopped
2019-07-23 11:55:59 INFO  BlockManagerMaster:54 - BlockManagerMaster stopped
2019-07-23 11:55:59 INFO  OutputCommitCoordinator$

最后看下spark-pi.yaml文件内容的关键信息。

apiVersion: "sparkoperator.k8s.io/v1beta1"
kind: SparkApplication
metadata:
  name: spark-pi
  namespace: spark-operator
spec:
  type: Scala
  mode: cluster
  image: "registry.cn-beijing.aliyuncs.com/acs/spark:v2.4.0"  #运行的镜像registry路径。
  imagePullPolicy: Always
  mainClass: org.apache.spark.examples.SparkPi #运行的入口类。
  mainApplicationFile: "local:///opt/spark/examples/jars/spark-examples_2.11-2.4.0.jar"  #运行的类的相关jar包,这个路径是镜像中的路径。
  sparkVersion: "2.4.0"
  restartPolicy:
    type: Never
  volumes:
    - name: "test-volume"
      hostPath:
        path: "/tmp"
        type: Directory
  #定义spark driver端的资源
  driver:
    cores: 0.1
    coreLimit: "200m"
    memory: "512m"
    labels:
      version: 2.4.0
    serviceAccount: spark
    volumeMounts:
      - name: "test-volume"
        mountPath: "/tmp"
  #定义executor 端的资源
  executor
    cores: 1
    instances: 1
    memory: "512m"
    labels:
      version: 2.4.0
    volumeMounts:
      - name: "test-volume"
        mountPath: "/tmp"

yaml是提交到k8s文件标准格式,yaml中定义了所需的镜像,Spark driver和executor端的资源。

总结

k8s容器介绍请参考:容器服务Kubernetes版
其它spark on k8s请参考:
Spark in action on Kubernetes - Playground搭建与架构浅析
Spark in action on Kubernetes - Spark Operator的原理解析

相关实践学习
通过Ingress进行灰度发布
本场景您将运行一个简单的应用,部署一个新的应用用于新的发布,并通过Ingress能力实现灰度发布。
容器应用与集群管理
欢迎来到《容器应用与集群管理》课程,本课程是“云原生容器Clouder认证“系列中的第二阶段。课程将向您介绍与容器集群相关的概念和技术,这些概念和技术可以帮助您了解阿里云容器服务ACK/ACK Serverless的使用。同时,本课程也会向您介绍可以采取的工具、方法和可操作步骤,以帮助您了解如何基于容器服务ACK Serverless构建和管理企业级应用。 学习完本课程后,您将能够: 掌握容器集群、容器编排的基本概念 掌握Kubernetes的基础概念及核心思想 掌握阿里云容器服务ACK/ACK Serverless概念及使用方法 基于容器服务ACK Serverless搭建和管理企业级网站应用
目录
相关文章
|
7月前
|
Kubernetes Java 流计算
Flink application on k8s 有没有和 session 模式通过-C 指定额外的 jar 的相同功能啊?
Flink application on k8s 有没有和 session 模式通过-C 指定额外的 jar 的相同功能啊?
93 0
|
弹性计算 资源调度 Kubernetes
Flink三种集群模式,Standalone模式,Flink On YARN,Flink On K8S,这三种模式有啥优缺点,生产环境如何选择呢?
Flink三种集群模式,Standalone模式,Flink On YARN,Flink On K8S,这三种模式有啥优缺点,生产环境如何选择呢?
1077 3
|
7月前
|
Kubernetes 固态存储 容器
pulsar on k8s
pulsar on k8s
|
7月前
|
存储 Kubernetes Apache
pulsar on k8s 部署验证
pulsar on k8s 部署验证
|
6月前
|
分布式计算 Kubernetes Spark
大数据之spark on k8s
大数据之spark on k8s
222 2
|
7月前
|
分布式计算 Kubernetes 监控
容器服务Kubernetes版产品使用合集之怎么实现把 spark 跑在k8s
容器服务Kubernetes版,作为阿里云提供的核心服务之一,旨在帮助企业及开发者高效管理和运行Kubernetes集群,实现应用的容器化与微服务化。以下是关于使用这些服务的一些建议和合集,涵盖基本操作、最佳实践、以及一些高级功能的使用方法。
|
7月前
|
分布式计算 Kubernetes Java
spark on k8s native
spark on k8s native
|
分布式计算 Kubernetes Serverless
Hago 的 Spark on ACK 实践
Hago 的 Spark on ACK 实践
|
分布式计算 Kubernetes Spark
Spark on k8s 试用步骤
背景:Spark 2.3.0 开始支持使用k8s 作为资源管理原生调度spark。使用k8s原生调度的spark主要有以下好处: 采用k8s原生调度,不再需要二级调度,直接使用k8s原生的调度模块,实现与其他应用的混布;资源隔离:任务可以提交到指定的namespace,这样可以复用k8s原生的qo.
2987 0
|
1月前
|
分布式计算 大数据 Apache
ClickHouse与大数据生态集成:Spark & Flink 实战
【10月更文挑战第26天】在当今这个数据爆炸的时代,能够高效地处理和分析海量数据成为了企业和组织提升竞争力的关键。作为一款高性能的列式数据库系统,ClickHouse 在大数据分析领域展现出了卓越的能力。然而,为了充分利用ClickHouse的优势,将其与现有的大数据处理框架(如Apache Spark和Apache Flink)进行集成变得尤为重要。本文将从我个人的角度出发,探讨如何通过这些技术的结合,实现对大规模数据的实时处理和分析。
130 2
ClickHouse与大数据生态集成:Spark & Flink 实战
下一篇
DataWorks