关闭

spark运行模式一些概念

标签: spark
274人阅读 评论(0) 收藏 举报
分类:

spark的运行模式多种多样,在单机上既可以以本地模式运行,也可以以伪分布式模式运行,而当以分布式的方式运行在cluster集群中时,底层的资源调度可以使用mesos或者yarn,也可以使用spark自带的standalone模式。
在具体介绍每一种模式之前,首先对一些基本的概念和模型做个介绍
1、application:application的概念和hadoop mapreduce中的类似,都是指的用户编写的spark应用程序,其中包含了一个driver功能的代码和分布在集群中多个节点上运行的executor代码
2、driver:使用driver这一概念的分布式框架很多,比如hive等,spark中的driver即运行上述application的main()函数并且创建sparkcontext,创建sparkcontext的目的是为了准备spark应用程序的运行环境,在spark中由sparkcontext负责和clustermanager通信,进行资源的申请、任务的分配和监控等,当executor部分运行完毕后,driver同时负责将sparkcontext关闭,通常用sparkcontext代表driver。
3、executor:某个application运行在worker节点上的进程,该进程负责运行某些task,并且负责将数据存在内存或者磁盘上,每个application都有各自独立的一批executor,在spark on yarn模式下,其进行名称为coarseGrainedExecutorBackend.类似于hadoop mapreduce 中的yarnchlid,一个coarseGrainedExecutorBackend进程有且仅有一个executor对象,它负责将task包装成taskRunner,并从线程池中抽取出一个空闲线程运行task,每个coarseGrainedExecutorBackend能并行运行task的数量就取决于分配给它的cpu的个数了
4、cluster manager:指的是在集群上获取资源的外部服务,目前有:
4、1standalone:spark原生的资源管理,由master负责资源的分配,可以在亚马逊的EC2上运行
4、2apache mesos:与hadoop mapreduce兼容性良好的一种资源调度框架
4、3hadoop yarn:主要是指的yarn的resourceManager
5、worker:集群中任何可以 运行application代码的节点,类似于yarn中的nodemanger节点。在standalone模式中指的就是通过slave文件配置的worker节点,在spark on yarn模式中指的就是nodeManager节点
6、task:被送到某个executor上的工作单元,和hadoop mapreduce中的maptask和reducetask概念一样,是运行application的基本单位,多个task组成一个taskset,而task的调度及管理等由厦门的taskscheduler负责
7、job:包含多个task组成的并行计算,往往由spark action触发产生,一个application中可能会产生多个job
8、stage:每个job会被拆分很多组task,作为一个taskset,其名称为stage,stage的划分和调度由下面的DAGScheduler负责,stage有非最终的stage即shuffle map stage和最终的stage即result stage两种,stage的边界就是发生shuffle的地方
9、RDD:spark的基本计算单元,可以通过一系列算子进行操作(主要有transformation和action操作)。同时RDD是spark最核心的东西,它表示以被分区、被序列化的、不可变得、有容错机制的并且能够被并行操作的数据集合。其存储级别可以是内存,也可以是磁盘,可通过spark.storage.StorageLevel属性配置
10、共享变量:在spark application运行时,可能需要共享一些变量,提供task或driver等使用,spark提供了两种共享变量,一种是可以缓存到各个节点的广播变量,一种是只支持加法操作、可以实现求和的累加变量
11、宽依赖:或称为shuffleDependency,跟hadoop mapreduce中的shuffle的数据依赖相同,宽依赖需要计算好所有父RDD对应分区的数据,任何在节点之间进行shuffle
12、窄依赖:或称为NarrowDependency,指的是某个具体的RDD其分区partition a最多被子RDD中的一个分区partition b依赖,此种情况只有map任务,是不需要发生shuffle过程的,窄依赖又分为1:1和N:1两种
13、DAGScheduler:根据job构建基于stage的DAG,并提交stage给TaskScheduler。其划分stage的依据是根据RDD之间的依赖关系
14、TaskScheduler:将Taskset提交给worker(集群)运行,每个executor运行什么task就是在此处分配的

public final class JavaWordCount {
  private static final Pattern SPACE = Pattern.compile(" ");

  public static void main(String[] args) throws Exception {

    if (args.length < 1) {
      System.err.println("Usage: JavaWordCount <file>");
      System.exit(1);
    }

    SparkConf sparkConf = new SparkConf().setAppName("JavaWordCount"); //运行在driver
    JavaSparkContext ctx = new JavaSparkContext(sparkConf);//运行在driver
    JavaRDD<String> lines = ctx.textFile(args[0], 1);

    JavaRDD<String> words = lines.flatMap(new FlatMapFunction<String, String>() {
      @Override
      public Iterable<String> call(String s) {
        return Arrays.asList(SPACE.split(s));
      }
    });

    JavaPairRDD<String, Integer> ones = words.mapToPair(new PairFunction<String, String, Integer>() {
      @Override
      public Tuple2<String, Integer> call(String s) {
        return new Tuple2<String, Integer>(s, 1);
      }
    });

    JavaPairRDD<String, Integer> counts = ones.reduceByKey(new Function2<Integer, Integer, Integer>() {
      @Override
      public Integer call(Integer i1, Integer i2) {
        return i1 + i2;
      }
    });

    List<Tuple2<String, Integer>> output = counts.collect();
    for (Tuple2<?,?> tuple : output) {
      System.out.println(tuple._1() + ": " + tuple._2());
    }
    ctx.stop();//运行在driver
  }
}

关于driver和executor,下面以spark的example包自带的wordcount例子为例进行说明
其中,注释的,都属于driver,运行在driver端,其他的部分属于executor,运行在每个executorBackend进程中,counts.collect()的collect方法是spark中的action操作,负责job的触发,而reduceByKey属于transformation操作

0
0

查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:89627次
    • 积分:2498
    • 等级:
    • 排名:第15339名
    • 原创:156篇
    • 转载:17篇
    • 译文:0篇
    • 评论:12条
    文章分类
    最新评论