spark(一):spark概览及逻辑执行图


上图是spark框架概要图,spark一些重要概念先简要介绍一下:

  1. cluster manager:资源管理集群,比如standalone、yarn;
  2. application:用户编写的应用程序;
  3. Driver:application中的main函数,创建的SparkContext负责与cluster manager通信,进行资源的申请、任务的分配与监控。一般认为SparkContext就是Driver;
  4. worker:集群中可以运行任务的节点;
  5. executor:worker上运行任务的进程,负责执行task;
  6. task:被executor执行的最小单位,一个stage由多个task组成;
  7. stage:一个job中的多个阶段,一般只要发生shuffle就会切分一个stage;
  8. job:一个application至少有一个job,spark只要有一个action就会产生一个job。

spark逻辑执行图的四个概要步骤

  1. 从数据源创造初始RDD;
  2. 对RDD进行一系列transformation操作,生成新的RDD[T],其中类型T可以是scala中的基本数据类型,也可以是<k, v>,如果是<k, v>那么k不能是复杂数据结构;
  3. 对最后的final RDD进行action操作,每个partition产生result;
  4. 将result回送到Driver端,进行最后的计算。

逻辑执行图的生成

  1. 如何产生RDD,应该产生哪些RDD
    一般每个transformation方法都会返回一个RDD,有些transformation还会有一些子transformation,因此可能产生多于一个的RDD;
  2. RDD的依赖关系
    RDD依赖哪些父RDD比较简单,从代码中可以直观看到;
    RDD中有多少个partition呢?这个一般是用户指定,如果未指定的话,会去父RDD中partition数最多的那个;
    RDD和父RDD的partitions之间是怎么依赖的呢?

    上图前三种是窄依赖,最后一个是宽依赖。窄依赖一般也叫完全依赖,就是说父RDD中partition的全部数据都被子RDD特定的partition依赖;宽依赖一般也叫部分依赖,就是说父RDD中某个partition的一部分数据被子RDD的partition1所依赖,而另一部分数据被子RDD的partition2所依赖,这种情况就要发生shuflle。
    一般认为父RDD的所有partition只要不被子RDD的多个partition依赖就属于窄依赖,就不会发生shuffle,但是存在特殊情况就是第三种情况:父RDD的partition被子RDD的多个partition依赖,但依然不需要发生shuffle(一般笛卡尔积是这种情况)。

常用transformation简介

  1. union:将两个RDD合并,不改变partition里的数据
  2. groupByKey:将相同key的records聚合在一起,聚合后的每条对应的value为原来所有相同的key的value组成的数组。(默认不会再map端开启conbine)
  3. reduceByKey:相当于传统的MR,对相同key的value做出一定函数处理,得出最后一个value,比如reduceByKey(+)就会相同的key的value不断相加。

    reduceByKey() 默认在 map 端开启 combine(),因此在 shuffle 之前先通过 mapPartitions 操作进行 combine,得到 MapPartitionsRDD,然后 shuffle 得到 ShuffledRDD,然后再进行 reduce(通过 aggregate + mapPartitions() 操作来实现)得到 MapPartitionsRDD。
  4. distinct:去重,这个transformation内部会先把value转出<k, ->形式的rdd,然后进行依次reduceByKey,最后再还原。
  5. cogroup(otherRdd, numPartitions):类似groupByKey,不过这个聚合两个或两个以上的RDD,产生的结果也不太一样,是每个RDD自己内部相同的key对应的value先聚合成一个数组,然后两个rdd相同key对应的数组再聚合成一个二维数组,类似于[(a, c), (f)]这样。
  6. intersection(otherRdd):抽取两个rdd的公共数据,内部会想distinct那样先把value转为<k, ->形式,之后调用cogroup,最后把有相同key的留下并还原。
  7. join(otherRdd):将两个 RDD[(K, V)] 按照 SQL 中的 join 方式聚合在一起。与 intersection() 类似,首先进行 cogroup(),得到<K, (Iterable[V1], Iterable[V2])>类型的 MappedValuesRDD,然后对 Iterable[V1] 和 Iterable[V2] 做笛卡尔集,并将集合 flat() 化。
  8. sortByKey:将 RDD[(K, V)] 中的 records 按 key 排序,ascending = true 表示升序,false 表示降序。
  9. cartesion:
    笛卡尔积就是上面提到的父RDD的partition被子RDD的多个partition依赖,但依然不需要发生shuffle的情况。
  10. coalesce:当 shuffle = false 的时候,是不能增加 partition 个数的
  11. filterByRange(lower: K, upper: K):以RDD中元素key的范围做过滤,包含lower和upper上下边界

spark常见action操作

  1. reduce(func):使用传入的函数参数 func 对数据集中的元素进行汇聚操作 (两两合并).
  2. collect():在 driver program 上将数据集中的元素作为一个数组返回. 这在执行一个 filter 或是其他返回一个足够小的子数据集操作后十分有用.
  3. count():返回数据集中的元素个数
  4. first():返回数据集中的第一个元素 (与 take(1) 类似)
  5. take(n):返回数据集中的前 n 个元素
  6. takeOrdered(n, [ordering]):以其自然序或使用自定义的比较器返回 RDD 的前 n 元素
  7. saveAsTextFile(path):数据集中的元素写入到指定目录下的一个或多个文本文件中, 该目录可以存在于本地文件系统, HDFS 或其他 Hadoop 支持的文件系统.
  8. countByKey():仅适用于 (K, V) 类型的 RDD. 返回每个 key 的 value 数的一个 hashmap (K, int) pair.
  9. foreach(func):对数据集中的每个元素执行函数 func.

原文地址:https://blog.51cto.com/4876017/2381941

时间: 2024-10-29 06:04:04

spark(一):spark概览及逻辑执行图的相关文章

Job 逻辑执行图

General logical plan 典型的 Job 逻辑执行图如上所示,经过下面四个步骤可以得到最终执行结果: 从数据源(可以是本地 file,内存数据结构, HDFS,HBase 等)读取数据创建最初的 RDD.上一章例子中的 parallelize() 相当于 createRDD(). 对 RDD 进行一系列的 transformation() 操作,每一个 transformation() 会产生一个或多个包含不同类型 T 的 RDD[T].T 可以是 Scala 里面的基本类型或数

spark(二):spark架构及物理执行图

上图是一个job的提交流程图,job提交的具体步骤如下 一旦有action,就会触发DagScheduler.runJob来提交任务,主要是先生成逻辑执行图DAG,然后调用 finalStage = newStage() 来划分 stage. new Stage() 的时候会调用 finalRDD 的 getParentStages(): getParentStages() 从 finalRDD 出发,反向 visit 逻辑执行图,遇到 NarrowDependency 就将依赖的 RDD 加入

spark DAGScheduler、TaskSchedule、Executor执行task源码分析

摘要 spark的调度一直是我想搞清楚的东西,以及有向无环图的生成过程.task的调度.rdd的延迟执行是怎么发生的和如何完成的,还要就是RDD的compute都是在executor的哪个阶段调用和执行我们定义的函数的.这些都非常的基础和困难.花一段时间终于弄白了其中的奥秘.总结起来,以便以后继续完善.spark的调度分为两级调度:DAGSchedule和TaskSchedule.DAGSchedule是根据job来生成相互依赖的stages,然后把stages以TaskSet形式传递给Task

Spark GraphX宝刀出鞘,图文并茂研习图计算秘笈与熟练的掌握Scala语言【大数据Spark

Spark GraphX宝刀出鞘,图文并茂研习图计算秘笈 大数据的概念与应用,正随着智能手机.平板电脑的快速流行而日渐普及,大数据中图的并行化处理一直是一个非常热门的话题.图计算正在被广泛地应用于社交网络.电子商务,地图等领域.对于图计算的两个核心问题:图存储模式和图计算模型,Spark GraphX给出了近乎完美的答案, 而Spark GraphX作为图计算领域的屠龙宝刀,对Pregel  API的支持更是让Spark GraphX如虎添翼.Spark GraphX可以轻而易举的完成基于度分布

大数据技术之_27_电商平台数据分析项目_02_预备知识 + Scala + Spark Core + Spark SQL + Spark Streaming + Java 对象池

第0章 预备知识0.1 Scala0.1.1 Scala 操作符0.1.2 拉链操作0.2 Spark Core0.2.1 Spark RDD 持久化0.2.2 Spark 共享变量0.3 Spark SQL0.3.1 RDD.DataFrame 与 DataSet0.3.2 DataSet 与 RDD 互操作0.3.3 RDD.DataFrame 与 DataSet 之间的转换0.3.4 用户自定义聚合函数(UDAF)0.3.5 开窗函数0.4 Spark Streaming0.4.1 Dst

Spark 以及 spark streaming 核心原理及实践

导语 spark 已经成为广告.报表以及推荐系统等大数据计算场景中首选系统,因效率高,易用以及通用性越来越得到大家的青睐,我自己最近半年在接触spark以及spark streaming之后,对spark技术的使用有一些自己的经验积累以及心得体会,在此分享给大家. 本文依次从spark生态,原理,基本概念,spark streaming原理及实践,还有spark调优以及环境搭建等方面进行介绍,希望对大家有所帮助. spark 生态及运行原理 Spark 特点 运行速度快 => Spark拥有DA

【转载】Spark学习——spark中的几个概念的理解及参数配置

首先是一张Spark的部署图: 节点类型有: 1. master 节点: 常驻master进程,负责管理全部worker节点.2. worker 节点: 常驻worker进程,负责管理executor 并与master节点通信.dirvier:官方解释为: The process running the main() function of the application and creating the SparkContext.即理解为用户自己编写的应用程序 一.Application ap

【转】科普Spark,Spark是什么,如何使用Spark

本博文是转自如下链接,为了方便自己查阅学习和他人交流.感谢原博主的提供! http://www.aboutyun.com/thread-6849-1-1.html http://www.aboutyun.com/thread-6850-1-1.html 科普Spark,Spark核心是什么,如何使用Spark(1) 阅读本文章可以带着下面问题: 1.Spark基于什么算法的分布式计算(很简单) 2.Spark与MapReduce不同在什么地方 3.Spark为什么比Hadoop灵活 4.Spar

精通Spark:Spark内核剖析、源码解读、性能优化和商业案例实战

这是世界上第一个Spark内核高端课程: 1, 该课程在对Spark的13个不同版本源码彻底研究基础之上提炼而成: 2, 课程涵盖Spark所有内核精髓的剖析: 3, 课程中有大量的核心源码解读: 4, 全景展示Spark商业案例下规划.部署.开发.管理技术: 5, 涵盖Spark核心优化技巧 该课程是Spark的高端课程,其前置课程是“18小时内掌握Spark:把云计算大数据速度提高100倍以上!”. 培训对象 1,  系统架构师.系统分析师.高级程序员.资深开发人员: 2, 牵涉到大数据处理