一、job、stage、Task之间的关系是什么?

  • 一个job可以包含多个stage
  • 一个stage包含多个task

二、job、stage、Task之间的关系是什么?

  • 每提交一个任务,就会创建一个job,即调用action算子的时候会创建job【当调用算子之后返回值不是RDD类型的就可以归为Action算子】
  • 根据宽依赖和窄依赖划分stage,如果是宽依赖,就新增一个stage
  • Task数量实际上就是分区的数量

三、什么是宽依赖、窄依赖?

  • 如果一个父RDD分区被多个子RDD的分区使用,就是宽依赖【超生】如果一个父RDD分区被多个子RDD的分区使用,就是宽依赖【超生】
  • 如果一个父RDD分区只被一个子RDD分区使用,就是窄依赖【独生】如果一个父RDD分区只被一个子RDD分区使用,就是窄依赖【独生】
  • abstract class Dependencyabstract class Dependency
  • abstract class NarrowDependency extend Dependency 有一个抽象方法,getParents()
  • class OneToOneDependency extend NarrowDependency 实现抽象方法getParents()
  • class RangeDependency extend NarrowDependency 实现抽象方法getParents()class RangeDependency extend NarrowDependency 实现抽象方法getParents()
  • class ShuffleDependency extend Dependencyclass ShuffleDependency extend Dependency

四、Action算子和Transformation算子是什么,列举一些?

  • Action算子会创建job,会立即执行。 例如:take ,first,collect,foreach,foreachPartition。
  • Transformation不会立即执行,但是里边会记录一些依赖关系,还有函数。 例如:map,filter,flatMap,reduceByKey,groupByKey等等。

五、reduceByKey和groupByKey有什么区别?

reduceByKey:reduceByKey 会在结果发送至reducer 之前会对每个mapper 在本
地进行merge,有点类似于在MapReduce 中的combiner。这样做的好处在于,
在map 端进行一次reduce 之后,数据量会大幅度减小,从而减小传输,保证reduce
端能够更快的进行结果计算。

groupByKey:groupByKey 会对每一个RDD 中的value 值进行聚合形成一个序列
(Iterator),此操作发生在reduce 端,所以势必会将所有的数据通过网络进行传输,
造成不必要的浪费。同时如果数据量十分大,可能还会造成OutOfMemoryError。

结论:

所以在进行大量数据的reduce 操作时候建议使用reduceByKey。不仅可以提高速
度,还可以防止使用groupByKey 造成的内存溢出问题。

六、RDD五大属性

spark job超时退出 spark job stage task_Dependency

七、Spark的架构与作业提交流程

spark job超时退出 spark job stage task_抽象方法_02