Chap 0 前言

从历史说起 :

  1. Spark 发源于 美国加州大学伯克利分校 AMPLap 大数据分析平台

  2. Spark 立足于内存计算、从多迭代批量处理出发

  3. Spark 兼顾数据仓库、流处理、图计算 等多种计算范式,大数据系统领域全栈计算平台

Chap 1 Spark简介

本章重点 :

  1. Spark 框架、架构、计算模型、数据管理策略

  2. Spark BDAS 项目及其子项目进行了简要介绍

  3. Spark 生态系统包含的多个子项目 : SparkSql、Spark Streaming、GraphX、MLlib

1-1 Spark 是什么

1.1.1 Spark 的历史与发展

  1. 2009 年 : Spark 诞生于 AMPLab

  2. 2014 年 2 月 : Apache 顶级项目

  3. 2014-05 : Spark 1.0.0 发布

1.1.2 Spark 之于 Hadoop

Spark 是 MapReduce 的替代方案, 且兼容 HDFS、Hive 等分布式存储层。

Spark 相比 Hadoop MapReduce 的优势如下 :

  1. 中间结果输出

  2. 数据格式和内存布局

  3. 执行策略

  4. 任务调度的开销

    (Spark用事件驱动类库AKKA来启动任务, 通过线程池复用线程避免进线程启动切换开销)

1.1.3 Spark 能带来什么?

  1. 打造全栈多计算范式的搞笑数据流水线 (高效)

  2. 轻量级快速处理

  3. 易于使用, Spark 支持多语言

  4. 与 HDFS 等 存储层 兼容

  5. 社区活跃度高

1-2 Spark 生态 BDAS

图片描述
Spark EcoSystem = BDAS = 伯克利数据分析栈

(1) Spark
Spark 是 BDAS 核心, 是一 大数据分布式编程框架。

1-3 Spark 架构

  1. Spark 的代码结构

  2. Spark 的架构

  3. Spark 运行逻辑

(1) Spark 的代码结构

图片描述

scheduler:文件夹中含有负责整体的Spark应用、任务调度的代码。
broadcast:含有Broadcast(广播变量)的实现代码,API中是Java和Python API的实现。

deploy:含有Spark部署与启动运行的代码。
common:不是一个文件夹,而是代表Spark通用的类和逻辑实现,有5000行代码。

metrics:是运行时状态监控逻辑代码,Executor中含有Worker节点负责计算的逻辑代码。
partial:含有近似评估代码。

(2) Spark 的架构

Spark架构采用了分布式计算中的Master-Slave模型。Master是对应集群中的含有Master进程的节点,Slave是集群中含有Worker进程的节点。Master作为整个集群的控制器,负责整个集群的正常运行;Worker相当于是计算节点,接收主节点命令与进行状态汇报;Executor负责任务的执行;Client作为用户的客户端负责提交应用,Driver负责控制一个应用的执行

图片描述

Spark 分别启动 Master进程 和 Worker进程,对整个集群进行控制。在一个 Spark应用 的执行过程中,Driver 和 Worker是两个重要角色。

Driver 程序是应用逻辑执行的起点,负责作业的调度,即Task任务的分发。
Worker用来管理计算节点和创建Executor并行处理任务。

在执行阶段,Driver 会将 Task 和 Task所依赖的file 和 jar 序列化后传递给对应的 Worker机器,同时 Executor对相应数据分区的任务进行处理。

Spark 架构中的基本组件 :

  • ClusterManager : Standalone模式中为 Master, 控制整个集群,监控Worker。

  • Worker : 从节点,负责控制计算节点,启动Executor 或 Driver。在 YARN 模式中为 NodeManager,负责计算节点的控制。

  • Driver:运行Application的main()函数并创建SparkContext。

  • Executor:执行器,在worker node上执行任务的组件、用于启动线程池运行任务。每个Application拥有独立的一组Executors。

  • SparkContext:整个应用的上下文,控制应用的生命周期。

  • RDD:Spark的基本计算单元,一组RDD可形成执行的有向无环图RDD Graph。

  • DAG Scheduler:根据作业(Job)构建基于Stage的DAG,并提交Stage给TaskScheduler。

  • TaskScheduler:将任务(Task)分发给Executor执行。

  • SparkEnv:线程级别的上下文,存储运行时的重要组件的引用。SparkEnv内创建并包含如下一些重要组件的引用。

MapOutPutTracker:负责Shuffle元信息的存储。
BroadcastManager:负责广播变量的控制与元信息的存储。

BlockManager:负责存储管理、创建和查找块。
MetricsSystem:监控运行时性能指标信息。
SparkConf:负责存储配置信息。

Spark 的整体流程为 : Client 提交应用,Master找到一个 Worker 启动 Driver,Driver 向 Master 或者 资源管理器申请资源,之后将应用转化为 RDD Graph,再由 DAGScheduler 将 RDD Graph 转化为 Stage的有向无环图 提交给TaskScheduler,由TaskScheduler提交任务给Executor执行。在任务执行的过程中,其他组件协同工作,确保整个应用顺利执行。

(3) Spark 运行逻辑

Spark应用,整个执行流程在逻辑上会形成有向无环图(DAG)。

Action 算子触发之后,将所有累积的算子形成一个有向无环图,然后由调度器调度该图上的任务进行运算。

Spark 的调度方式与 MapReduce 有所不同。Spark 根据 RDD 之间不同的依赖关系切分形成不同的阶段(Stage),一个阶段包含一系列函数执行流水线。图中的A、B、C、D、E、F 分别代表不同的 RDD,RDD内的方框代表分区。数据从 HDFS输入Spark,形成RDD A 和 RDD C,RDD C上执行 map操作,转换为RDD D, RDD B 和 RDD E 执行join 操作,转换为F,而在 B 和 E 连接转化为 F 的过程中又会 执行Shuffle,最后RDD F 通过 函数saveAsSequenceFile输出 并保存到 HDFS 中。

图片描述

Chap 2 Spark安装与部署

Spark 安装简便。

Spark官网

Spark 主要使用 HDFS 充当持久化层,所以完整的安装 Spark 需要先安装 Hadoop. (当然你测试, 你就不需要)

2-1 Spark 的安装与部署

Spark 是计算框架, 它主要使用 HDFS 充当持久化层。如 hive etc..

1. Linux 集群安装 Spark

  1. 安装 JDK

  2. 安装 Scala

  3. 配置 SSH 免密码登陆 (可选)

  4. 安装 Hadoop

  5. 安装 Spark

  6. 启动 Spark 集群

Spark官网下载

5. 安装 Spark

(1). download  spark-1.5.2-bin-hadoop2.6.tgz

(2). tar -xzvf spark-1.5.2-bin-hadoop2.6.tgz

(3). 配置 conf/spark-env.sh
    1) 详细复杂参数配置参见 官网 Configuration
    2) vim conf/spark-env.sh
    
    export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk1.7.0_79.jdk/Contents/Home
    export SCALA_HOME=/usr/local/Cellar/scala/2.11.5
    export SPARK_HOME=/usr/local/xSoft/spark
    
    export SPARK_MASTER_IP=192.168.181.**
    export MASTER=spark://192.168.181.**:7077

    export SPARK_EXECUTOR_INSTANCES=2
    export SPARK_EXECUTOR_CORES=1

    export SPARK_WORKER_MEMORY=1000m
    export SPARK_EXECUTOR_MEMORY=300m

    export SPARK_LIBRARY_PATH=${SPARK_HOME}/lib

(4). 配置 conf/slaves (测试可选)
(5). 一般需要 startup ssh server.

6. 启动 Spark 集群

  • 在 Spark 根目录启动 Spark

    ./sbin/start-all.sh
    ./sbin/stop-all.sh

启动后 jps 查看 会有 Master 进程存在

➜  spark-1.5.2-bin-hadoop2.6  jps
11262 Jps
11101 Master
11221 Worker

2-2 Spark 集群初试

可以通过两种方式运行 Spark 样例 :

  • 以 ./run-example 的方式执行

[hdfs@node190 libin]$ cd /opt/cloudera/parcels/CDH-5.3.6-1.cdh5.3.6.p0.11/lib/spark

[hdfs@node190 libin]$ ./bin/run-example org.apache.spark.examples.SparkPi
  • 以 ./Spark Shell 方式执行

scala> import org.apache.spark._
import org.apache.spark._

scala>

scala> object SparkPi {
     |
     |   def main(args: Array[String]) {
     |
     |     val slices = 2
     |     val n = 100000 * slices
     |
     |     val count = sc.parallelize(1 to n, slices).map { i =>
     |
     |       val x = math.random * 2 - 1
     |       val y = math.random * 2 - 1
     |
     |       if (x * x + y * y < 1) 1 else 0
     |
     |     }.reduce(_ + _)
     |
     |     println("Pi is rounghly " + 4.0 * count / n)
     |
     |   }
     | }
defined module SparkPi

scala>

// Spark Shell 已默认将 SparkContext 类初始化为对象 sc, 用户代码可直接使用。

// Spark 自带的交互式的 Shell 程序,方便进行交互式编程。
  • 通过 Web UI 查看集群状态

        http://masterIp:8080
    

2-3 Spark -- quick start

quick-start : https://spark.apache.org/docs/latest/quick-start.html

./bin/spark-shell

scala> val textFile = sc.textFile("README.md")
textFile: spark.RDD[String] = spark.MappedRDD@2ee9b6e3
RDDs have actions, which return values, and transformations, which return pointers to new RDDs. Let’s start with a few actions:

scala> textFile.count() // Number of items in this RDD
res0: Long = 126

scala> textFile.first() // First item in this RDD
res1: String = # Apache Spark

2-4 本章小结

由于 Spark 主要使用 HDFS 充当持久化层,所以完整的使用 Spark 需要预先安装 Hadoop.

Spark 将分布式的内存数据抽象为弹性分布式数据集 (RDD), 并在其上实现了丰富的算子,从而对 RDD 进行计算,最后将 算子序列 转化为 DAG 进行执行和调度。


blair
209 声望31 粉丝

我是 Blair