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的原理解析

相关实践学习
深入解析Docker容器化技术
Docker是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的Linux机器上,也可以实现虚拟化,容器是完全使用沙箱机制,相互之间不会有任何接口。Docker是世界领先的软件容器平台。开发人员利用Docker可以消除协作编码时“在我的机器上可正常工作”的问题。运维人员利用Docker可以在隔离容器中并行运行和管理应用,获得更好的计算密度。企业利用Docker可以构建敏捷的软件交付管道,以更快的速度、更高的安全性和可靠的信誉为Linux和Windows Server应用发布新功能。 在本套课程中,我们将全面的讲解Docker技术栈,从环境安装到容器、镜像操作以及生产环境如何部署开发的微服务应用。本课程由黑马程序员提供。     相关的阿里云产品:容器服务 ACK 容器服务 Kubernetes 版(简称 ACK)提供高性能可伸缩的容器应用管理能力,支持企业级容器化应用的全生命周期管理。整合阿里云虚拟化、存储、网络和安全能力,打造云端最佳容器化应用运行环境。 了解产品详情: https://www.aliyun.com/product/kubernetes
目录
相关文章
|
Kubernetes 固态存储 容器
pulsar on k8s
pulsar on k8s
|
11月前
|
人工智能 分布式计算 调度
打破资源边界、告别资源浪费:ACK One 多集群Spark和AI作业调度
ACK One多集群Spark作业调度,可以帮助您在不影响集群中正在运行的在线业务的前提下,打破资源边界,根据各集群实际剩余资源来进行调度,最大化您多集群中闲置资源的利用率。
|
存储 Kubernetes Apache
pulsar on k8s 部署验证
pulsar on k8s 部署验证
|
分布式计算 Kubernetes Spark
大数据之spark on k8s
大数据之spark on k8s
844 2
|
分布式计算 Kubernetes 监控
容器服务Kubernetes版产品使用合集之怎么实现把 spark 跑在k8s
容器服务Kubernetes版,作为阿里云提供的核心服务之一,旨在帮助企业及开发者高效管理和运行Kubernetes集群,实现应用的容器化与微服务化。以下是关于使用这些服务的一些建议和合集,涵盖基本操作、最佳实践、以及一些高级功能的使用方法。
203 1
|
分布式计算 Kubernetes Java
spark on k8s native
spark on k8s native
|
分布式计算 Kubernetes Spark
Spark on k8s 试用步骤
背景:Spark 2.3.0 开始支持使用k8s 作为资源管理原生调度spark。使用k8s原生调度的spark主要有以下好处: 采用k8s原生调度,不再需要二级调度,直接使用k8s原生的调度模块,实现与其他应用的混布;资源隔离:任务可以提交到指定的namespace,这样可以复用k8s原生的qo.
3105 0
|
8月前
|
人工智能 分布式计算 大数据
大数据≠大样本:基于Spark的特征降维实战(提升10倍训练效率)
本文探讨了大数据场景下降维的核心问题与解决方案,重点分析了“维度灾难”对模型性能的影响及特征冗余的陷阱。通过数学证明与实际案例,揭示高维空间中样本稀疏性问题,并提出基于Spark的分布式降维技术选型与优化策略。文章详细展示了PCA在亿级用户画像中的应用,包括数据准备、核心实现与效果评估,同时深入探讨了协方差矩阵计算与特征值分解的并行优化方法。此外,还介绍了动态维度调整、非线性特征处理及降维与其他AI技术的协同效应,为生产环境提供了最佳实践指南。最终总结出降维的本质与工程实践原则,展望未来发展方向。
435 0
|
分布式计算 大数据 Apache
ClickHouse与大数据生态集成:Spark & Flink 实战
【10月更文挑战第26天】在当今这个数据爆炸的时代,能够高效地处理和分析海量数据成为了企业和组织提升竞争力的关键。作为一款高性能的列式数据库系统,ClickHouse 在大数据分析领域展现出了卓越的能力。然而,为了充分利用ClickHouse的优势,将其与现有的大数据处理框架(如Apache Spark和Apache Flink)进行集成变得尤为重要。本文将从我个人的角度出发,探讨如何通过这些技术的结合,实现对大规模数据的实时处理和分析。
1058 2
ClickHouse与大数据生态集成:Spark & Flink 实战
|
11月前
|
存储 分布式计算 Hadoop
从“笨重大象”到“敏捷火花”:Hadoop与Spark的大数据技术进化之路
从“笨重大象”到“敏捷火花”:Hadoop与Spark的大数据技术进化之路
582 79

推荐镜像

更多