理解Spark之一——stage划分

  我们首先知道Spark的基本执行流程,简化来说,当提交一个Spark程序,HDFS上的每个Block对应一个分区、一个Task任务,这个Task任务就是在跑我们开发是Spark程序,程序中是我们使用的一个个算子。

  在算子中,又可以划分成为两种,一种是宽依赖、一种是窄依赖,它们和stage的关系就是宽依赖是划分stage的边界,窄依赖并不会划分stage。

   那么为什么需要stage这个概念呢?因为在宽依赖的时候需要去shuffle,向磁盘读写数据,这个过程相比较来说很慢,所以在这里划分stage这个概念。

  宽依赖为什么需要shuffle?宽依赖究竟是什么?

  如图所示,在stage1中,map操作中一个子分区对应一个父分区,这种操作在自身的分区内能够完成,无需shuffle,所以它是一个窄依赖。而在后面groubykey操作的时候,每一个子分区依赖多个父分区,也就意味着子分区的结果需要多个父分区的集合,这就涉及到分区数据的合并,就需要shuffle,那么这里就是一个划分stage的边界。

发布了88 篇原创文章 · 获赞 28 · 访问量 3万+

猜你喜欢

转载自blog.csdn.net/qq_35946969/article/details/90476228
今日推荐