【转载】Spark学习——spark中的几个概念的理解及参数配置

首先是一张Spark的部署图:

节点类型有:

1. master 节点: 常驻master进程,负责管理全部worker节点。
2. worker 节点: 常驻worker进程,负责管理executor 并与master节点通信。
dirvier:官方解释为: The process running the main() function of the application and creating the SparkContext。即理解为用户自己编写的应用程序

一、Application

application(应用)其实就是用spark-submit提交的程序。比方说spark examples中的计算pi的SparkPi。一个application通常包含三

部分:从数据源(比方说HDFS)取数据形成RDD,通过RDD的transformation和action进行计算,将结果输出到console或者外部存

储(比方说collect收集输出到console)。

二、Driver

主要完成任务的调度以及和executor和cluster manager进行协调。有client和cluster联众模式。client模式driver在任务提交的机器上

运行,而cluster模式会随机选择机器中的一台机器启动driver。从spark官网截图的一张图可以大致了解driver的功能。

三、Executor

在每个WorkerNode上为某应用启动的一个进程,该进程负责运行任务,并且负责将数据存在内存或者磁盘上,每个任务都有各自独

立的Executor。
  Executor是一个执行Task的容器。它的主要职责是:

  1、初始化程序要执行的上下文SparkEnv,解决应用程序需要运行时的jar包的依赖,加载类。

2、同时还有一个ExecutorBackend向cluster manager汇报当前的任务状态,这一方面有点类似Hadoop的tasktracker和task。

  总结:Executor是一个应用程序运行的监控和执行容器。Executor的数目可以在submit时,由 --num-executors (on yarn)指定.

四、Job

包含很多task的并行计算,可以认为是Spark RDD 里面的action,每个action的计算会生成一个job。

用户提交的Job会提交给DAGScheduler,Job会被分解成Stage和Task。

五、Task

即 stage 下的一个任务执行单元,一般来说,一个 rdd 有多少个 partition,就会有多少个 task,因为每一个 task 只是处理一个

partition 上的数据。

每个executor执行的task的数目, 可以由submit时,--num-executors(on yarn) 来指定。

六、Stage

一个Job会被拆分为多组Task,每组任务被称为一个Stage就像Map Stage, Reduce Stage。

Stage的划分在RDD的论文中有详细的介绍,简单的说是以shuffle和result这两种类型来划分。在Spark中有两类task,一类是

shuffleMapTask,一类是resultTask,第一类task的输出是shuffle所需数据,第二类task的输出是result,stage的划分也以此为依

据,shuffle之前的所有变换是一个stage,shuffle之后的操作是另一个stage。比如 rdd.parallize(1 to 10).foreach(println) 这个操作没

有shuffle,直接就输出了,那么只有它的task是resultTask,stage也只有一个;如果是rdd.map(x => (x, 1)).reduceByKey(_ +

_).foreach(println), 这个job因为有reduce,所以有一个shuffle过程,那么reduceByKey之前的是一个stage,执行shuffleMapTask,

输出shuffle所需的数据,reduceByKey到最后是一个stage,直接就输出结果了。如果job中有多次shuffle,那么每个shuffle之前都是

一个stage。

换句话来讲,就要提到spark里面的宽依赖和窄依赖:

看一下父RDD中的数据是否进入不同的子RDD,如果只进入到一个子RDD则是窄依赖,否则就是宽依赖。宽依赖和窄依赖的边界就

是stage的划分点。从spark的论文中的两张截图,可以清楚的理解宽窄依赖以及stage的划分。

上面大图大字看得有点晕,下面这幅图是找到的资料中比较清晰的:

Application:Spark 的应用程序,用户提交后,Spark为App分配资源,将程序转换并执行,其中Application包含一个Driver program和若干Executor
SparkContext:Spark 应用程序的入口,负责调度各个运算资源,协调各个 Worker Node 上的 Executor
Driver Program:运行Application的main()函数并且创建SparkContext
RDD Graph:RDD是Spark的核心结构, 可以通过一系列算子进行操作(主要有Transformation和Action操作)。当RDD遇到Action算子时,将之前的所有算子形成一个有向无环图(DAG)。再在Spark中转化为Job,提交到集群执行。一个App中可以包含多个Job
Executor:是为Application运行在Worker node上的一个进程,该进程负责运行Task,并且负责将数据存在内存或者磁盘上。每个Application都会申请各自的Executor来处理任务
Worker Node:集群中任何可以运行Application代码的节点,运行一个或多个Executor进程

Job:一个RDD Graph触发的作业,往往由Spark Action算子触发,在SparkContext中通过runJob方法向Spark提交Job
Stage:每个Job会根据RDD的宽依赖关系被切分很多Stage, 每个Stage中包含一组相同的Task, 这一组Task也叫TaskSet
Task:一个分区对应一个Task,Task执行RDD中对应Stage中包含的算子。Task被封装好后放入Executor的线程池中执行
DAGScheduler:根据Job构建基于Stage的DAG,并提交Stage给TaskScheduler
TaskScheduler:将Taskset提交给Worker node集群运行并返回结果

从经验角度来看,关于spark作业配置初始化参数应该参照:

在集群中,建议为每一个 CPU 核( core )分配 3-4 个任务。

由于spark streaming是基于simple consumer api消费kafka topic,所以一个topic有多少个partition,就有多少个task。假设我们消费

的这个topic总共有40个partition,所以起初spark streaming的task数量为40。根据上面的建议 一个CPU核分3到4个任务(这个值具体看topic消息量,

如果有很多消息的话可以适当降低一个cpu的任务量),则初始化

时我们需要10个core。一个executor可以分配2到5个core,executor的memory根据处理的数据量自行设置,一般推荐2G

如果使用了spark sql或者很多数据处理是在Driver端,可以适当的调大Driver的memory,也推荐2G,Cpu默认使用一个core

所以上面的例子最后的配置为:driver-memory=2G,driver-cores=1,num-executors=2或者5,executor-cores=5或者2,executor-

memory=2G

【转载自:http://blog.csdn.net/WangQYoho/article/details/70210486】

时间: 08-30

【转载】Spark学习——spark中的几个概念的理解及参数配置的相关文章

Spark 学习: spark 原理简述与 shuffle 过程介绍

Spark学习: 简述总结 Spark 是使用 scala 实现的基于内存计算的大数据开源集群计算环境.提供了 java,scala, python,R 等语言的调用接口. Spark学习 简述总结 引言 1 Hadoop 和 Spark 的关系 Spark 系统架构 1 spark 运行原理 RDD 初识 shuffle 和 stage 性能优化 1 缓存机制和 cache 的意义 2 shuffle 的优化 3 资源参数调优 4 小结 本地搭建 Spark 开发环境 1 Spark-Scal

HTTP中关于幂等概念的理解

幂等性是分布式系统设计中十分重要的概念 幂等的方法意味着请求成功执行所得到的的结果不依赖于该方法被执行的次数.幂等指的是当你使用相同的值调用相同的功能时,结果完全一致,这是它的数学定义 如果具有相同输入的一个操作没有改变任何的事情,那么它是幂等的.但是,如果这个操作改变了任意的状态,比如说它记录了这个请求的最后时间,那么它就不是幂等的. 根据这一原则分析一下HTTP中的方法的幂等性 HTTP1.1规范声明GET,HEAD,PUT方法是幂等的,不过也可以自定义一个非幂等的doGet方法(但不应该这

[转载] 彻底学习STL中的Allocator

原文: http://cissco.iteye.com/blog/379093 帮助我们理解allocator的原理 Allocator是C++语言标准库中最神秘的部分之一.它们很少被显式使用,标准也没有明确出它们应该在什么时候被使用.今天的allocator与最初的STL建议非常不同,在此过程中还存在着另外两个设计--这两个都依赖于语言的一些特性,而直到最近才在很少的几个编译器上可用.对allocator的功能,标准似乎在一些方面追加了承诺,而在另外一些方面撤销了承诺. 这篇专栏文章将讨论你能

【转载】Spark学习 & 机器学习

继续Spark学习,开始的文章:http://www.cnblogs.com/charlesblc/p/6106603.html 参考了这个系列的文章: http://www.cnblogs.com/shishanyuan/p/4699644.html <倾情大奉送--Spark入门实战系列>实验数据下载在上面那篇开始的文章有说明. 先看了上手实验的一部分,因为之前Spark已经安装好了,见 http://www.cnblogs.com/charlesblc/p/6014158.html 上手

spark中flatMap函数用法--spark学习(基础)

spark中flatMap函数用法--spark学习(基础) 在spark中map函数和flatMap函数是两个比较常用的函数.其中 map:对集合中每个元素进行操作. flatMap:对集合中每个元素进行操作然后再扁平化. 理解扁平化可以举个简单例子 val arr=sc.parallelize(Array(("A",1),("B",2),("C",3))) arr.flatmap(x=>(x._1+x._2)).foreach(prin

如何在spark中读写cassandra数据 ---- 分布式计算框架spark学习之六

由于预处理的数据都存储在cassandra里面,所以想要用spark进行数据分析的话,需要读取cassandra数据,并把分析结果也一并存回到cassandra:因此需要研究一下spark如何读写cassandra. 话说这个单词敲起来好累,说是spark,其实就是看你开发语言是否有对应的driver了. 因为cassandra是datastax主打的,所以该公司也提供了spark的对应的driver了,见这里. 我就参考它的demo,使用scala语言来测试一把. 1.执行代码 //Cassa

Apache Spark 2.2中基于成本的优化器(CBO)(转载)

Apache Spark 2.2最近引入了高级的基于成本的优化器框架用于收集并均衡不同的列数据的统计工作 (例如., 基(cardinality).唯一值的数量.空值.最大最小值.平均/最大长度,等等)来改进查询类作业的执行计划.均衡这些作业帮助Spark在选取最优查询计划时做出更好决定.这些优化的例子包括在做hash-join时选择正确的一方建hash,选择正确的join类型(广播hash join和全洗牌hash-join)或调整多路join的顺序,等等) 在该博客中,我们将深入讲解Spar

用Spark学习矩阵分解推荐算法

在矩阵分解在协同过滤推荐算法中的应用中,我们对矩阵分解在推荐算法中的应用原理做了总结,这里我们就从实践的角度来用Spark学习矩阵分解推荐算法. 1. Spark推荐算法概述 在Spark MLlib中,推荐算法这块只实现了基于矩阵分解的协同过滤推荐算法.而基于的算法是FunkSVD算法,即将m个用户和n个物品对应的评分矩阵M分解为两个低维的矩阵:$$M_{m \times n}=P_{m \times k}^TQ_{k \times n}$$ 其中k为分解成低维的维数,一般远比m和n小.如果大

Spark学习笔记总结-入门资料精化

Spark简介 spark 可以很容易和yarn结合,直接调用HDFS.Hbase上面的数据,和hadoop结合.配置很容易. spark发展迅猛,框架比hadoop更加灵活实用.减少了延时处理,提高性能效率实用灵活性.也可以与hadoop切实相互结合. spark核心部分分为RDD.Spark SQL.Spark Streaming.MLlib.GraphX.Spark R等核心组件解决了很多的大数据问题,其完美的框架日受欢迎.其相应的生态环境包括zepplin等可视化方面,正日益壮大.大型公