Spark学习(1)——概述

Spark特点:

    高效(比MapReduce快10~100倍)

        内存计算引擎,提供Cache机制来支持需要反复迭代计算或者多次数据共享,减少数据读取的IO开销

        DAG引擎,减少多次计算之间中间结果写到HDFS的开销

        使用多线程池模型来减少task启动开销,shuffle过程中避免不必要的sort操作以及减少磁盘IO操作

    易用

        提供了丰富的API,支持Java,Scala,Python和R种语言

        代码量比MapReduce少2~5倍

    与Hadoop集成

        读写HDFS/Hbase

        与YARN集成

        DAG是有向无环图(Directed Acyclic Graph)的简称。在大数据处理中,DAG计算常常指的是将计算任务在内部分解成为若干个子任务,将这些子任务之间的逻辑关系或顺序构建成DAG(有向无环图)结构。

DAG计算的三层结构:
        最上层是应用表达层,即是通过一定手段将计算任务分解成由若干子任务形成的DAG结构,其核心是表达的便捷性,主要是方便应用开发者快速描述或构建应用。

        中间层是DAG执行引擎层,主要目的是将上层以特殊方式表达的DAG计算任务通过转换和映射,将其部署到下层的物理机集群中运行,这层是DAG计算的核心部件,计算任务的调度,底层硬件的容错,数据与管理信息的传递,整个系统的管理与正常运转等都需要由这层来完成。

        最下层是物理机集群,即由大量物理机器搭建的分布式计算环境,这是计算任务最终执行的场所。

        Shuffle过程是MapReduce的核心,也被称为奇迹发生的地方。要想理解MapReduce, Shuffle是必须要了解的。 Shuffle的正常意思是洗牌或弄乱,可能大家更熟悉的是Java API里的Collections.shuffle(List)方法,它会随机地打乱参数list里的元素顺序。如果你不知道MapReduce里Shuffle是什么,那么请看这张图: 


        Shuffle描述着数据从map task输出到reduce task输入的这段过程。 在Hadoop这样的集群环境中,大部分map task与reduce task的执行是在不同的节点上。当然很多情况下Reduce执行时需要跨节点去拉取其它节点上的map task结果。如果集群正在运行的job有很多,那么task的正常执行对集群内部的网络资源消耗会很严重。这种网络消耗是正常的,我们不能限制,能做的就是最大化地减少不必要的消耗。还有在节点内,相比于内存,磁盘IO对job完成时间的影响也是可观的。从最基本的要求来说,我们对Shuffle过程的期望可以有: 

  • 完整地从map task端拉取数据到reduce 端。
  • 在跨节点拉取数据时,尽可能地减少对带宽的不必要消耗。
  • 减少磁盘IO对task执行的影响。

参考https://blog.csdn.net/cnhk1225/article/details/50859216


Spark核心概念-RDD

    RDD:Resilient Distributed Datasets,弹性分布式数据集

        分布在集群中的只读对象集合(由多个Partition构成)

        可以存储在磁盘或内存中(多种存储级别)

        通过并行“转换”操作构造

        失效后自动重构

RDD基本操作(operator)

    Transformation

        可通过Scala集合或者Hadoop数据集构造一个新的RDD

        通过已有的RDD产生新的RDD

        举例:map、filter、groupBy、reduceBy

    Action

        通过RDD计算得到一个或者一组值

        举例:count、reduce、saveAsTextFile

Spark RDD cache/persist

    Spark RDD Cache

        允许将RDD缓存到内存中或磁盘上,以便于重用

        Spark提供了多种缓存级别,以便于用户根据实际需求进行调整

        Spark学习(1)——概述_第1张图片

    RDD cache使用

        var data = sc.textFile("hdfs://nn:8020/input")

        data.cache()    //实际上是data.persist(StorageLevel.MEMORY_ONLY)

        //data.persist(StorageLevel.DISK_ONLY_2)

 RDD Transformation 与 Action

    接口定义方式不同

        Transformation:RDD[X] -> RDD[Y]

        Action:RDD[X] ->Z(Z不是一个RDD,可能是基本类型、数组等)

    惰性执行(Lazy Execution)

        Transformation只会记录RDD转化关系,并不会触发计算

        Action是触发程序执行(分布式)的算子   

Spark运行模式

    local(本地模式)

        单机运行,通常用于测试

        什么是本地模式:将Spark应用以多线程方式,直接运行在本地,便于调试。

        本地模式分类:

            local:只启动一个executor

            local[K]:启动K个executor

            local[*]:启动跟cpu数目相同的executor

    standalone(独立模式)

        独立运行在一个集群中

        Spark学习(1)——概述_第2张图片

    YARN/mesos

        运行在资源管理系统上,比如YARN或mesos

        Spark On YARN存在两种模式

            yarn-client:

            Spark学习(1)——概述_第3张图片

            yarn-cluster:

            Spark学习(1)——概述_第4张图片

讨论问题:

       1.Spark在任何情况下均比MapReduce高效吗?

        答:并不是,当只有Map和Reduce两个阶段时,Spark和MapReduce计算效率一样,在2.0版本之前,Spark与MapReduce相比是低效的,现在由于shuffle实现的改善,Sparkd的计算效率大于等于MapReduce。

        2.Spark号称“内存计算框架”,它将所有数据写到内存吗?

        答:并不是,默认情况下,与MapReduce一样,将数据写到磁盘。但是可以控制写内存。写内存提高了计算效率,另外Spark有DAG计算引擎,这也是比MapReduce高效的原因,而且采用线程的模型,也是高效的原因。

        3.当前存在很多DAG引擎,包括Spark、Tez、Flink,为何大家都在讨论Spark?

        答:Spark社区做的好。

你可能感兴趣的:(我的学习历程,BigData大数据学习与实战)