什么是Apache Spark

    Apache Spark是一个开源集群运算框架,最初由加州大学柏克莱分校AMPLab开发。

    • 开源
    • 高性能,基于内存进行数据处理的
    • 易用,支持R、Scala、Java等
    • 通用,支持批处理、流处理、机器学习等多种场景

    Apache Spark生态

    Apache Spark 入门 - 图1

    上层模块,根据场景来设计:

    • Spark SQL + DataFrames 处理结构化数据的
    • Streaming 支持流式场景的模块
    • MLlib 机器学习模块
    • GraphX 图计算模块

    底层模块,Spark Core API,所有的场景模块都是基于这一核心进行设计的,也是Spark最原始的模块,多语言支持便由它来提供。

    Apache Spark架构

    Apache Spark 入门 - 图2

    在Spark中,比较核心的有三块

    • Driver
      • 运行作业主函数
      • 创建SparkContext(SparkContext的作用是:帮助程序使用spark提供的一些功能)
    • Cluster Manager(目前为止支持以下四种,主要的作用有两个:分配资源、把Driver要执行的任务分配到对应的Executor)
      • Standalone
      • Mesos
      • K8S
      • Yarn
    • Executor(执行任务的实际进程)
      • 执行task
      • 处理rdd一个分区的数据

    整个执行流程:
    写好程序 -> 在Driver端跑起来了 -> 通过Cluster Manager申请到了资源 -> 将任务调度到了Executor上

    其他基本概念

    • Spark Application
      • 用户写的Spark应用程序
    • Job
      • 一个application会生成多个job
      • Job直接可以有依赖关系
      • 可以并行执行
    • Stage
      • 一个job会有多个Stage
      • Stage之间可以有依赖关系
      • 可以并行执行
    • Task

      • 任务执行的最小单元


      Apache Spark 入门 - 图3

      SparkContext & SparkSession

    • SparkContext是Spark2.0以前应用运行入口

      • 一个进程只能有一个
    • SparkSession是Spark2.0之后的应用运行入口
      • 支持SparkContext的特性
      • 支持操作dataframes

    Apache Spark 入门 - 图4

    Spark API的历史

    Apache Spark 入门 - 图5

    RDD

    RDD是Spark最核心概念,基础数据结构,全称:弹性分布式数据集(Resilient Distributed Datasets)

    其特点是:

    • 基于内存
    • 延时计算
    • 容错
    • 只读
    • 只分区(实现分布式计算)


      Apache Spark 入门 - 图6

    创建RDD的两种方式

    1. 在driver中对已有集合进行并行化
    2. 基于外部数据源生成

    Apache Spark 入门 - 图7

    Apache Spark 入门 - 图8

    Apache Spark 入门 - 图9
    RDD :Operations

    • RDD操作类型1:Transformations 基于已有的RDD生成新的RDD
    • RDD操作类型2:Actions 触发生成job开始运算

    Apache Spark 入门 - 图10


    Apache Spark 入门 - 图11

    Local Cluster

    Spark UI :http://localhost:4040
    Apache Spark 入门 - 图12

    Spark SQL(DataFrames)

    Spark SQL

    Spark SQL是一个用来处理结构化数据的Spark组件。它提供了一个叫做DataFrames的可编程抽象数据模型,并可以视为一个分布式的SQL查询引擎

    Apache Spark 入门 - 图13

    DataFrames

    DataFrame是类似于关系表的分布式数据集。其特点是:

    • 分布式
    • 只读
    • SQL查询
    • Schema
    • Catalyst优化


      Apache Spark 入门 - 图14

      DataSet

    DataSet 是结合DataFrame和RDD优势的分布式数据集

    • Scale & Java(目前只支持这两种语言)
    • 类型安全(RDD)
    • 关系型模型(DF)
    • 查询优化(DF)


      Apache Spark 入门 - 图15
      例子
      Apache Spark 入门 - 图16

      进阶指南**

    Structured Streaming(SS)

    SS是构建于Spark SQL的流处理引擎。特性是:

    • 可扩展
    • 容错
    • 无限增长的表格(把数据流视为无限增长的表格)
    • SQL
    • DataFrame


      Apache Spark 入门 - 图17
      例子
      ./bin/run-example org.apache.spark.examples.sql.streaming.StructuredNetworkWordCount localhost 9999

      Apache Spark 入门 - 图18
      ML Pipeline

    ML pipelines 是基于DataFrame抽象的,用于构建机器学习工作流的API

    • DataFrame:表示数据集
    • Transformer:DataFrame转换的算法
    • Estimatior:作用于DataFrame生成Transformer
    • Pipeline:ML工作流
    • Parameter:指定Transformer和Estimator的参数


      Apache Spark 入门 - 图19

      阿里云EMR

      https://help.aliyun.com/product/28066.html?spm=a2c4g.11186623.6.540.673b79e27ut1hR
      Apache Spark 入门 - 图20
      问题答疑
      同样的数据处理,Spark相对Hive消耗的内存比值大概是多少?
      spark发展到现在版本,内存使用做了非常多的优化。所以,其实总体还好。建议能上spark就上spark。hive毕竟慢。综合下来,spark成本肯定要低的。
      现在spark3,0版本的话,shuffle用的是sorted shuffle吗?
      默认还是sort based
      如果立马处理几亿条数据。大约能好久出结果。还是在流中慢慢处理结果感觉快?
      看逻辑和资源量了。如果是离线数据,走batch模式就好了。
      在sparksql里面,对计算的分区是不是更多交给spark内部去优化?在学习rdd算子,还要自己设置分区的数量。感觉shuffle这块,分区和reduce个数一直没搞懂什么关系?
      3.0有了ae(自适应执行)框架,会更自动化一些