此文章打算梳理之前项目所用过的Spark的一些基础概念。
Spark是一个计算框架
Hadoop是包含计算框架MapReducehe分布式文件系统HDFS。
Spark是基于内存的
Spark:
Spark有四大组件包括Spark Streaming、Spark SQL、Spark MLlib和Spark GraphX。
四大组件的应用场景可以参考这篇文章:http://f.dataguru.cn/thread-593630-1-1.html
使用的Spark的部署模式为独立模式,即不依赖其它的资源管理系统。
Spark的三种部署模式可以参考这篇文章:https://wenku.baidu.com/view/284ba2ec227916888586d78d.html
Spark的Application、Driver节点、Worker节点、Executor
(1)Application就是你写的代码。
(2)Driver节点上的Driver程序运行的是main函数
(3)Worker节点就是工作节点,上面运行Executor进程。
(4)Executor进程负责运行Task。
Spark的job、state、task
如这里的collect()算子就是一个action。
如何划分stage?
我的理解是:如果有n个shuffle过程,那就有n+1个stage。
参考文章:http://litaotao.github.io/spark-questions-concepts
闭包:
由上述图片介绍可知,闭包会导致全局变量不能被所有Worker共享,即一个Worker修改了全局变量后,对其它的Worker是透明的。
闭包带来的问题的参考文章:https://blog.csdn.net/liangyihuai/article/details/56840473
由上述图片可知,每个task都会接受的一个闭包,有时候会太浪费资源了。因此出现了Broadcast variables,该变量发送给每一个executor,executor将广播变量缓存。广播变量是单向传播的,从驱动到任务,没有办法更新广播变量或者将更新传播回驱动程序。这种情况下,可以通过Accumulator来实现。
Accumulators
当一个作业运行完毕后,累积器的最终值可以从驱动程序中获取
介绍Broadcast variables和Accumulators的参考文章:https://www.zybuluo.com/BrandonLin/note/446869