spark 是目前非常流行的大数据计算框架。

spark 生态

Spark core:包含 spark 的基本功能,定义了 RDD 的 API,其他 spark 库都基于 RDD 和 spark core

SparkSQL:像 sql 一样操作数据

SparkStreaming:实时数据处理,像操作普通 RDD 一样处理流数据

Mlib:机器学习库,算法被实现为对 RDD 的操作

GraphX:控制图、并行图操作和计算的一组算法和工具的集合

spark 特点

快速:基于内存计算,官方数据表明,如果从磁盘读取文件,计算速度在 mr 10 倍以上,如果从内存直接读,计算速度在 mr 百倍以上

通用:spark 拥有强大的扩展,跟同类框架 strom 相比,正是由于 storm 扩展很少,逐渐被淘汰;

spark 拥有 SQL、Streaming、mlib、ml、Graphx 等组件,可用于各种场景;

  // mlib 和 ml 都是机器学习领域的组件,区别在于 mlib 是基于 RDD 的,ml 基于 DataFrame,ml 更高效更方便,它会逐渐替代 mlib;

容错:RDD 弹性分布式数据集;

易用:API 齐全;

应用场景

当我们的计算超过了单机尺寸,也就是单机内存不够时,可选用 spark;

或者当我们计算非常复杂,需要大量时间,也可选用 spark;

批处理:复杂计算的批处理,重点在于海量,可忍受的计算速度为 几分钟到几小时

交互查询:海量历史数据的交互查询,计算速度为 几秒到几十分钟

实时数据:实时数据流的数据处理,计算速度为 几百毫秒到几秒

spark 架构

spark 有 3 种部署模式,单机模式,集群模式(Standalone),yarn 模式(spark on yarn);

每个模式都是基于 master-slave 主从架构;

基本架构 - 粗略认识

Cluster Manager:主从架构中的 master;在 standalone 中叫 master 主节点,在 yarn 模式中叫 资源管理器,即 Resource Manager,yarn 的主节点;

Worker:主从架构中的 slave,从节点,负责控制计算节点,启动 Driver 和 Executor;

Driver:它是 application 中的 main 函数,可以理解为 给客户端发起的 request 临时启动的一个 进程,负责管理这个 request,或者说 task;

Executor:执行器,为 application 启动的一个进程;每个节点可以有多个 不同 application 的 Executor;负责运行 task;

基本运行流程 - 深入认识

1. 其实最左边还有个 Client,也就是用户发起请求,我们称之为 task;

2. 请求提交到集群,首先创建 Driver,一个进程,负责管理整个 task,这个进程里创建了 sparkContext 对象;

3. sparkContext 向资源管理器(standalone 主节点,yarn RM,mesos)申请资源;

4. 资源管理器向 所有从节点 询问各自使用情况,从节点汇报完毕后,资源管理器统计可用资源,同时要求被统计的资源启动 StandaloneExecutorBackend;

5. 资源管理器给 sparkContext 发送可用资源;

6. Executor 向 sparkContext 申请 task, sparkContext 给可用节点发送 task;

  // SparkContext 构建成 DAG 图,将 DAG 图分解成Stage、将 Taskset 发送给Task Scheduler,最后由Task Scheduler 将 Task 发送给 Executor 运行;

  // 简单理解下,就是把 task 进行分解,同时创建一个 任务调度器,把 分解后的 task 发给 Executor;

7. 从节点启动的 Executor 负责执行 task;

8. 计算完毕后释放所有资源;

概念完善

Application:用户编写的 spark 应用程序,包含 Driver 代码和  Executor 代码

Driver:运行 application 中 main 函数,并创建 sparkContext

1. Driver 里有个 任务调度器;

2. 调度的原则有一点是 把 task 分配给 存储计算所需数据的节点,这样可以避免数据传输;这叫 数据本地化和推测执行,是一种优化机制;

3. Driver 可以运行在 Client 上,此时 Client 上必须装有 spark;

4. Driver 可以理解为我们常说的 sc 或者 spark;

5. Driver 将 task 和 task 所依赖的 file 和 jars 序列化后传递给 Worker;

6. Driver 和 资源管理器通信,申请资源;

7. Driver 和 Executor 互相通信,协作运行;

Worker

1. 创建 Executor 的节点,也就是执行 task 的节点;

2. 也就是说 Worker 与 Client 会有大量的通信和数据传输,所以 Client 最好离 Worker “近” 一点;

Executor

1. 相当于创建了一个 容器,container,或者说一个虚拟环境;

2. 每个 task 都会新建一个 Executor,也就是说一个节点上可以有很多个 Executor,且彼此隔离;

3. 计算完毕后,Executor 会自动释放;

4. Executor 只与 任务调度器 通信,即 sparkContext,即 Driver,而这个 Driver 与 spark 无关,这也可以解释 为什么在 yarn 模式下,无需启动 spark 也能运行

5. 每个 Executor 中会有多个线程运行;

task 相关

Task: 被送到某个Executor上的工作单元,但hadoopMR中的MapTask和ReduceTask概念一样,是运行Application的基本单位,多个Task组成一个Stage,而Task的调度和管理等是由TaskScheduler负责
Job: 包含多个Task组成的并行计算,往往由Spark Action触发生成, 一个Application中往往会产生多个Job
Stage: 每个Job会被拆分成多组Task, 作为一个TaskSet, 其名称为Stage,Stage的划分和调度是有DAGScheduler来负责的,Stage有非最终的Stage(Shuffle Map Stage)和最终的Stage(Result Stage)两种,Stage的边界就是发生shuffle的地方
DAGScheduler: 根据Job构建基于Stage的DAG(Directed Acyclic Graph有向无环图),并提交Stage给TASkScheduler。 其划分Stage的依据是RDD之间的依赖的关系找出开销最小的调度方法,
TASKSedulter: 将TaskSET提交给worker运行,每个Executor运行什么Task就是在此处分配的. TaskScheduler维护所有TaskSet,当Executor向Driver发生心跳时,TaskScheduler会根据资源剩余情况分配相应的Task。
    另外TaskScheduler还维护着所有Task的运行标签,重试失败的Task。

连起来就是这张图

完整架构图

网上没找到太好的图,将就着理解下吧

总结

1. 以上内容大多数是针对 Standalone 模式的,当然其他模式也类似,只是在某些环节略有差别;

2. 值得注意的是,在 Standalone 模式中,Driver 既可以运行在 master 节点上,也可以运行在 Client 客户端,

  // 需要指定 master,否则是本地模式;

  // 如果是在 master 节点上运行 spark-shell 或者 pyspark 等,Driver 运行在 master 节点上;

  // 如果是 spark-submit 提交任务,或者在 Worker 上运行 spark-shell 或者 pyspark 等,Driver 运行在 Client 上;

  // 也就是说 Worker 上也可以发起 spark 任务,只是有权限问题,比如计算结果无法保存到 master 上,没有权限;

spark on yarn

其实 yarn 模式大体流程等同于 Standalone 模式,只是有些特殊地方,而且在实际工作中,大多数用的是 yarn 模式,比较重要,所以单独算一节

两种模式的区别

在 yarn 模式中,根据 Driver 在集群中的位置分为两种模式:Yarn-ClientYarn-Cluster(也就是 Yarn-Standalone 模式);

介绍这两种模式之前,先解释一个概念 application master,在 yarn 中,每个 application 实例都有一个 Application Master 实例,它是 application 启动的第一个容器,

1. 因为 yarn 是负责资源管理的,它本身无法响应 spark 应用,当 application 过来时,它需要找个地方,启动 spark 应用,也就是在某个节点,传递 spark application;这就是 application master;

2. 它负责与 ResouceManager 通信,在获取资源之后,告诉 NodeManager 创建 Container;

3. Container 相当于在 Worker 中创建了虚拟机;

4. 相当于 Standalone 模式中的 master;

Yarn-Cluster 模式下,Driver 运行在 AM(application master)中,Client 端只是单纯发起来 spark 应用,yarn 把这个 spark 应用 交由 application master 代为发起,当用户提交了 task 之后,就可以关掉 Client,task 会继续运行,所以这种模式不适合交互类型的作业;

Yarn-Client 模式下,Driver 运行在 Client,AM 仅仅向 yarn 申请 Executor,或者说申请 Container,然后 Client 和 Container 通信,协作完成任务,也就是说 Client 不能关闭

Yarn-Cluster 流程图

1. 在 yarn 的 Client 端向 ResourceManager 提交申请,ResourceManager 会在 某个 NodeManager 创建一个 Container,在这个 Container 中 启动 application master;

2. 在 application master 中 完成 Driver 的一系列工作,包括 创建 sparkContext,分解任务,创立任务调度器,等;  【vs Yarn-Cliet 区别】

3. 然后由 Driver 完成后续工作,与 Standalone 模式相同;

Yarn-Client 流程图

1. 在 yarn 的 Client 端向 ResourceManager 提交申请,并且在 Client 端完成 Driver 的一系列工作,包括 创建 sparkContext,分解任务,创立任务调度器,等;    【vs Yarn-Cluster 区别】

2. ResourceManager 会在 某个 NodeManager 创建一个 Container,在这个 Container 中 启动 application master;

3. application master 向其他节点申请 Executor;

4. 由 Client 中的 Driver 完成 与 Executor 的通信;

5. 其他与 Standalone 模式相同;

Python 不支持 Yarn-Cluster 模式,只支持 Yarn-Client 模式

经我测试,在 Yarn-Cluster 模式下,python 可以完成工作,但最后会报错;

上句代码吧

spark-submit --master yarn --deploy-mode cluster --class org.apache.spark.examples.SparkPi /usr/lib/spark/examples/jars/spark-examples_2.11-2.4.4.jar

spark shuffle

这个概念还是挺重要的,篇幅比较大,所以准备单独写一篇博客

参考资料:

https://www.cnblogs.com/liuliliuli2017/p/6809094.html

https://blog.csdn.net/swing2008/article/details/60869183

https://www.cnblogs.com/tgzhu/p/5818374.html

spark教程(12)-生态与原理的更多相关文章

  1. Spark教程——(11)Spark程序local模式执行、cluster模式执行以及Oozie/Hue执行的设置方式

    本地执行Spark SQL程序: package com.fc //import common.util.{phoenixConnectMode, timeUtil} import org.apach ...

  2. 深度学习与CV教程(12) | 目标检测 (两阶段,R-CNN系列)

    作者:韩信子@ShowMeAI 教程地址:http://www.showmeai.tech/tutorials/37 本文地址:http://www.showmeai.tech/article-det ...

  3. NODE-WEBKIT教程(12)全屏

    node-webkit教程(12)全屏 文/玄魂 目录 node-webkit教程(12)全屏 前言 12.1  和全屏有关的三个api Window.enterFullscreen() Window ...

  4. spark教程

    某大神总结的spark教程, 地址 http://litaotao.github.io/introduction-to-spark?s=inner

  5. 研究一下Spark Hash Shuffle 和 SortShuffle 原理机制

    研究一下Spark Hash Shuffle 和 SortShuffle 原理机制研究一下Spark Hash Shuffle 和 SortShuffle 原理机制研究一下Spark Hash Shu ...

  6. [译]Vulkan教程(12)图形管道基础之入门

    [译]Vulkan教程(12)图形管道基础之入门 Introduction 入门 Over the course of the next few chapters we'll be setting u ...

  7. [转帖]Linux教程(12)- linux输入输出重定向

    Linux教程(12)- linux输入输出重定向 2018-08-21 22:57:02 钱婷婷 阅读数 49更多 分类专栏: Linux教程与操作 Linux教程与使用   版权声明:本文为博主原 ...

  8. 黑马lavarel教程---12、lavarel验证码

    黑马lavarel教程---12.lavarel验证码 一.总结 一句话总结: 用插件的时候仔细看插件的版本要求 1.lavarel安装验证码插件的时候,如果(可选)需要定义自己的配置,则需要生成配置 ...

  9. Directx11教程(12) 禁止alt+enter全屏窗口

    原文:Directx11教程(12) 禁止alt+enter全屏窗口        在D3D11应用程序中,我们按下alt+enter键,会切换到全屏模式.有时候,我们在WM_SIZE中有一些代码,全 ...

随机推荐

  1. linux 上修改了nginx.conf 怎么重新加载配置文件生效

    步骤如下先利用/usr/local/nginx/sbin/nginx -t测试配置文件修改是否正常/usr/local/nginx/sbin/nginx -s reload重新加载 nginx 更改配 ...

  2. python3笔记二十四:Mysql数据库操作命令

    一:学习内容 Mysql操作命令:启动服务.停止服务.连接数据库.退出数据库.查看版本.显示当前时间.远程连接 数据库操作命令:创建数据库.删除数据库.切换数据库.查看当前选择的数据库 表操作命令:查 ...

  3. 使用 VS2015 编译并调试 ffmpeg

    导读 ffmpeg 是音频处理方面非常强大非常有名的开源项目了,然而如 雷神 所说,“FFMPEG 难度比较大,却没有一个循序渐进,由简单到复杂的教程.现在网上的有关FFMPEG的教程多半难度比较大, ...

  4. Instances cannot be resolved and nested lifetimes cannot be created from this LifetimeScope as it has already been disposed.

    2019-07-24 11:09:15.231+08:00 LISA.Common.Utilities.LogUtil - System.ObjectDisposedException: Instan ...

  5. mysql删除数据库所有表

    -- 生成删除xxx数据库的所有表的sql语句SELECT CONCAT('drop table ',table_name,';') FROM information_schema.`TABLES` ...

  6. android data binding jetpack V 实现recyclerview 绑定

    android data binding jetpack VIII BindingConversion android data binding jetpack VII @BindingAdapter ...

  7. js如何获取鼠标位置

    获取鼠标位置,首先需要加载js文件: 然后设置一个div,给定大小: 最后进行具体操作: //首先要先设置一个div,给定大小 <div id="m"></div ...

  8. 百度地图java 判断当前位置是否在多边形区域内

    package com.haiyisoft.cAssistant.adapter.hessian; import java.awt.geom.Point2D;import java.util.Arra ...

  9. zipkin-client:brave核心代码思路整理

    Zipkin是分布式跟踪系统. 简单地理解,可以将Zipkin分为两部分. 一部分为Zipkin Server,其负责接受存储应用程序处理耗时数据,以及UI展示. 另一部分为Zipkin Client ...

  10. LC 676. Implement Magic Dictionary

    Implement a magic directory with buildDict, and search methods. For the method buildDict, you'll be ...