大数据组件知识点总结(3) - Spark

2018-08-22  本文已影响37人  千反田爱瑠爱好者

Spark

使用DAG计算引擎、RDD模型,基于内存执行分布式计算,适合做迭代式计算和交互式计算。

主要特点

性能高效

简单易用

与Hadoop集成

YARN、HDFS、HBase

编程模型

RDD

弹性(内存、磁盘、混合)分布式(Partition)数据集,只读(确保数据一致性),可并行执行转换运算,支持失败后基于血统关系重构。

读写内存和磁盘比HDFS的分布式写快很多。

RDD组成:

操作:

共享变量:

基本框架

一个Driver进程和多个Executor进程构成:

运行模式

作业生命周期

内核架构

作业提交、运行

组织关系

    Mac 1:Submit
        spark-submit Jar
        Driver(进程)
            SparkContext
                DAGScheduler
                TaskScheduler
                
    Mac 2:Master
        
    Mac 3:Worker
        Executor(进程)
            ThreadPool
            TaskRunner

处理流程

        Application Jar     // 编写Spark应用程序
            |
        spark-submit        // 提交作业
            |
        Driver              // 执行应用程序(初始化SparkContext(SparkConf))
            |
        DAGScheduler、TaskScheduler(通过后台进程连接Master、注册Application)
            |
        Master              // 接收Application请求,通过资源调度算法,在Worker上为Application启动多个Executor
            |
        Executor            // 启动后反向注册到TaskScheduler
            |
        DAGScheduler        // 初始化结束,开始执行代码,每执行一个Action就创建一个Job,提交给DAGScheduler,划分Stage(Stage划分算法)
            |
        TaskScheduler       // Stage创建一个TaskSet,提交给TaskScheduler
            |
        Executor            // Task提交到Executor执行(Task分配算法)
                            // TaskRunner封装Task,线程池中取出一个线程来执行(从代码拷贝、反序列化执行)
            |
        (Stage不断分批次创建Task、提交到Executor执行,每个Task对应RDD一个Partition。)
        
        
    Task:包括ShuffleMapTask和ResultTask(最后一个)

宽依赖、窄依赖

窄依赖(Narrow Dependency)

    lines RDD:
        partition_1 = "hello world"
        partition_2 = "hello me"
        partition_3 = "hello you"
        
    => val words = lines.flatMap(line => line.split(" "))
    
    words RDD:
        partition_1 = ["hello", "you"]      // 只依赖于父RDD的partition_1
        partition_2 = ["hello", "me"]
        partition_3 = ["hello", "world"]
    
    => val pairs = lines.map(word => (word, 1))
    
    pairs RDD:
        partition_1 = [("hello", 1), ("you", 1)]
        partition_2 = [("hello", 1), ("me", 1)]
        partition_3 = [("hello", 1), ("world", 1)]

宽依赖(Shuffle Dependency)

    pairs RDD:
        partition_1 = [("hello", 1), ("you", 1)]
        partition_2 = [("hello", 1), ("me", 1)]
        partition_3 = [("hello", 1), ("world", 1)]
    
    => val wordCounts = pairs.reduceByKey(_ + _)
    
    wordCounts RDD:
        partition_1 = ("hello", 3)      // 依赖于父RDD的partition_1、partition_2、partition_3
        partition_2 = ("me", 5)
        partition_3 = ("world", 10)

SparkContext

    SparkContext
        createTaskScheduler() -> 
        
            // TaskScheduler,创建SchedulePool
            TaskSchedulerImpl
                // 调用init创建SchedulePool
                // 调用start
                
            // 负责接收TaskSchedulerImpl的控制,负责与Master的注册、Executor的反注册、Task发送到Executor等操作
            SparkDeploySchedulerBackend     
            
             // 由TaskScheduler创建有不同的优先策略,如FIFO
            SchedulePool                   
上一篇 下一篇

猜你喜欢

热点阅读