目录

  1. 搭建spark开发环境
  2. Spark框架
  3. Spark工作原理
  4. DAG、Stage、宽窄依赖

 

1.  搭建spark开发环境

    首先, 安装好 jdk1.8 的版本,以及安装 eclipse(OXYGNEN.2);

    然后,下载和安装Scala IDE插件,具体步骤如下:

                 第一步,运行软件,点击右上角的IDE选择器,如图:

 

                   

spark 开源 spark开发工具_spark 开源

 

                  第二步,选择Scala IDE,如图:

                   

spark 开源 spark开发工具_spark基本框架_02

 

                   第三步,打开 Scala IDE,创建一个名称为 GXSF_01 的 Scala 工程

                   第四步,把Scala库容器改为2.11.11版本,具体操作为:选中【Scala Library container[2.12.11]】 ,鼠标右击,选中【properties】 , 把【Scala Library container :2.12.11]】改为【Scala Library container :2.11.11 】,如图:

                   

spark 开源 spark开发工具_spark基本框架_03

 

                  第五步,构建配置环境,鼠标单击Scala项目,右击【build path】 ,   , 添加 spark的jars包(放在spark-jars文件里)

                    

spark 开源 spark开发工具_spark 开源_04

 

                      第六步,在GXSF_01的Scala工程里新建一个名为T01_wordcount 的Scala Object 类,实现单词的统计。实例结果如下图:

                      

spark 开源 spark开发工具_spark基本框架_05

代码为:

def main(args: Array[String]): Unit = {
    // 1.sc
    var conf = new SparkConf()
    .setMaster("local[*]").setAppName("")
    var sc = new SparkContext(conf)
    sc.setLogLevel("WARN")
    
    // 2. sc.textFile
    var path = "C:\\Users\\xiaoxiannv\\Desktop\\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("sum="+line._1+",word="+line._2)  
    }
    //print(rawdata_rdd.foreach(println))
    //RDD.map word ->(w,1)
    //RDD.reduce ->w-> sum 1
    print("end .......") 
  }

 

 

2. Spark框架

    Spark 的基本框架有:Spark Core( RDD - API - 集合 )、Spark SQL( jdbc / sql - 离线处理-历史 )、Spark Streaming( 及时处理 - 事务 )、Spark MLlib( 机器学习 )、Spark GraphX(图计算);

 

  • Spark Core:包含Spark的基本功能;尤其是定义RDD的API、操作以及这两者上的动作。其他Spark的库都是构建在RDD和Spark Core之上的
  • Spark SQL:提供通过Apache Hive的SQL变体Hive查询语言(HiveQL)与Spark进行交互的API。每个数据库表被当做一个RDD,Spark SQL查询被转换为Spark操作。
  • Spark Streaming:对实时数据流进行处理和控制。Spark Streaming允许程序能够像普通RDD一样处理实时数据
  • MLlib:一个常用机器学习算法库,算法被实现为对RDD的Spark操作。这个库包含可扩展的学习算法,比如分类、回归等需要对大量数据集进行迭代的操作。
  • GraphX:控制图、并行图操作和计算的一组算法和工具的集合。GraphX扩展了RDD API,包含控制图、创建子图、访问路径上所有顶点的操作

3. Spark工作原理

              

spark 开源 spark开发工具_eclipse 搭建Scala开发环境_06

           编写程序提交到Master上,

           Master是由四大部分组成(RDD Graph,Scheduler,Block Tracker以及Shuffle Tracker)

          启动RDD Graph就是DAG,它会提交给Task Scheduler任务调度器等待调度执行

          具体执行时,Task Scheduler会把任务提交到Worker节点上

           Block Tracker用于记录计算数据在Worker节点上的块信息

           Shuffle Blocker用于记录RDD在计算过程中遇到Shuffle过程时会进行物化,Shuffle Tracker用于记录这些物化的RDD的存放信息

 

4. DAG、Stage、宽窄依赖

       

        Job、stage和task是spark任务执行流程中的三个基本单位。其中job是最大的单位,Job是spark应用的action算子催生的;stage是由job拆分,在单个job内是根据shuffle算子来拆分stage的,单个stage内部可根据操作数据的分区数划分成多个task。

 

stage的划分
        Spark任务会根据RDD之间的依赖关系,形成一个DAG有向无环图,DAG会提交给DAGScheduler,DAGScheduler会把DAG划分相互依赖的多个stage,划分stage的依据就是RDD之间的宽窄依赖。遇到宽依赖就划分stage,每个stage包含一个或多个task任务。然后将这些task以taskSet的形式提交给TaskScheduler运行。

注:stage是由一组并行的task组成

 

窄依赖

父RDD和子RDD partition之间的关系是一对一的。或者父RDD一个partition只对应一个子RDD的partition情况下的父RDD和子RDD partition关系是多对一的。不会有shuffle的产生。父RDD一个分区去到子RDD的一个分区

宽依赖

父RDD与子RDD partition之间的关系是一对多。会有shuffle的产生。父RDD的一个分区的数据去到子RDD的不同分区里面。

其实区分宽窄依赖主要就是看父RDD的一个Partition的流向,要是流向一个的话就是窄依赖,流向多个的话就是宽依赖。看图理解:

Stage概念

Spark任务会根据RDD之间的依赖关系,形成一个DAG有向无环图,DAG会提交给DAGScheduler,DAGScheduler会把DAG划分相互依赖的多个stage,划分stage的依据就是RDD之间的宽窄依赖。遇到宽依赖就划分stage,每个stage包含一个或多个task任务。然后将这些task以taskSet的形式提交给TaskScheduler运行。?????stage是由一组并行的task组成。

stage切割规则

切割规则:从后往前遇到宽依赖就切割stage。

stage计算模式

pipeline管道计算模式,pipeline只是一种计算思想,模式。

 

 

1、Spark的pipeLine的计算模式,相当于执行了一个高阶函数f3(f2(f1(textFile))) !+!+!=3 也就是来一条数据然后计算一条数据,把所有的逻辑走完,然后落地,准确的说一个task处理遗传分区的数据 因为跨过了不同的逻辑的分区。而MapReduce是 1+1=2,2+1=3的模式,也就是计算完落地,然后在计算,然后再落地到磁盘或内存,最后数据是落在计算节点上,按reduce的hash分区落地。所以这也是比Mapreduce快的原因,完全基于内存计算。

2、管道中的数据何时落地:shuffle write的时候,对RDD进行持久化的时候。

3.Stage的task并行度是由stage的最后一个RDD的分区数来决定的 。一般来说,一个partiotion对应一个task,但最后reduce的时候可以手动改变reduce的个数,也就是分区数,即改变了并行度。例如reduceByKey(XXX,3),GroupByKey(4),union由的分区数由前面的相加。

4.、如何提高stage的并行度:reduceBykey(xxx,numpartiotion),join(xxx,numpartiotion)