spark教程(12)-生态与原理
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-Client 和 Yarn-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)-生态与原理的更多相关文章
- Spark教程——(11)Spark程序local模式执行、cluster模式执行以及Oozie/Hue执行的设置方式
本地执行Spark SQL程序: package com.fc //import common.util.{phoenixConnectMode, timeUtil} import org.apach ...
- 深度学习与CV教程(12) | 目标检测 (两阶段,R-CNN系列)
作者:韩信子@ShowMeAI 教程地址:http://www.showmeai.tech/tutorials/37 本文地址:http://www.showmeai.tech/article-det ...
- NODE-WEBKIT教程(12)全屏
node-webkit教程(12)全屏 文/玄魂 目录 node-webkit教程(12)全屏 前言 12.1 和全屏有关的三个api Window.enterFullscreen() Window ...
- spark教程
某大神总结的spark教程, 地址 http://litaotao.github.io/introduction-to-spark?s=inner
- 研究一下Spark Hash Shuffle 和 SortShuffle 原理机制
研究一下Spark Hash Shuffle 和 SortShuffle 原理机制研究一下Spark Hash Shuffle 和 SortShuffle 原理机制研究一下Spark Hash Shu ...
- [译]Vulkan教程(12)图形管道基础之入门
[译]Vulkan教程(12)图形管道基础之入门 Introduction 入门 Over the course of the next few chapters we'll be setting u ...
- [转帖]Linux教程(12)- linux输入输出重定向
Linux教程(12)- linux输入输出重定向 2018-08-21 22:57:02 钱婷婷 阅读数 49更多 分类专栏: Linux教程与操作 Linux教程与使用 版权声明:本文为博主原 ...
- 黑马lavarel教程---12、lavarel验证码
黑马lavarel教程---12.lavarel验证码 一.总结 一句话总结: 用插件的时候仔细看插件的版本要求 1.lavarel安装验证码插件的时候,如果(可选)需要定义自己的配置,则需要生成配置 ...
- Directx11教程(12) 禁止alt+enter全屏窗口
原文:Directx11教程(12) 禁止alt+enter全屏窗口 在D3D11应用程序中,我们按下alt+enter键,会切换到全屏模式.有时候,我们在WM_SIZE中有一些代码,全 ...
随机推荐
- 8.4 JavaScript(一)
参考链接:http://how2j.cn/k/javascript/javascript-javascript-tutorial/519.html 一.JavaScript是什么 JavaScript ...
- 【python / mxnet / gluoncv / jupyter notebook】基于mxnet和gluoncv的图像分割
程序环境为高性能集群: CPU:Intel Xeon Gold 6140 Processor * 2(共36核心)内存:512GB RAMGPU:Tesla P100-PCIE-16GB * 2 In ...
- Java-JVM 自定义类加载器
一.sun.misc.Launcher (ExtClassLoader 与 AppClassLoader 的创建) public Launcher() { Launcher.ExtClassLoade ...
- Response.AddHeader("Content-Disposition", "attachment; filename=" + file.Name) 中文显示乱码
如果file.Name为中文则乱码.解决办法是方法1:response.setHeader("Content-Disposition", "attachment; fil ...
- dpkg软件包管理
要想得心应手管理Ubuntu软件包,就必须熟悉其中最重要的软件包管理程序dpkg工具是Ubuntu软件包管理工具的基础.使用dpkg工具可以实现软件包的安装.卸载.查询.编译.打包等功能. dpkg( ...
- EvenBus源码分析
概述 一般使用EventBus的组件类,类似下面这种方式: public class SampleComponent extends Fragment { @Override public void ...
- Centos7 Devstack [Rocky] 重启后无法联网
部署devstack-rocky版本后网络,可以 Ping 通自己的 IP,但 Ping 不同网关,ping不通同网段主机,查看网卡和ovs信息如下 解决 第一步 按造网上教程,修改br-ex,ens ...
- UITableView的使用总结
直接贴代码了,很好理解,注释很全,一看就懂...... // // ViewController.m // TableViewSectionTitleDemo // // Created by 思 彭 ...
- JavaScript(1)——编程真善美
编程真善美 命名风格: 驼峰命名法 小驼峰法 变量一般用小驼峰法标识.驼峰法的意思是:除第一个单词之外,其他单词首字母大写:camelCase 大驼峰法(即帕斯卡命名法) 相比小驼峰法,大驼峰法把第一 ...
- 使用PhantomJS
PhantomJS是一个基于WebKit的服务器端JavaScript API.它全面支持Web而无需浏览器支持,不仅运行快,原生支持各种web标准:DOM处理.CSS选择器.JSON.Canvas, ...