Spark架构以及工作原理

Spark发布了多个基于RDD功能编写的应用库

在这里插入图片描述

  • Spark Core:

包含Spark的基本功能,包含任务调度,内存管理,容错机制等,内部定义了RDDs(弹性分布式数据集),提供了很多APIs来创建和操作这些RDDs。为其他组件提供底层的服务。

  • Spark SQL:

Spark处理结构化数据的库,就像Hive SQL,Mysql一样,企业中用来做报表统计。

  • Spark Streaming:

实时数据流处理组件,类似Storm。Spark Streaming提供了API来操作实时流数据。企业中用来从Kafka接收数据做实时统计。

  • MLIib:

一个包含通用机器学习功能的包,Machine learning lib包含分类,聚类,回归等,还包括模型评估和数据导入。MLlib提供的上面这些方法,都支持集群上的横向扩展。

  • Graphx:

处理图的库(例如,社交网络图),并进行图的并行计算。像Spark Streaming,Spark SQL一样,它也继承了RDD API。它提供了各种图的操作,和常用的图算法,例如PangeRank算法。

Spark架构及工作流程

在这里插入图片描述

  • Driver Program:

Spark中的Driver即运行上述Application的main函数并创建SparkContext,创建SparkContext的目的是为了准备Spark应用程序的运行环境,在Spark中有SparkContext负责与ClusterManager通信,进行资源申请、任务的分配和监控等,当Executor部分运行完毕后,Driver同时负责将SparkContext关闭。

  • Executor:

是运行在工作节点(WorkerNode)的一个进程,负责运行Task。

在这里插入图片描述

完成下面三个工作

  1. 为每个Job(一个Action类型的操作如collect,count)分割Stage,同时决定最佳路径。DAG Scheduler会记录哪个RDD或者Stage会被物化,从而寻找一个最佳调度方案。
  2. 将TaskSet提交给Task Tracker
  3. 重新提交输出lost的Stage任务

在这里插入图片描述

DAGScheduler优化

  1. stage的操作是pipleline的
  2. 基于Partition选择最小化的join算法,减少Shuffle操作
  3. 重用RDD Cache过的数据

Stage

在这里插入图片描述

  • Stage:AB位于同一个Stage,CDE位于同一个Stage。AB和CDE的结果做join是产生了一个新的Stage

如下两个夹断一定会产生Stage
1.从数据源加载数据形成RDD时,一定会有Stage的产生
2.进行Shuffle,即有宽依赖的时候一定有Stage的产生,所以上马的DE应该产生一个Stage

那么什么是宽窄依赖呢

在这里插入图片描述

  • 宽依赖:宽依赖对应shuffle,要将同一个父RDD的分区传入到不同的子RDD分区中
  • 窄依赖:窄依赖的每个父RDD的分区只会传入到一个子RDD分区中,通常可以在一个节点内完成转换。

接下来是代码测试
来个简单的单词计数wordcount
在这里插入图片描述

object T01 {
  def main(args: Array[String]): Unit = {
    //1.sc
    var conf=new SparkConf()
    conf.setMaster("local[*]").setAppName("spark")
    var sc =new SparkContext(conf)
    
    //2.sc.textFile->RDD
    var path="src/data/data.txt"
    var rawdata_rdd=sc.textFile(path, 2)
    var words_rdd=rawdata_rdd.flatMap(_.split("\\W+")).map ( x => (x,1) ).reduceByKey(_+_).map(_.swap).sortByKey(false)
    println(words_rdd.count)
    words_rdd.foreach{line=>       //(word,10)
      println("word="+line._1+",sum="+line._2)
    }
    print(rawdata_rdd.foreach(println))
    
    
    
    //RDD.map.word->(w,1)
    //RDD.reduce->w->sum 1
    print("end...")
  }
}
···

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值