Spark调度架构原理详解

 更新时间:2017年12月26日 14:32:09   作者:土肥圆的猿  
这篇文章主要介绍了Spark 调度架构原理详解,具有一定借鉴价值,需要的朋友可以参考下。

1.启动spark集群,就是执行sbin/start-all.sh,启动master和多个worker节点,master主要作为集群的管理和监控,worker节点主要担任运行各个application的任务。master节点需要让worker节点汇报自身状况,比如CPU,内存多大,这个过程都是通过心跳机制来完成的

2.master收到worker的汇报信息之后,会给予worker信息

3.driver提交任务给spark集群[driver和master之间的通信是通过AKKAactor来做的,也就是说master是akkaactor异步通信模型中的一个actor模型,driver也是一样,driver异步向mater发送注册信息(registerApplication)异步注册信息]

4.master节点对application预估,7个G的内存完成任务,对任务进行分配,每一个worker节点上都分配3.5G的内存去执行任务,在master就对各个worker上的任务进行整体的监控调度

5.worker节点领到任务,开始执行,在worker节点上启动相应的executor进程来执行,每个executor中都有一个线程池的概念,里面存有多个task线程

6.executor会从线程池中取出task去计算rddpatition中的数据,transformation操作,action操作

7.worker节点向driver节点汇报计算状态

通过本地并行化集合创建RDD

public class JavaLocalSumApp{
	public static void main(String[] args){
		SparkConf conf = new SparkConf().setAppName("JavaLocalSumApp");
		JavaSparkContext sc = new JavaSparkContext(conf);
		List<Integer> list = Arrays.asList(1,3,4,5,6,7,8);
		//通过本地并行化集合创建RDD
		JavaRDD <Integer> listRDD = sc.parallelize(list);
		//求和
		Integer sum = listRDD.reduce(new Function2<Integer,Integer,Integer,Integer>(){
			@Override
			    public Integer call(Integer v1,Integer v2) throws Exception{
				return v1+v2;
			}
		}
		);
		System.out.println(sum)
	}
}
//java 中的函数式编程,需要将编译器设置成1.8
listRDD.reduce((v1,v2)=> v1+v2)

Sparktransformation和action操作

RDD:弹性分布式数据集,是一种集合,支持多种来源,有容错机制,可以被缓存,支持并行操作,一个RDD代表一个分区里的数据集

RDD有两种操作算子:

Transformation(转化):Transformation属于延迟计算,当一个RDD转换成另一个RDD时并没有立即进行转换,紧紧是记住了数据集的逻辑操作

Action(执行):触发Spark作业的运行,真正触发转换算子的计算

spark算子的作用

该图描述的是Spark在运行转换中通过算子对RDD进行转换,算子是RDD中定义的函数,可以对RDD中的数据进行转换和操作。

输入:在Spark程序运行中,数据从外部数据空间(如分布式存储:textFile读取HDFS等,parallelize方法输入Scala集合或数据)输入Spark ,数据进入Spark运行时数据空间,转化为Spark中的数据块,通过BlockManager进行管理

运行:在Spark数据输入形成RDD后便可以通过变换算子,如filter等。对数据进行操作并将RDD转换为新的RDD,通过Action算子,触发Spark提交作业,如果数据需要复用,可以通过Cache算子,将数据缓存到内存

输出:程序运行结束数据会输出Spark运行时空间,存储到分布式存储中(如saveAsTextFile输出到HDFS),或Scala数据或集合中(collect输出到Scala集合,count返回Scala int 型数据)

Transformation 和 Actions操作概况

Transformation

map(func):返回一个新的分布式数据集,由每个原元素经过func函数转换后组成
filter(func) :返回一个新的数据集,由经过func函数
flatMap(func):类似于map,但是每一个输入元素,会被映射为0到多个输出元素(因此,func函数的返回值是一个Seq,而不是单一元素)
sample(withReplacement, frac, seed): 根据给定的随机种子seed,随机抽样出数量为frac的数据
union(otherDataset): 返回一个新的数据集,由原数据集和参数联合而成
roupByKey([numTasks]): 在一个由(K,V)对组成的数据集上调用,返回一个(K,Seq[V])对的数据集。注意:默认情况下,使用8个并行任务进行分组,你可以传入numTask可选参数,根据数据量设置不同数目的Task
reduceByKey(func, [numTasks]): 在一个(K,V)对的数据集上使用,返回一个(K,V)对的数据集,key相同的值,都被使用指定的reduce函数聚合到一起。和groupbykey类似,任务的个数是可以通过第二个可选参数来配置的。
join(otherDataset, [numTasks]): 在类型为(K,V)和(K,W)类型的数据集上调用,返回一个(K,(V,W))对,每个key中的所有元素都在一起的数据集
groupWith(otherDataset, [numTasks]): 在类型为(K,V)和(K,W)类型的数据集上调用,返回一个数据集,组成元素为(K, Seq[V], Seq[W]) Tuples。这个操作在其它框架,称为CoGroup
cartesian(otherDataset): 笛卡尔积。但在数据集T和U上调用时,返回一个(T,U)对的数据集,所有元素交互进行笛卡尔积。

Actions操作

reduce(func): 通过函数func聚集数据集中的所有元素。Func函数接受2个参数,返回一个值。这个函数必须是关联性的,确保可以被正确的并发执行
collect(): 在Driver的程序中,以数组的形式,返回数据集的所有元素。这通常会在使用filter或者其它操作后,返回一个足够小的数据子集再使用,直接将整个RDD集Collect返回,很可能会让Driver程序OOM
count(): 返回数据集的元素个数
take(n): 返回一个数组,由数据集的前n个元素组成。注意,这个操作目前并非在多个节点上,并行执行,而是Driver程序所在机器,单机计算所有的元素(Gateway的内存压力会增大,需要谨慎使用)
first(): 返回数据集的第一个元素(类似于take(1))
saveAsTextFile(path): 将数据集的元素,以textfile的形式,保存到本地文件系统,hdfs或者任何其它hadoop支持的文件系统。Spark将会调用每个元素的toString方法,并将它转换为文件中的一行文本
saveAsSequenceFile(path): 将数据集的元素,以sequencefile的格式,保存到指定的目录下,本地系统,hdfs或者任何其它hadoop支持的文件系统。RDD的元素必须由key-value对组成,并都实现了Hadoop的Writable接口,或隐式可以转换为Writable(Spark包括了基本类型的转换,例如Int,Double,String等等)
foreach(func): 在数据集的每一个元素上,运行函数func。这通常用于更新一个累加器变量,或者和外部存储系统做交互

WordCount执行过程

总结

以上就是本文关于Spark 调度架构原理详解的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站其他相关专题,如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!

相关文章

  • SpringBoot @ExceptionHandler与@ControllerAdvice异常处理详解

    SpringBoot @ExceptionHandler与@ControllerAdvice异常处理详解

    在Spring Boot应用的开发中,不管是对底层数据库操作,对业务层操作,还是对控制层操作,都会不可避免的遇到各种可预知的,不可预知的异常需要处理,如果每个处理过程都单独处理异常,那么系统的代码耦合度会很高,工作量大且不好统一,以后维护的工作量也很大
    2022-10-10
  • Java程序打包成带参数的jar文件实例代码

    Java程序打包成带参数的jar文件实例代码

    这篇文章主要介绍了Java程序打包成带参数的jar文件实例代码,需要的朋友可以参考下
    2017-09-09
  • Linux系统Java环境配置教程

    Linux系统Java环境配置教程

    这篇文章给大家介绍的Linux 系统Java环境配置教程,非常不错,具有参考借鉴价值,需要的朋友参考下吧
    2018-05-05
  • gradle项目中资源文件的相对路径打包技巧必看

    gradle项目中资源文件的相对路径打包技巧必看

    这篇文章主要介绍了gradle项目中资源文件的相对路径打包技巧必看篇,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2020-11-11
  • Java的MD5工具类和客户端测试类

    Java的MD5工具类和客户端测试类

    这篇文章主要介绍了Java的MD5工具类和客户端测试类,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2021-12-12
  • SpringBoot如何使用@RequestBody进行数据校验

    SpringBoot如何使用@RequestBody进行数据校验

    在Web开发中,前台向后台发送数据是非常常见的场景,而在SpringBoot框架中,我们通常使用@RequestBody注解来接收前台发送的 JSON数据,并将其转化为Java对象,本文将介绍如何在 SpringBoot 中使用 @RequestBody 进行数据校验
    2023-06-06
  • Java中的异步非阻塞AIO模型详解

    Java中的异步非阻塞AIO模型详解

    这篇文章主要介绍了Java中的异步非阻塞AIO模型详解,AIO需要操作系统的支持,在linux内核2.6版本中加入了对真正异步IO的支持,java从jdk1.7开始支持AIO,本文提供了部分实现代码,需要的朋友可以参考下
    2023-09-09
  • Java对象的内存布局详细介绍

    Java对象的内存布局详细介绍

    这篇文章主要介绍了Java对象的内存布局,我们知道在Java中基本数据类型的大小,例如int类型占4个字节、long类型占8个字节,那么Integer对象和Long对象会占用多少内存呢?本文介绍一下Java对象在堆中的内存结构以及对象大小的计算
    2023-02-02
  • Java后端用EL表达式改进JSP

    Java后端用EL表达式改进JSP

    EL 全名为Expression Language,EL的语法很简单,它最大的特点就是使用上很方便,本文带你用EL表达式改进JSP,感兴趣的朋友来看看吧
    2022-02-02
  • java并发容器CopyOnWriteArrayList实现原理及源码分析

    java并发容器CopyOnWriteArrayList实现原理及源码分析

    这篇文章主要为大家详细介绍了java并发容器CopyOnWriteArrayList实现原理及源码,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-05-05

最新评论