01-spark基础
1、定义
Spark是一个由scala语言编写的实时计算系统
Spark支持的API包括Scala、Python、Java 、R
2、功能
Spark Core: 将分布式数据抽象为弹性分布式数据集(RDD),实现了应用任务调度、RPC、序列化和压缩,并为运行在其上的上层组件提供API。
是Spark核心编程,类似Hadoop中的MR编程框架,但比MR拥有更丰富的算子,
且几乎所有对数据的处理都放置在内存中,所以比MR更高效。
Spark SQL: 类似Hive,但是Spark的SQL可以和SparkCore无缝集合,使用起来非常方便。对应的,MR和Hive并不能无缝集合。
Spark Streaming: 类似Storm,用来进行流式处理。
Spark MLlib: 用于机器学习,
Graphx: 用于图计算。
3、Spark部署方式
①YARN : 采用Yarn模式的话,其实就是把spark作为一个客户端提交作业给YARN,实际运行程序的是YARN。所以安装部署只需要在其中一台机器上安装spark就行。
②standalone: 使用spark内置的资源管理与调度器。
注:还有其他的部署方式,比如Apache Mesos等。但是最常见的Spark on Yarn
4、Spark运行方式
Spark程序,无论是Spark core、Spark Sql、Spark Streaming,都可以通过以下两种形式运行: ①Spark-shell 类似于scala的控制台,spark会自动帮我们做以下几件事情: 1.会在启动spark-shell的机器的4040端口上绑定spark的web监控页面
2.将SparkContext类的对象命名为sc
3.将SparkSession类的对象命名为spark Spark-shell分为两种运行类型:
①spark-shell on StandaLone //可以使用shell连接内置的资源管理(standalone),进行任务提交,这里不研究
②spark-shell on YARN //可以使用shell连接yarn,进行任务提交。分为客户端、集群模式 1、spark on YARN 之 cluster 集群模式 我们提交的spark应用程序对于YARN来说,也只不过是一个分布式应用程序而已,
在YARN看来,一个MR程序和一个spark程序是没有区别的。所以spark程序提交后,
同样要跟YARN申请一个Continer来启动当前spark程序的Application Master,
YARN会选择一个空闲的Datanode启动AM,其实这种情况下,Spark的Driver程序运行在AM内。 提交程序之后,客户端连接可以断开。 2、spark on YARN 之 client 客户端模式 同样会跟YARN申请Continer用以执行AM程序,但是这个AM的作用就只有向YARN申请资源这么一个功能了。
在这种情况下,Spark的Driver程序在提交程序的客户端执行,也就是说Driver程序没有在AM内运行。
这个时候我们可以利用spark-shell进行交互,连接不能断开,也就不能多用户操作 注:在实际开发中我们都使用cluster模式。 eg: sc.textFile("/spark/all").flatMap(line => line.split(" ")). map(word => (word, 1)).reduceByKey(_ + _). saveAsTextFile("/spark/wcall") //在spark-shell中输入上述wordcount语句就行,因为自动构建了SparkContext对象 ②spark-submit 将程序打包成jar包,进行运行。
自己创建SparkContext类的对象,自己确定什么时候程序终止退出等相关所有操作。 命令:spark-submit --master yarn --deploy-mode cluster bigdata-spark-test.jar
5、粗粒度和细粒度(调度模式)
①粗粒度模式:
每个应用程序的运行环境由一个Dirver和若干个Executor组成,其中,每个Executor占用若干资源,内部可运行多个Task。
应用程序的各个任务正式运行之前,需要将运行环境中的资源全部申请好,且运行过程中要一直占用这些资源(即使不用),
最后程序运行结束后,回收这些资源。
②细粒度模式:
与粗粒度模式一样,应用程序启动时,先会启动executor,但每个executor占用资源仅仅是自己运行所需的资源,不需要考虑将来要运行的任务,
之后,cluster manager会为每个task根据自身需要动态分配资源,单个Task运行完之后可以马上释放对应的资源。每个Task完全独立,
优点是便于资源控制和隔离,但缺点也很明显,短作业运行延迟大(重新分配task的资源)。
注:yarn目前只支持粗粒度模式
注:ResourceManager:负责将集群的资源分配给各个应用使用,而资源分配和调度的基本单位是Container,其中封装了集群资源(CPU、内存、磁盘等),
每个任务只能在Container中运行,并且只使用Container中的资源。那么就算spark的Executor用不了这么资源,也会占用这么多,这就是粗粒度
6、整体架构
了解基本概念、部署、运行方式之后。了解下整体架构图。
Application: 用户编写的Spark应用程序。
Application jar:一个包含用户 Spark 应用的 Jar。
Driver: 负责执行main函数,创建SparkContext上下文(DAGScheduler 、TaskScheduler运行在SparkContext中)
sparkContext:它负责与程序、spark集群进行交互,包括创建RDD、accumulators及广播变量等。如sc.makeRDD()等方法
SparkContext是Spark的入口,相当于应用程序的main函数。
Cluster manager:一个外部的用于获取集群上资源的服务。(例如,Standlone Manager,Mesos,YARN)
Worker node:任何在集群中可以运行应用代码的节点,yarn上是DataNode。
Executor :一个为了在 worker 节点上的应用而启动的进程,它运行 task 并且将数据保持在内存中或者硬盘存储。
不同的Spark应用程序(Application)对应不同的Executor,这些Executor在整个应用程序执行期间都存在并且Executor中可以采用多线程的方式执行Task。
这样做的好处是,各个Spark应用程序的执行是相互隔离的。
Job :有一个RDD Action生成的一个或多个调度阶段所组成的一次计算作业。(可以理解为一个action算子触发一个Job,比方说count,first等)
(action触发的这次计算被划分为多个Stage)
Stage :每个 Job 被拆分成几个 stage(阶段) ,每个stage(阶段)划分为 很多task(任务),stage 彼此之间是相互依赖的,可以并行运行
Task :一个将要被发送到 Executor 中的工作单元,运行结果要么存储在内存中,要么存储在磁盘上。
DAG : 即 Directed Acyclic Graph,有向无环图,这是一个图论中的概念。如果一个有向图无法从某个顶点出发经过若干条边回到该点,则这个图是一个有向无环图。
DAGScheduler :把Job划分stage,然后把stage转化为相应的Tasks,并将Task以TaskSet的形式发送给TaskScheduler //其划分Stage的依据是遇见宽依赖就划分Stage
TaskScheduler:将Tasks添加到任务队列当中,并且负责将Task往Executor发送
注:DAGScheduler 、TaskScheduler运行在SparkContext中
注:一旦worker宕机,master会重新调度任务,而如果只是进程Executor出现问题,只会重启一个新的Executor
7、Spark任务提交流程
1、Cient向YARN的ResourceManager提交应用程序(包括启动ApplicationMaster的命令、提交给ApplicationMaster的程序和需要在Executor中运行的程序等。)
2、ResourceManager接收到请求后,在集群中选择一个NodeManager,为该应用程序分配Container,
3、然后Container中启动此应用的ApplicationMaster,ApplicationMaster负责运行driver,进行SparkContext等的初始化。(Spark的Driver的功能其实被ApplicationMaster做了,并不存在这一概念)
4、然后ApplicationMaster向ResourceManager注册,然后申请资源,运行Executor,并且启动CoarseGrainedExecutorBackend(即Spark的粗粒度执行器后台程序)
然后对其进行监控直到运行结束。
5、同时SparkContext创建DAGScheduler、Task Scheduler ,DAGScheduler将Action算子触发的job构建成DAG图,将DAG图根据依赖关系分解成Stage,并把TaskSet发送给Task Scheduler。
6、CoarseGrainedExecutorBackend启动后会向ApplicationMaster中的SparkContext注册并申请任务集。
Task Scheduler将Task发放给Executor运行同时SparkContext将应用程序代码发放给Executor。
7、剩余的事情就是等待Executor中的Task执行完成了,ApplicationMaster注销资源。
8、spark任务生成和提交的四个阶段
DAG的生成、stage切分、task的生成、任务提交
1、构建DAG
用户提交的job将首先被转换成一系列RDD并通过RDD之间的依赖关系构建DAG,然后将DAG提交到调度系统;
2、DAGScheduler将DAG切分stage(切分依据是shuffle),将stage中生成的task以taskset的形式发送给TaskScheduler
3、Scheduler 调度task(根据资源情况将task调度到Executors)
4、Executors接收task,然后将task交给线程池执行。
9、stage、pipeline(管道计算模式)
stage概念:Spark任务会根据RDD之间的依赖关系,形成一个DAG有向无环图,DAG会提交给DAGScheduler,DAGScheduler会把DAG划分相互依赖的多个stage,
每个stage包含一个或多个task任务。然后将这些task以taskSet的形式提交给TaskScheduler运行。stage是由一组并行的task组成。
stage切割规则:从后往前,遇到宽依赖就切割stage。
stage计算模式:pipeline
pipeline:也就是来一条数据然后计算一条数据,把所有的逻辑走完,然后落地。
eg:sc.TextFile("\").map().flatmap().reduce()
一行数据读取出来之后,就进行map()、flatmap(),中间不会停歇,中间的map()计算结果不会保存、像流水线一样。
而MapReduce是 1+1=2,2+1=3的模式,也就是计算完落地,然后在计算,然后再落地到磁盘或内存。
注:这也是比Mapreduce快的原因,完全基于内存计算。
pipeline中数据何时落地:
①shuffle write、(Spark 也会自动缓存shuffle的部分数据)
②对RDD进行持久化的时候。
Stage的task并行度:
①Spark默认一个块对应一个分区,一个分区代表一个Task,如果都是窄依赖算子,可以流水线工作,那么task并行度为块个数
②由于宽依赖算子可以手动改变numTask,也就是分区数,即改变了并行度。如reduceByKey(XXX,3),GroupByKey(4),
但是根据Stage的划分,每个Stage都可以并行执行,也就是说reduceByKey(_ + _)等算子并不需要前面所有分区都执行完毕,
但凡有一个分区执行完毕,那么reduce就进行读取这个分区的结果文件,所以并行度为前后分区数相加
注:Task被执行的并发度 = Executor数目 * 每个Executor核数(=core总个数) //实际并发度
注:一个块的数据map().flatmap()这些流水线Task都在同一节点、同一分区执行。
注:core和cpu核不同,cpu有4核,那么分配到不同Executor的核可能只有两个,这两个称为Executor核数 <==>core
注:MR和Spark一样,其实并不一定等MapTask全部执行完才执行ReducceTask。可以设置,MapTask是执行完一个就执行,还是执行一定比例才执行ReducceTask
10、Spark Shuffle过程
hadoop中的shuffle存在map任务和reduce任务之间,而spark中的shuffle过程存在stage之间。
shuffle过程:由ShuffleManager负责,计算引擎HashShuffleManager(Spark 1.2)—>SortShuffleManager(现在用的)
shuffle过程参考网址:https://blog.csdn.net/quitozang/article/details/80904040
①HashShuffleManager:
shuffle write:
①stage结束之后,每个task处理的数据按key进行“分类”
②数据先写入内存缓冲区
③缓冲区满,溢出到磁盘文件
④最终,相同key被写入同一个磁盘文件
注:这种处理每个分区都会产生下一个stage的task数量的文件。
创建的磁盘文件数量 = 当前stagetask数量 * 下一个stage的task数量
read:
①从上游stage的所有task节点上拉取属于自己的磁盘文件
②每个read task会有自己的buffer缓冲,每次只能拉取与buffer缓冲相同大小的数据,然后聚合,聚合完一批后拉取下一批
③该拉取过程,边拉取边聚合
②优化后的HashShuffleManager
①一个Executor上有多少个core(线程),就可并行执行多少个task
②第一批并行执行的每个task会创建shuffleFileGroup,数据写入对应磁盘文件中
③第一批task执行完后,下一批task复用已有的shuffleFileGroup
磁盘文件数量 = core数量 * 下一个stage的task数量
③SortShuffleManager
①数据先写入内存缓冲区
②每写一条数据,判断是否达到某个临界值,达到则根据key对数据排序,再溢出到磁盘
③合并所有临时磁盘文件(merge),归并排序,依次写入同一个磁盘文件
④单独写一份索引文件,标识下游各个task的数据在文件中的start and end
磁盘文件数量 = 上游stage的task数量
④Bypass
reducer的task数量 < spark.sort.bypassMergeThreshold(默认为200),shuffle write过程不排序,其余的和SortShuffleManager一样
注:现在的Spark在reduce<200,默认使用bypass,其余时候使用SortShuffleManager
01-spark基础的更多相关文章
- 【原创 Hadoop&Spark 动手实践 5】Spark 基础入门,集群搭建以及Spark Shell
Spark 基础入门,集群搭建以及Spark Shell 主要借助Spark基础的PPT,再加上实际的动手操作来加强概念的理解和实践. Spark 安装部署 理论已经了解的差不多了,接下来是实际动手实 ...
- 最全的spark基础知识解答
原文:http://www.36dsj.com/archives/61155 一. Spark基础知识 1.Spark是什么? UCBerkeley AMPlab所开源的类HadoopMapReduc ...
- 01: tornado基础篇
目录:Tornado其他篇 01: tornado基础篇 02: tornado进阶篇 03: 自定义异步非阻塞tornado框架 04: 打开tornado源码剖析处理过程 目录: 1.1 Torn ...
- Hadoop Spark 基础教程
0x01 Hadoop 慕课网 https://www.imooc.com/learn/391 Hadoop基础 慕课网 https://www.imooc.com/learn/890 Hadoop ...
- 【一】Spark基础
Spark基础 什么是spark 也是一个分布式的并行计算框架 spark是下一代的map-reduce,扩展了mr的数据处理流程. Spark架构原理图解 RDD[Resilient Distrib ...
- 后端 - Lession 01 PHP 基础
目录 Lession 01 php 基础 1. php 基础 2. php 变量 3. php 单引号 和 双引号区别 4. 数据类型 5. 数据类型转换 6. 常量 7. 运算符 8. 为 fals ...
- Spark 基础操作
1. Spark 基础 2. Spark Core 3. Spark SQL 4. Spark Streaming 5. Spark 内核机制 6. Spark 性能调优 1. Spark 基础 1. ...
- Jam's balance HDU - 5616 (01背包基础题)
Jim has a balance and N weights. (1≤N≤20) The balance can only tell whether things on different side ...
- Spark基础学习精髓——第一篇
Spark基础学习精髓 1 Spark与大数据 1.1 大数据基础 1.1.1 大数据特点 存储空间大 数据量大 计算量大 1.1.2 大数据开发通用步骤及其对应的技术 大数据采集->大数据预处 ...
- 086 01 Android 零基础入门 02 Java面向对象 01 Java面向对象基础 03 面向对象基础总结 01 面向对象基础(类和对象)总结
086 01 Android 零基础入门 02 Java面向对象 01 Java面向对象基础 03 面向对象基础总结 01 面向对象基础(类和对象)总结 本文知识点:面向对象基础(类和对象)总结 说明 ...
随机推荐
- xml配置*的问题
spring配置种classpath * 和classpath的问题,class path有多个的情况下,会匹配第一个 <context:component-scan/>中两个**表示可以 ...
- c++获取键盘输入cin、scanf使用详解
cin是c++标准,scanf是在c中使用的 #include<cstdio> #include<iostream> #include<cstring> using ...
- python selenium-webdriver 生成测试报告 (十四)
测试最后的一个重要的过程就是生成一份完整的测试报告,生成测试报告的主要是通过python的一个第三方模块HTMLTestRunner.py生成,但是生成的测试报告不是特别的美观,而且没有办法统计测试结 ...
- TestNG.xml参数配置-如何控制部分执行@test方法
如果在methods中标识了@test的方法,也可以在method中通过include和exclude来控制需要执行哪些方法 <include name="testMethod1&qu ...
- jmeter修改ServerAgent的默认端口号
jmeter修改ServerAgent的默认端口号 1 java -jar ./CMDRunner.jar --tool PerfMonAgent --udp-port 5555 --tcp-port ...
- jmeter分布式测试的坑
转 : jmeter分布式测试的坑 有关jmeter分布式测试的环境配置,大概就是那样,但是每次想要进行jmeter分布式测试的时候,总是会有各种奇怪的问题,下面整理了一些可能遇到的坑. 只要错误中出 ...
- dashboard无法查到endpoint, counter
问题 使用Open-falcon时,Agent 推送metrics后,无法在Dashboard上显示.将Agent的hostname 修改后,却可以. 解决办法 查看Agent log,推送到tran ...
- PE结构学习笔记--关于AddressOfEntryPoint位置在文件中怎么确定问题
第一次学习PE结构,也不知道有没有更好的办法. 1.AddressOfEntryPoint 这个成员在OptionalHeader里面,OptionalHeader的类型是一个IMAGE_OPTION ...
- Eclipse安装插件的“最好方法”:dropins文件夹的妙用
在Eclipse3.4以前安装插件非常繁琐. 在Eclipse3.5以后插件安装的功能做了改进.而且非常方便易用. 我们只需要把需要的插件复制(拖放)到eclipse\dropins,然后插件就安装成 ...
- ML: 降维算法-PCA
PCA (Principal Component Analysis) 主成份分析 也称为卡尔胡宁-勒夫变换(Karhunen-Loeve Transform),是一种用于探索高维数据结 ...