Spark开发-spark运行原理和RDD

来源:互联网 发布:大数据促进旅游产业 编辑:程序博客网 时间:2024/06/05 08:35

核心
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>:27data: org.apache.spark.rdd.RDD[String] = /input/passwd MapPartitionsRDD[1] at textFile at <console>:27scala> data.toDebugString17/09/13 22:20:50 INFO mapred.FileInputFormat: Total input paths to process : 1res0: 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同时也会生成新的MapPartitionsRDDscala> val flatted=data.flatMap(_.split(":"))flatted: org.apache.spark.rdd.RDD[String] = MapPartitionsRDD[2] at flatMap at <console>:29scala> val maped=flatted.map(word=>(word,1))maped: org.apache.spark.rdd.RDD[(String, Int)] = MapPartitionsRDD[3] at map at <console>:31scala> val reduced=maped.reduceByKey(_+_)reduced: org.apache.spark.rdd.RDD[(String, Int)] = ShuffledRDD[4] at reduceByKey at <console>:33scala> reduced.toDebugStringres1: 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

这里写图片描述