Spark开发-spark运行原理和RDD

核心
1、Spark运行原理
2、RDD

1、Spark运行原理
spark应用程序基本概念
application:基于spark的用户程序,包含了driver program和集群中多个executor
driver program:运行application的main()函数并且创建sparkcontext,通常用sparkcontext代表driver program
executor:是为某application运行在work node上的一个进程,该进程负责运行task,并且负责将数据存在内存或者磁盘上,每个application都有各自独立的executors
cluster manager:在集群上获取资源的外部服务(例如 standalone,mesos,yarn)
worker node :集群中任何可以运行application代码的节点
task :被送到某个executor上的工作单元
job :包含多个task组成的并行计算,往往由spark action催生,该术语可以经常在日志中看到
stage:每个job会被拆分很多组task,每组任务被称为stage,也可称taskset,该术语可以经常在日志中看到
RDD:spark的基本计算单元,可以通过一系列算子进行操作(transformation 和action)

Spark基本工作流程
spark的application在运行的时候,首先在driver程序中会创建sparkcontext作为调度的总入口,在其初始化过程中会分别创建DAGScheduler进行stage调度和TaskScheduler进行task调度两个模块,DAGScheduler模块是基于stage的调度模块,它为每个spark job计算具有依赖关系的多个stage任务阶段,然后将每个stage划分为具体的一组任务(通常会考虑数据的本地性等)以taskset的形式提交给底层的TaskScheduler模块来具体执行,TaskScheduler负责具体启动任务,监控和汇报任务情况,而任务运行所需要的资源需要向cluster Manager申请

1个application包含了一个driver program ,1个Driver program 包含很多个job,1个job里面包含很多个stage,1个stage里面包含很多个task
这里写图片描述

spark 应用程序编程模型
1、driver program (sparkcontext)
1、1导入spark的类和隐式转换
1、2构建spark应用程序的运行环境 sparkconf
1、3初始化sparkcontext
1、4关闭sparkcontext
1、5spark-shell在启动的时候会自动构建sparkcontext名称为sc
2、executor(RDD操作)
输入 base–>RDD
transformation RDD–>RDD
action RDD—>driver or base
缓存 persist or cache

2、RDD
RDD 弹性分布式数据集(Resilient Distributed DataSets):即一个RDD代表一个被分区的只读数据集
RDD的创建只有3种方式
1、通过读取数据获取
val hdfsRDD= sc.textFile(“/input”) 会生成一个HadoopRDD 最后会转换成一个MapPartitionsRDD
2、通过其他的RDD转换来
3、通过已经存在的scala的集合
val collection = sc.parallelize(1 to 100000) 会生成一个 parallelCollectionRDD

RDD弹性特点
1、自动的进行内存和磁盘数据存储的切换
2、自动血缘的高效容错
3、task如果失败会自动特点次数的容错
4、stage失败会自动特定次数的重试,只会重试失败的stage

缓存点:
1、计算特别耗时
2、计算链条很长
3、shuffle之后
4、checkpoint之前

创建操作(creation operation) RDD的初始创建都是由SparkContext来负责的,将内存中的集合或者外部文件系统作为输入源
转换操作(transformation operation) 将一个RDD通过一定的操作变换成另一个RDD,比如file这个RDD就是通过filter操作变换成filterRDD的,所以filter就是一个转换操作
控制操作(control operation) 对RDD进行持久化,可以让RDD保存在磁盘或者内存中,以便后续重复使用。比如cache接口默认将filterRDD缓存在内存中
行动操作(action operation) 由于spark是惰性计算的,所以对于任何RDD进行行动操作,都会触发spark作业的运行,从而产生最终的结果,例如,我们队filterRDD进行的count操作就是
一个行动操作,spark中的行动操作基本分为2类,一类的操作结果变成Scala集合或者变量,另一类就是将RDD保存到外部文件或者数据库系统中

RDD与操作之间的关系图
这里写图片描述

RDD 操作实例

scala> val data=sc.textFile("/input/passwd")
17/09/13 22:20:39 INFO storage.MemoryStore: Block broadcast_0 stored as values in memory (estimated size 229.9 KB, free 2.7 GB)
17/09/13 22:20:39 INFO storage.MemoryStore: Block broadcast_0_piece0 stored as bytes in memory (estimated size 19.5 KB, free 2.7 GB)
17/09/13 22:20:39 INFO storage.BlockManagerInfo: Added broadcast_0_piece0 in memory on 192.168.18.140:55227 (size: 19.5 KB, free: 2.7 GB)
17/09/13 22:20:39 INFO spark.SparkContext: Created broadcast 0 from textFile at <console>:27
data: org.apache.spark.rdd.RDD[String] = /input/passwd MapPartitionsRDD[1] at textFile at <console>:27

scala> data.toDebugString
17/09/13 22:20:50 INFO mapred.FileInputFormat: Total input paths to process : 1
res0: String = 
(2) /input/passwd MapPartitionsRDD[1] at textFile at <console>:27 []
 |  /input/passwd HadoopRDD[0] at textFile at <console>:27 []
//toDebugString方法会打印出RDD的家族关系
//可以看到textFile方法会生成两个RDD,分别是HadoopRDD
//MapPartitionsRDD,而filter同时也会生成新的MapPartitionsRDD
scala> val flatted=data.flatMap(_.split(":"))
flatted: org.apache.spark.rdd.RDD[String] = MapPartitionsRDD[2] at flatMap at <console>:29

scala> val maped=flatted.map(word=>(word,1))
maped: org.apache.spark.rdd.RDD[(String, Int)] = MapPartitionsRDD[3] at map at <console>:31

scala> val reduced=maped.reduceByKey(_+_)
reduced: org.apache.spark.rdd.RDD[(String, Int)] = ShuffledRDD[4] at reduceByKey at <console>:33

scala> reduced.toDebugString
res1: String = 
(2) ShuffledRDD[4] at reduceByKey at <console>:33 []
 +-(2) MapPartitionsRDD[3] at map at <console>:31 []
    |  MapPartitionsRDD[2] at flatMap at <console>:29 []
    |  /input/passwd MapPartitionsRDD[1] at textFile at <console>:27 []
    |  /input/passwd HadoopRDD[0] at textFile at <console>:27 []

从spark ui上我们可以看到在做reduceByKey的时候spark做了stage的划分,其实reduceByKey产生了一个ShuffledRDD

这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值