Spark特点
1.Spark是为集群计算中的特定类型的工作负载而设计,即在并行操作之间重用工作数据集的工作负载。为了优化这些类型的工作负载,Spark引进了内存集群计算的概念,可在内存集群计算中将数据集缓存在内存中,以缩短访问延迟。
2.Spark提供的数据集操作类型有很多种。
3.Spark充分利用内存进行缓存,比较合适做迭代式的运算,有相当一部分机器学习算法是通过多次迭代收敛的算法,适合用Spark来实现。
Spark适用于两种类型的应用
迭代算法类(机器学习、图计算)
交互式数据挖掘
Spark系统结构
RDD 弹性分布式数据集,作用于RDD的各种操作分为transformation和action。
Job 包含多个RDD及作用于相应RDD上的各种操作。
一个job分为多个stage,一个RDD中的数据可以分成多个partition。
DAG,有向无环图,反应RDD之间的依赖关系。
窄依赖,子RDD依赖于父RDD固定的data partition。
宽依赖,子RDD对父RDD中所有data partition都有依赖。
编程模型
RDD是只读的数据分区集合。
RDD经过Transformation处理之后,数据集中的内容会发生改变,经过Action处理之后,数据集中的内容会被归约为一个具体的数值。
只有当RDD上有action时,该RDD及其父RDD上的所有操作才会被提交执行。
缓存机制
RDD的中间计算结果可以被缓存起来,缓存先选Memory,如果memory不够,将会被写入到磁盘中。根据LRU算法决定哪些内容保存在内存,哪些保存在磁盘。
部署
当有Action作用于某RDD时,该action会作为一个job被提交。在提交的过程中,DAGScheduler模块介入运算,计算RDD之间的依赖关系。RDD之间的依赖关系就形成了DAG。
Spark启动
$SPARK_HOME为SPARK根目录。
local模式启动:
MASTER=local bin/spark-shell
local cluster启动:
local cluster模式是一种伪cluster模式。启动顺序为:
1.启动master。$SPARK_HOME/sbin/start-master.sh,master在8080端口启动监听。
2.启动worker
bin/spark-class org.apache.spark.deploy.worker.Worker spark://localhost:7077 -i 127.0.0.1 -c 1 -m 512M
3.启动spark-shell
日志默认保存在$SPARK_HOME/logs目录。
MASTER=spark://localhost:7077 [executor number ,core number , 内存大小] bin/spark-shell
修改配置
配置文件在$SPARK_HOME/conf目录。
spark-env.sh文件添加内容:
export SPARK_MASTER_IP=
export SPARK_LOCAL_IP=
运行
scala>
Spark架构
Cluster Manager :相当于master。
Worker Node:相当于slave node。
Job的每个stage可以运行一到多个task,通过多个task实现并行运行功能。
在集群方式下,Cluster Manager运行在一个jvm进程之中,worker运行在另一个jvm进程中。在local cluster中,这些jvm进程都在同一台机器中。
DAGScheduler: 实现将Spark作业分解成一到多个stage,每个stage根据RDD的Partition个数决定Task的个数,然后生成相应的Task set放到TaskScheduler中。
TaskScheduler:实现Task分配到Executor上执行。
提交作业的两种方式
![\](https://i-blog.csdnimg.cn/blog_migrate/e5e0abd943655fbec469c82344bf10f4.png)
./bin/run-example org.apache.spark.examples.SparkPI spark://host:port
客户端启动后直接运行用户程序,启动Driver相关工作:DAGScheduler和BlockManagerMaster等。客户端的Driver向Master注册,Master让Worker启动Exeuctor。ExecutorBackend启动后会向Driver的SchedulerBackend注册。随后过程同上。
基于Yarn的Spark架构与作业执行流程
这里的Spark AppMaster相当于Standalone模式下的SchedulerBackend。Spark AppMaster中包括DAGScheduler和YarnClusterScheduler。
JOB的生成和运行
1.由应用程序创建SparkContext实例。
2.利用SparkContext的实例来创建生成RDD。
3.经过多个transformation操作,原始RDD转换成其他类型的RDD。
4.当action作用于转换之后的RDD时,调用SparkContext的runJob方法。
5.sc.runJob->DAGScheduler.runJob->submitJob
6.将job划分为stage,生成finalStage并提交运行。在submitStage中计算stage之间的依赖关系,依赖关系分为宽依赖和窄依赖。如果计算中发现当前的stage没有任何依赖或者所有的依赖都已经准备完毕,则提交task。
7.task真正运行在哪个worker上面是由TaskScheduler来管理,也决定了每个stage可以运行几个task,每个Worker包含一个executor,executor中可以运行多个task。TaskScheduler:submitTasks来提交task。
Task运行
1.首先根据初始化参数生成SparkConf,再根据SparkConf来创建SparkEnv,SparkEnv主要包含几个关键组件:
BlockManager 、MapOutputTracker、ShuffleFetcher、ConnectionManager。
RDD转换过程
textFile 先生成hadoopRDD,然后通过map操作生成MappedRDD。
flatMap 将输入RDD转换成FlatMappedRDD。
map 将输入RDD转换成MappedRDD。
数据集操作分类
操作之后,数据集size不变。 map
操作之后,数据集size扩大。 flatmap
操作之后,数据集size缩小。 subtract
多个数据集合并。 combine、join
一个数据集分裂成多个数据集。 groupBy
Spark:Transformation和Action
transformation:得到一个新的RDD。
action: 得到一个结果。