From 22a4eb911cd240341d5b11535d3589e7329098f4 Mon Sep 17 00:00:00 2001 From: Jimmy Song Date: Thu, 31 Aug 2017 14:20:27 +0800 Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E8=BF=90=E8=A1=8C=E6=94=AF?= =?UTF-8?q?=E6=8C=81kubernetes=E5=8E=9F=E7=94=9F=E8=B0=83=E5=BA=A6?= =?UTF-8?q?=E7=9A=84Spark=E7=A8=8B=E5=BA=8F=E4=B8=AD=E7=9A=84=E6=A6=82?= =?UTF-8?q?=E5=BF=B5=E8=AF=B4=E6=98=8E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../support-spark-natively-in-kubernetes.md | 42 +++++++++++++++++++ 1 file changed, 42 insertions(+) create mode 100644 usecases/support-spark-natively-in-kubernetes.md diff --git a/usecases/support-spark-natively-in-kubernetes.md b/usecases/support-spark-natively-in-kubernetes.md new file mode 100644 index 000000000..aa55c1275 --- /dev/null +++ b/usecases/support-spark-natively-in-kubernetes.md @@ -0,0 +1,42 @@ +# 运行支持kubernetes原生调度的Spark程序 + +我们之前就在 kubernetes 中运行过 standalone 方式的 spark 集群,见 + +## Spark 概念说明 + +[Apache Spark](http://spark.apache.org) 是一个围绕速度、易用性和复杂分析构建的大数据处理框架。最初在2009年由加州大学伯克利分校的AMPLab开发,并于2010年成为Apache的开源项目之一。 + +在 Spark 中包括如下组件或概念: + +- **Application**:Spark Application 的概念和 Hadoop 中的 MapReduce 类似,指的是用户编写的 Spark 应用程序,包含了一个 Driver 功能的代码和分布在集群中多个节点上运行的 Executor 代码; +- **Driver**:Spark 中的 Driver 即运行上述 Application 的 main() 函数并且创建 SparkContext,其中创建 SparkContext 的目的是为了准备Spark应用程序的运行环境。在 Spark 中由 SparkContext 负责和 ClusterManager 通信,进行资源的申请、任务的分配和监控等;当 Executor 部分运行完毕后,Driver负责将SparkContext 关闭。通常用 SparkContext 代表 Driver; +- **Executor**:Application运行在Worker 节点上的一个进程,该进程负责运行Task,并且负责将数据存在内存或者磁盘上,每个Application都有各自独立的一批Executor。在Spark on Yarn模式下,其进程名称为`CoarseGrainedExecutorBackend`,类似于 Hadoop MapReduce 中的 YarnChild。一个 `CoarseGrainedExecutorBackend` 进程有且仅有一个 executor 对象,它负责将 Task 包装成 taskRunner,并从线程池中抽取出一个空闲线程运行 Task。每个 `CoarseGrainedExecutorBackend` 能并行运行 Task 的数量就取决于分配给它的 CPU 的个数了; +- **Cluster Manager**:指的是在集群上获取资源的外部服务,目前有: + - Standalone:Spark原生的资源管理,由Master负责资源的分配; + - Hadoop Yarn:由YARN中的ResourceManager负责资源的分配; +- **Worker**:集群中任何可以运行Application代码的节点,类似于YARN中的NodeManager节点。在Standalone模式中指的就是通过Slave文件配置的Worker节点,在Spark on Yarn模式中指的就是NodeManager节点; +- **作业(Job)**:包含多个Task组成的并行计算,往往由Spark Action催生,一个JOB包含多个RDD及作用于相应RDD上的各种Operation; +- **阶段(Stage)**:每个Job会被拆分很多组 Task,每组任务被称为Stage,也可称TaskSet,一个作业分为多个阶段,每一个stage的分割点是action。比如一个job是:(transformation1 -> transformation1 -> action1 -> transformation3 -> action2),这个job就会被分为两个stage,分割点是action1和action2。 +- **任务(Task)**: 被送到某个Executor上的工作任务; + +- **Context**:启动spark application的时候创建,作为Spark 运行时环境。 +- **Dynamic Allocation(动态资源分配)**:一个配置选项,可以将其打开。从Spark1.2之后,对于On Yarn模式,已经支持动态资源分配(Dynamic Resource Allocation),这样,就可以根据Application的负载(Task情况),动态的增加和减少executors,这种策略非常适合在YARN上使用spark-sql做数据开发和分析,以及将spark-sql作为长服务来使用的场景。Executor 的动态分配需要在 cluster mode 下启用 "external shuffle service"。 +- **动态资源分配策略**:开启动态分配策略后,application会在task因没有足够资源被挂起的时候去动态申请资源,这意味着该application现有的executor无法满足所有task并行运行。spark一轮一轮的申请资源,当有task挂起或等待 `spark.dynamicAllocation.schedulerBacklogTimeout` (默认1s)时间的时候,会开始动态资源分配;之后会每隔 `spark.dynamicAllocation.sustainedSchedulerBacklogTimeout` (默认1s)时间申请一次,直到申请到足够的资源。每次申请的资源量是指数增长的,即1,2,4,8等。之所以采用指数增长,出于两方面考虑:其一,开始申请的少是考虑到可能application会马上得到满足;其次要成倍增加,是为了防止application需要很多资源,而该方式可以在很少次数的申请之后得到满足。 + +## 架构设计 + + + +## 参考 + +[Spark动态资源分配-Dynamic Resource Allocation](http://lxw1234.com/archives/2015/12/593.htm) + +[Running Spark on Kubernetes](https://apache-spark-on-k8s.github.io/userdocs/running-on-kubernetes.html) + +[Apache Spark Jira Issue - 18278 - SPIP: Support native submission of spark jobs to a kubernetes cluster](https://issues.apache.org/jira/browse/SPARK-18278) + +[Kubernetes Github Issue - 34377 Support Spark natively in Kubernetes](https://github.com/kubernetes/kubernetes/issues/34377) + +[Kubernetes example spark](https://github.com/kubernetes/kubernetes/tree/master/examples/spark) + +https://github.com/rootsongjc/spark-on-kubernetes \ No newline at end of file