Spark-RDD宽窄依赖、pipeline计算模式、Stage

一、RDD宽窄依赖

以WordCount为例:

窄依赖:

  • 父RDD与子RDD partition之间的关系是一对一(父partition的数据只到一个子partition),比如:rdd1->rdd2->rdd3。
  • 父RDD与子RDD partition之间的关系是多对一。

宽依赖:

  • 父RDD与子RDD partition之间的关系是一对多(父partition的数据只到多个子partition),比如:rdd3->rdd4。

二、 pipeline计算模式和Stage

以WordCount为例:假如HDFS中的node1、node2各有1G数据

pipeline计算模式(不会占用太大内存):

  • 从node1和node2中各获取1条数据生成rdd1(2个partition,默认partition的个数由node的个数决定)。
  • rdd1->rdd2->rdd3在内存中进行处理,也就是通常所说的Spark是基于内存的。MR是rdd1->rdd2、rdd2->rdd3、rdd3->rdd4都需要写入磁盘。
  • rdd3->rdd4调用的reduceByKey方法会shuffle:先写入磁盘->生成rdd4。
  • rdd中不存数据、partition中也不存数据。partition中存储的是逻辑代码。所以当执行Action算子的时候才会从HDFS中读取数据。
SparkConf sparkConf = new SparkConf();
sparkConf.setMaster("local");
sparkConf.setAppName("Test");
JavaSparkContext sparkContext = new JavaSparkContext(sparkConf);
JavaRDD<String> rdd = sparkContext.parallelize(Arrays.asList("zhangsan","lisi","wangwu"));
JavaRDD<String> rdd2 = rdd.map(new Function<String, String>() {
    private static final long serialVersionUID = 1L;
    public String call(String arg0) throws Exception {
	System.out.println(arg0+"~");
	return arg0+"~";
    }
});
JavaRDD<String> rdd3 = rdd2.map(new Function<String, String>() {
    private static final long serialVersionUID = 1L;
    public String call(String arg0) throws Exception {
	System.out.println(arg0+"#");
	return arg0+"#";
    }
});
rdd3.count();

#打印如下:说明数据是一条一条的取出来执行的
zhangsan~
zhangsan~#
lisi~
lisi~#
wangwu~
wangwu~#

 

stage:

           

  • Spark任务会根据RDD之间的依赖关系,形成一个DAG有向无环图,DAG会提交给DAGScheduler,DAGScheduler会把DAG划分相互依赖的多个stage,划分stage的依据就是RDD之间的宽窄依赖。遇到宽依赖就划分stage,每个stage包含一个或多个task任务。然后将这些task以taskSet的形式提交给TaskScheduler运行。 stage是由一组并行的task组成,如WordCount中s有2个stage。下图有3个stage。
  • stage中的并行度由finalRDD的partition个数来决定:如stage0中的并行度是2:task1、task2。上图中Stage2中的并行度是4。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值