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