Spark基础笔记

简介

Spark是由美国加州大学伯克利分校的AMP实验室于2009年开发的,是基于内存计算的并行计算框架,可用于构建大型的、低延迟的数据分析应用程序。
spark的主要特点:

  • 运行速度快
    Spark使用先进的DAG(有向无环图)执行引擎,用来支持循环数据流与内存计算,基于内存的执行速度比hadoop mapReduce快上百倍,基于磁盘的执行速度也能快上十倍。
  • 容易使用
    支持java、python、Scala和R语言进行编程,编程相对简洁
  • 通用性
    提供了完整而强大的技术栈,包括SQL查询、流式计算、机器学习和图算法组件,这些组件可以无缝整合在一个应用中,可以应对复杂的运算。同时支持批处理、交互式查询和流数据处理。
  • 运行模式多样
    可运行于独立的集群中或者hadoop中。

    Spark与Hadoop的对比

  • Hadoop的主要缺点
    hadoop的主要两个组成部分,一部分是h d f s分布式存储,另一个方面是Ma pReduce计算模型。
    1. 表达能力有限。计算都必须转化为Map和Reduce两个操作。这不是适合所有的情况。
    2. 磁盘的IO开销比较大。每次执行都需要从磁盘读取数据,并且在计算完成后需要将结果写入到磁盘中,IO开销过大。
    3. 延迟高。一次计算可能需要分解成一系列按顺序执行的MapReduce任务,任务之间的衔接由于涉及到IO开销。会产生较高的延迟。在前一个结束之前,其他任务无法开始。
  • Spark的主要优点
    在借鉴了mapReduce的优点基础上,还有以下优点:
    1. Spark的计算模式也属于Hadoop MapReduce,但是并不局限于Ma p和Reduce,还提供了多种数据集的类型,编程模型比mapReduce更灵活。
    2. 提供了内存计算,中间结果放在内存中,带来了更高的迭代运算效率,但是同时也对计算机的硬件要求更高。
    3. 基于DAG的任务调度机制,要比MapReduce的迭代执行机制更优越。

但是Spark并不能完全替代hadoop,spark只是优化了mapReduce的计算模型,hadoop的分布式文件系统的优越性还是不能忽视的。Spark专注于BDAS架构中数据的处理与分析,数据存储还是主要依靠h d f s。

Spark生态系统的主要组件

这里我们先知道有这些东西的存在就好了,等具体使用的时候,我们在具体的学习。

  • Spark Core
    主要面向批数据处理,是spark的基本功能,主要包括内存计算、任务调度、部署模式、故障恢复、存储管理等。
  • Spark SQL
    能够统一处理关系表和RDD,使得开发人员不需要自己编写Spark应用程序,轻松使用SQL命令进行查询。
  • Spark Streaming
    支持高吞吐量、可容错性的实时流数据处理,核心思路是将流数据分解成一系列的短小的批处理作业。每个短小的批处理作业都可以使用spark core进行快速处理。支持TCP套接字等。
  • MLlib( 机器学习)
    提供了常用的机器学习算法的实现,包括聚类、分类、回归、协同过滤等。降低了机器学习的门槛,开发人员只要具备一定的伦理只是就能进行机器学习的工作。
  • GraphX
    是基于图计算的API,能在海量数据上自如的运行复杂的图算法。

    Spark 的运行架构

    在这里插入图片描述

在这里插入图片描述
一个应用由一个任务控制节点(Driver) 和 若干作业(Jo b)构成,一个作业由多个阶段(Stage)构成,一个阶段由多个(Tas k)组成。当执行任务的时候一个任务控制节点会向集群管理器(Clu ster Manager)申请资源。启动Executor,并向Exe cutor发送应用程序代码和文件,然后在Executor上执行任务,运行结束之后执行结果会返回给任务控制节点,或者写入HDFS中或者数据库中。
具体的过程,我们后期会做一个实验,在实验中感受一下执行过程。

使用Executor执行任务的优势

  1. 利用多线程来执行具体的任务,减少了任务启动的开销。
  2. Executor中有一个BlockManager存储模块,会将内存和磁盘共同作为存储设备,当进行迭代计算的时候,中间结果可以暂时的存储在这些模块中,减少了IO开销。

RDD弹性分布式数据集

出现背景

在实际应用中,有很多的迭代算和交互式数据挖掘工具,不同阶段之间会重用中间结果。目前的mapReduce框架都是把中间结果写入到HDFS中,带来了大量的数据复制、磁盘IO和序列化开销。

RDD概念

就是一个分布式分区对象集合,本质上只是一个只读的分区记录集合。每个RDD可以分成多个分区,每个分区就是一个数据集片段,并且一个RDD的不同分区可以被保存到集群中不同的节点上,从而可以在集群中的不同节点上进行并行计算。RDD的只读不能直接修改的特点(要想修改只能基于稳定的物理存储中的数据集)决定了RDD适合执行批处理,不适合细粒度的、异步的应用。比如web系统、增量式的网络爬虫等。

RDD 实现高效计算的原因

(1)高效的容错性
在RDD的设计中,数据只读,不可修改。如果需要修改数据,必须从父RDD 转换到子RDD,由此在不同的RDD之间建立了血缘关系。检查容错可以直接通过父节点进行重新计算,而不需要回滚整个系统或者通过数据冗余的方式。
(2)中间结果持久化到内存 。数据在内存中的多个RDD操作之间进行传递,不需要落地到磁盘,避免了不必要的读写磁盘开销。
(3)存放的数据可以是JAVA对象,避免了不必要的对象的序列化和反序列化开销。

RDD之间的依赖关系

  1. 窄依赖
  2. 宽依赖

RDD中阶段的划分

上面我们说了数据的执行是基于数据的阶段进行执行的,那么数据的阶段是怎么样划分的呢?
在这里插入图片描述
具体划分方法:
在DAG中进行反向解析,遇到宽依赖就断开,遇到窄依赖就把当前的RDD加入到当前的阶段中,将窄依赖尽量划分在同一个阶段中,可以实现流水线计算。
如上图所示:HDFS中读入数据,生成3个不同的RDD(A,C,E),通过一系列的转化操作后,再将数据存储到HDFS中。对DAG进行解析的时候,RDD A到RDDB 以及从RDD B以及RDD F到RDD G的转化都是宽依赖的,因此需要在此断开,会生成3个阶段。在阶段2中 map和union 操作都是窄依赖,这两个操作可以形成一个流水线操作。
(先入个门吧)
学习链接
Spark API