5万字长文!搞定Spark方方面面(一)

本文涉及的产品
服务治理 MSE Sentinel/OpenSergo,Agent数量 不受限
简介: 5万字长文!搞定Spark方方面面


Hello,大家好,这里是 857技术
社区。

今天给大家分享一篇小白易读懂的 Spark 万字概念长文,本篇文章追求的是力求精简、通俗易懂。希望能为新手的入门学习扫清障碍,从基础概念入手、再到原理深入,由浅入深地轻松掌握 Spark。

640.png

首先介绍一下 Spark 的发展史!!!!!

大数据、人工智能( Artificial Intelligence )像当年的石油、电力一样,正以前所未有的广度和深度影响所有的行业,现在及未来公司的核心壁垒是数据,核心竞争力来自基于大数据的人工智能的竞争。
Spark是当今大数据领域最活跃、最热门、最高效的大数据通用计算平台,
2009年诞生于美国加州大学伯克利分校AMP 实验室,
2010年通过BSD许可协议开源发布,
2013年捐赠给Apache软件基金会并切换开源协议到切换许可协议至Apache2.0,
2014年2月,Spark成为Apache的顶级项目
2014年11月, Spark的母公司Databricks团队使用Spark刷新数据排序世界记录
Spark成功构建起了一体化、多元化的大数据处理体系。在任何规模的数据计算中, Spark在性能和扩展性上都更具优势。
(1) Hadoop 之父Doug Cutting指出:Use of MapReduce engine for Big Data projects will decline, replaced by Apache Spark (大数据项目的MapReduce引擎的使用将下降,由Apache Spark 取代)
(2)Hadoop 商业发行版本的市场领导者Cloudera 、HortonWorks 、MapR 纷纷转投Spark,并把Spark作为大数据解决方案的首选和核心计算引擎。
2014年的如此Benchmark测试中, Spark秒杀Hadoop ,在使用十分之一计算资源的情况下,相同数据的排序上, Spark比MapReduce快3倍!在没有官方PB 排序对比的情况下,首次将S park 推到了IPB 数据(十万亿条记录) 的排序,在使用190个节点的情况下,工作负载在4小时内完成, 同样远超雅虎之前使用3800台主机耗时16个小时的记录。
2015年6月,Spark最大的集群来自腾讯–8000个节点,单个Job最大分别是阿里巴巴和Databricks–1PB,震撼人心!同时,Spark的Contributor比2014年涨了3倍,达到730人:总代码行数也比2014年涨了2倍多,达到40行。
IBM于2015 年6 月承诺大力推进Apache Spark 项目, 并称该项目为:以数据为主导的,未来十年最重要的新的开源项目。这-承诺的核心是将Spark 嵌入IBM 业内领先的分析和商务平台,并将Spark 作为一项服务,在IBMB平台上提供给客户。IBM还将投入超过3500名研究和开发人员在全球10余个实验室开展与Spark相关的项目,并将为Spark开源生态系统无偿提供突破性的机器学习技术–IBM SystemML。同时,IBM还将培养超过100万名Spark数据科学家和数据工程师。
2016年,在有“计算界奥运会”之称的国际著名Sort Benchmark全球数据排序大赛中,由南京大学计算机科学与技术系PASA大数据实验室、阿里巴巴和Databricks公司组成的参赛因队NADSort,以144美元的成本完成lOOTB标准数据集的排序处理,创下了每TB数据排序1.44美元成本的最新世界纪录,比2014 年夺得冠军的加州大学圣地亚哥分校TritonSort团队每TB数据4.51美元的成本降低了近70%,而这次比赛依旧使用Apache Spark大数据计算平台,在大规模并行排序算法以及Spark系统底层进行了大量的优化,以尽可能提高排序计算性能并降低存储资源开销,确保最终赢得比赛。
在FullStack理想的指引下,Spark中的Spark SQL 、SparkStreaming 、MLLib 、GraphX 、R五大子框架和库之间可以无缝地共享数据和操作, 这不仅打造了Spark在当今大数据计算领域其他计算框架都无可匹敌的优势, 而且使得Spark正在加速成为大数据处理中心首选通用计算平台。

其次 Spark 为什么会流行呢????

原因1:优秀的数据模型和计算抽象
Spark 产生之前,已经有MapReduce这类非常成熟的计算系统存在了,并提供了高层次的API(map/reduce),把计算运行在集群中并提供容错能力,从而实现分布式计算。
虽然MapReduce提供了对数据访问和计算的抽象,但是对于数据的复用就是简单的将中间数据写到一个稳定的文件系统中(例如HDFS),所以会产生数据的复制备份,磁盘的I/O以及数据的序列化,所以在遇到需要在多个计算之间复用中间结果的操作时效率就会非常的低。而这类操作是非常常见的,例如迭代式计算,交互式数据挖掘,图计算等。
认识到这个问题后,学术界的AMPLab提出了一个新的模型,叫做RDD。RDD是一个可以容错且并行的数据结构(其实可以理解成分布式的集合,操作起来和操作本地集合一样简单),它可以让用户显式的将中间结果数据集保存在内存中,并且通过控制数据集的分区来达到数据存放处理最优化.同时RDD也提供了丰富的 API (map、reduce、foreach、redeceByKey…)来操作数据集。后来 RDD被AMPLab在一个叫做 Spark 的框架中提供并开源.
简而言之,Spark借鉴了MapReduce思想发展而来,保留了其分布式并行计算的优点并改进了其明显的缺陷。让中间数据存储在内存中提高了运行速度、并提供丰富的操作数据的API提高了开发速度。

d335c6af2258c8788d8af2b693717347.png

5e563e3022465d578b484d5aae8152d0.png

原因2:完善的生态圈
目前,Spark已经发展成为一个包含多个子项目的集合,其中包含SparkSQL、Spark Streaming、GraphX、MLlib等子项目
Spark Core:实现了Spark的基本功能,包含RDD、任务调度、内存管理、错误恢复、与存储系统交互等模块。
Spark SQL:Spark用来操作结构化数据的程序包。通过Spark SQL,我们可以使用SQL操作数据。
Spark Streaming:Spark提供的对实时数据进行流式计算的组件。提供了用来操作数据流的API。
Spark MLlib:提供常见的机器学习(ML)功能的程序库。包括分类、回归、聚类、协同过滤等,还提供了模型评估、数据导入等额外的支持功能。
GraphX(图计算):Spark中用于图计算的API,性能良好,拥有丰富的功能和运算符,能在海量数据上自如地运行复杂的图算法。
集群管理器:Spark设计为可以高效地在一个计算节点到数千个计算节点之间伸缩计算。

1fcfb2787f9d8003975f2cfa713a99cc.png

扩展阅读:Spark VS Hadoop
★注意:
尽管Spark相对于Hadoop而言具有较大优势,但Spark并不能完全替代Hadoop ,Spark主要用于替代Hadoop中的MapReduce计算模型。存储依然可以使用HDFS,但是中间结果可以存放在内存中;调度可以使用Spark内置的,也可以使用更成熟的调度系统YARN等
实际上,Spark已经很好地融入了Hadoop生态圈,并成为其中的重要一员,它可以借助于YARN实现资源调度管理,借助于HDFS实现分布式存储。
此外,Hadoop可以使用廉价的、异构的机器来做分布式存储与计算,但是,Spark对硬件的要求稍高一些,对内存与CPU有一定的要求。

d425710b6770d2d0ab265e22f55296f9.png

一、Spark 概述详解

1、Spark 是什么?

Apache Spark是用于大规模数据处理的统一分析引擎
Spark基于内存计算,提高了在大数据环境下数据处理的实时性,
同时保证了高容错性和高可伸缩性,允许用户将Spark部署在大量硬件之上,形成集群。

Spark 官网

http://spark.apachecn.org

http://spark.apachecn.org

653f04c45306a9d1ac16e682f3f62ca8.png

2、Spark 架构组成及原理

6f1535769ea8457da95eab01bdac96aa.png

1.Spark Core:包含Spark的基本功能;尤其是定义RDD的API、操作以及这两者上的动作。其他Spark的库都是构建在RDD和Spark Core之上的。
2.Spark SQL:提供通过Apache Hive的SQL变体Hive查询语言(HiveQL)与Spark进行交互的API。每个数据库表被当做一个RDD,Spark SQL查询被转换为Spark操作。
3.Spark Streaming:对实时数据流进行处理和控制。Spark Streaming允许程序能够像普通RDD一样处理实时数据。
4.MLlib:一个常用机器学习算法库,算法被实现为对RDD的Spark操作。这个库包含可扩展的学习算法,比如分类、回归等需要对大量数据集进行迭代的操作。
5.GraphX:控制图、并行图操作和计算的一组算法和工具的集合。GraphX扩展了RDD API,包含控制图、创建子图、访问路径上所有顶点的操作。

Spark 架构的组成图如下:

63d69fc2152bc062c9dc461e2de7711c.png

有图可见,Master是Spark的主控节点,在实际的生产环境中会有多个Master,只有一个Master处于active状态。Worker是Spark的工作节点,向Master汇报自身的资源、Executeor执行状态的改变,并接受Master的命令启动 Executor或Driver。Driver是应用程序的驱动程序,每个应用包括许多小任务,Driver负责推动这些小任务的有序执行。
Executor是Spark的工作进程,由Worker监管,负责具体任务的执行。

Master-Worker(分别的作用及关系)

整个Spark集群中,分为Master节点与worker节点,同时一个集群有多个master节点和多个worker节点。
1.Master:主节点,该节点负责管理worker节点,我们从master节点提交应用,负责将串行任务变成可并行执行的任务集Tasks,同时还负责出错问题处理等;
2.Worker:从节点,该节点与master节点通信,负责执行任务并管理executor进程。它为集群中任何可以运行Application代码的节点,在Standalone模式中指的是通过slave文件配置的Worker节点,在Spark on Yarn模式下就是NoteManager节点。

1.Application

Appliction都是指用户编写的Spark应用程序,其中包括一个Driver功能的代码和分布在集群中多个节点上运行的Executor代码

2.Driver

Driver是spark的驱动节点,用于执行spark任务中的main方法,负责实际代码的执行工作。主要负责以下任务:
1)将用户程序转化为作业(job)
2)在Executor之间调度任务
3)跟踪Executor的执行情况
4)通过 UI 展示查询运行情况
通俗理解Driver就是驱使整个应用运行起来的程序,也称之为Driver类

3.Executor

31e5da7a195bdadb5139b4e4914488a5.png

6ec0f7350b4bb31b77af91b06e2ca554.png

理解1:
Spark Executor是集群中工作节点(Worker)中的一个JVM进程,负责在Spark作业中运行具体任务(Task),任务彼此之间相互独立。Spark应用启动时,Executor节点被同时启动,并且始终伴随着整个Spark应用的生命周期而存在。如果有Executor节点发生了故障或崩溃,Spark应用也可以继续执行,会将出错节点上的任务调度到其他Executor节点上继续运行。
1)负责运行组成Spark应用的任务,并将结果返回给驱动器进程
2)它们通过自身的块管理器(Block Manager)为用户程序中要求缓存的RDD 提供内存式存储。RDD是直接缓存在Executor进程内的,因此任务可以在运行时充分利用缓存数据加速运算。
理解2:
执行器,为某个Application运行在worker节点上的一个进程,该进程负责运行某些Task,并且负责将数据存到内存或磁盘上,每个Application都有各自独立的一批Executor进程。executor宿主在worker节点上,每个 Worker 上存在一个或多个Executor进程,每个executor持有一个线程池,每个线程可以执行一个task。根据Executor上CPU-core的数量,其每个时间可以并行多个跟core一样数量的task。task任务即为具体执行的Spark程序的任务。executor执行完task以后将结果返回给driver,每个executor执行的task都属于同一个应用。此外executor还有一个功能就是为应用程序中要求缓存的 RDD 提供内存式存储,RDD是直接缓存在executor进程内的,因此任务可以在运行时充分利用缓存数据加速运算。
当我们在代码中执行了cache/persist等持久化操作时,根据我们选择的持久化级别的不同,每个task计算出来的数据也会保存到Executor进程的内存或者所在节点的磁盘文件中。
因此Executor的内存主要分为三块:第一块是让task执行我们自己编写的代码时使用,默认是占Executor总内存的20%;第二块是让task通过shuffle过程拉取了上一个stage的task的输出后,进行聚合等操作时使用,默认也是占Executor总内存的20%;第三块是让RDD持久化时使用,默认占Executor总内存的60%。
task的执行速度是跟每个Executor进程的CPU core数量有直接关系的。一个CPU core同一时间只能执行一个线程。而每个Executor进程上分配到的多个task,都是以每个task一条线程的方式,多线程并发运行的。如果CPU core数量比较充足,而且分配到的task数量比较合理,那么通常来说,可以比较快速和高效地执行完这些task线程。

4.Cluter Manager

集群管理器,指的是在集群上获取资源的外部服务。目前有三种类型:
1)Standalone : spark原生的资源管理,由Master负责资源的分配,易于构建集群
2)Apache Mesos:通用的集群管理,与hadoop MR兼容性良好的一种资源调度框架,可以在其上运行Hadoop MapReduce和一些服务应用
3)Hadoop Yarn: 主要是指Yarn中的ResourceManager
在集群不是特别大,并且没有mapReduce和Spark同时运行的需求的情况下,用Standalone模式效率最高。

5.Task(任务)

真正执行计算的部分。Stage相当于TaskSet,每个Stage内部包含了多个Task,将各个Task下发到各个Executor执行计算。
每个Task的处理逻辑完全一样,不同的是对应处理的数据。即:移动计算而不是移动数据。
Task是真正干活的,所以说是它间接决定了Spark程序的快慢也不过分。

6.Job(作业)

Spark根据行动操作触发提交作业,以行动操作将我们的代码切分为多个Job。

7.Stage(调度阶段)

每个Job中,又会根据宽依赖将Job划分为多个Stage(包括ShuffleMapStage和ResultStage)。

Job、Stage、Task 的对应关系如下:

6dfaff6c89fccbb48f2f96b21f4687e6.png

8.DAGScheduler

根据Job构建基于Stage的DAG(Directed Acyclic Graph有向无环图),并提交Stage给TASkScheduler。 其划分Stage的依据是RDD之间的依赖的关系找出开销最小的调度方法

扩展(DAG 划分 Stage 原理):

Spark 在分布式环境下将数据分区, 然后将作业转化为DAG, 并分阶段进行 DAG的调度和任务的分布式并行处理。DAG将调度提交给DAGScheduler, DAGScheduler调度时会根据是否需要经过Shuffle过程将 Job划分为多个Stage。
为了方便理解DAGScheduler划分Stage的原理,下面来看一个典型的DAG划分Stage示意图,如图所示。

5ae102b6b5d1fe0c8e867bc45140f0a0.png

在上图中,RDD a 到 ShuffledRDD之间, 以及UnionRDD到CoGroupedRDD之间的数据需要经过Shuffle过程, 因此ROD a 和UnionRDD分别是Stage 1 跟Stage 3和Stage 2 跟Stage 3的划分点。而ShuffledRDD到CoGroupedRDD之间,以及RDD b到MappedRDD到UnionRDD和RDD c 到UnionRDD之间的数据不需要经过Shuffle过程。因此,ShuffledRDD和CoGroupedRDD的依赖是窄依赖,两个RDD属于同一个Stage3,其余RDD划分为2个Stage。Stage1和Stage2是相对独立的,可以并行运行。Stage3则依赖于Stage1和Stage2的运行结果,所以Stage3最后执行。
由此可见,在DAGScheduler调度过程中,Stage阶段换份是依据作业是否有Shuffle过程,也就是存在ShuffleDependency的宽依赖时,需要进行Shuffle,此时才会将作业划分为多个Stage。

9.TASKSedulter

TaskScheduler概念:
将TaskSET提交给worker运行,每个Executor运行什么Task就是在此处分配的。TaskScheduler维护所有TaskSet,当Executor向Driver发生心跳时,TaskScheduler会根据资源剩余情况分配相应的Task。另外TaskScheduler还维护着所有Task的运行标签,重试失败的Task。
TaskScheduler 原理:
1)DAGScheduler在提交Taskset给底层调度器的时候是面向接口TaskScheduler的,这符合面向对象中依赖抽象原则,带来底层资源调度器的可插拔性, 导致Spark可以运行在众多的资源高度器模式上。例如:Standalone, Yarn, Mesos, local. EC2及其它自定义的资源调度器
2)在SparkContext实例化的时候通过createTaskScheduler来创建 TaskSchedulerImpl和StandaloneSchedulerBackend。在TaskSchedulerImpl的initialize方法中把StandaloneSchedulerBackend 传进来从而赋值给TaskSchedulerImpl的backend;在TaskSchedulerImple调用start方法的时候会调用 backend.start方法。
3)TaskScheduler的核心任务是提交TaskSet到集群运算并汇报结果
   a)为TaskSet创建和维护一个TaskSetManager并追踪任务的本地性以及错误信息;
   b)遇到 Straggle任务会放到其它的节点进行重试。
   c)向DAGScheduler 汇报执行情况,包括在Shuffle输出lost的时候报告fetch failed错误等信息。
4)TaskScheduler内部会握有SchedulerBackend,从Standalone的模式来讲,具体实现是StandaloneSchedulerBackend。
5)StandaloneSchedulerBackend在启动的时候创建StandaloneAppClient实例并在该实例Start的时候启动了ClientEndpoint这个消息循环体,ClientEndpoint在启动的时候会向Master注册当前程序。而StandaloneSchedulerBackend的父类CoarseGrainedSchedulerBackend在start的时候会实例化类型为DriverEndpoint的消息循环体。StandaloneSchedulerBackend专门负责收集Worker上的资源信息。当ExecutorBackend启动的时候会发送RegisteredExecutor信息向DriverEndpoint注册。此时StandaloneSchedulerBackend就掌握了当前应用程序拥有的计算资源,就是通过 StandaloneSchedulerBackend拥有的计算资源来具体运行Task。
6)SparkContext、DAGScheduler、TaskSchedulerImpl、StandaloneSchedulerBackend在应用程序启动的时候只实例化一次,应用程序存在期间始终存在这些对象。

下图展示了 TaskScheduler 的作用:

c8e4fb30909ea30e3f04cc5fb4b05a8a.png

3、Spark 特点!

● 快

与Hadoop的MapReduce相比,Spark基于内存的运算要快100倍以上,
基于硬盘的运算也要快10倍以上。Spark实现了高效的DAG执行引擎,
可以通过基于内存来高效处理数据流。

7bb98a4fe359f58e84dccf3529d5325c.png

● 易用(算法多)

MR只支持一种计算算法,Spark支持多种算法。
Spark支持Java、Python、R和Scala的API,还支持超过80种高级算法,
使用户可以快速构建不同的应用。而且Spark支持交互式的Python和Scala的 shell,
可以非常方便地在这些shell中使用Spark集群来验证解决问题的方法。

07b4edf8256ef40500154fa1bbb91aab.png

● 通用

Spark提供了统一的解决方案。Spark可以用于批处理、交互式查询(Spark SQL)、
实时流处理(Spark Streaming)、机器学习(Spark MLlib)和图计算(GraphX)。
这些不同类型的处理都可以在同一个应用中无缝使用。Spark 统一的解决方案非常具有吸引力,
毕竟任何公司都想用统一的平台去处理遇到的问题,减少开发和维护的人力成本和部署平台的物力成本。

7f9666a5c8412a78b2f743e8ba4e883c.png

● 兼容性

Spark可以非常方便地与其他的开源产品进行融合。比如,Spark可以使用Hadoop的YARN和Apache Mesos作为它的资源管理和调度器,
并且可以处理所有Hadoop支持的数据,包括HDFS、HBase和Cassandra等。
这对于已经部署Hadoop集群的用户特别重要,因为不需要做任何数据迁移就可以使用Spark的强大处理能力。
Spark也可以不依赖于第三方的资源管理和调度器,它实现了Standalone作为其内置的资源管理和调度框架,
这样进一步降低了Spark的使用门槛,使得所有人都可以非常容易地部署和使用 Spark。
此外,Spark还提供了在EC2上部署Standalone的Spark集群的工具。

2dddfdfe427d9977296791926d798335.png

4、Spark 的几种运行模式

1.local 本地模式(单机)–开发测试使用
分为local单线程和local-cluster多线程
2.standalone 独立集群模式–开发测试使用
典型的Mater/slave模式
3.standalone-HA 高可用模式–生产环境使用
基于standalone模式,使用zk搭建高可用,避免Master是有单点故障的
4.on yarn 集群模式–生产环境使用
运行在yarn集群之上,由yarn负责资源管理,Spark负责任务调度和计算,
好处:计算资源按需伸缩,集群利用率高,共享底层存储,避免数据跨集群迁移。
5.on mesos 集群模式–国内使用较少
运行在mesos资源管理器框架之上,由mesos负责资源管理,Spark负责任务调度和计算
6.on cloud 集群模式–中小公司未来会更多的使用云服务
比如AWS的EC2,使用这个模式能很方便的访问Amazon的S3

二、Spark 的三大集群模式详解!(附带各模式部署步骤)

1、standalone 集群模式

1.1 集群角色介绍

standalone 独立集群模式–开发测试使用

Spark是基于内存计算的大数据并行计算框架,
实际中运行计算任务肯定是使用集群模式,
那么我们先来学习Spark自带的standalone集群模式了解一下它的架构及运行机制。
Standalone集群使用了分布式计算中的master-slave模型,
master是集群中含有master进程的节点
slave是集群中的worker节点含有Executor9进程

Spark 架构图如下(先了解):

63d69fc2152bc062c9dc461e2de7711c.png

1.2 集群规划
node01:master
node02:slave/worker
node03:slave/worker
1.3 修改配置并分发

1)修改 Spark 配置文件(进入到自己解压后的 spark 目录下)

cd /export/servers/spark/conf
mv spark-env.sh.template spark-env.sh
vim  spark-env.sh
#配置java环境变量(如果之前配置过了就不需要动了)
export JAVA_HOME=/export/servers/jdk1.8
#指定spark Master的IP
export SPARK_MASTER_HOST=node01
#指定spark Master的端口
export SPARK_MASTER_PORT=7077
mv slaves.template slaves
vim  slaves
node02
node03

2)配置 spark 环境变量 (建议不添加,避免和 Hadoop 的命令冲突)

将spark添加到环境变量,添加以下内容到 /etc/profile
export SPARK_HOME=/export/servers/spark-2.2.0-bin-2.6.0-cdh5.14.0
export PATH=$PATH:$SPARK_HOME/bin

注意:

hadoop/sbin 的目录和 spark/sbin 可能会有命令冲突:
start-all.sh stop-all.sh
解决方案:
1.把其中一个框架的sbin从环境变量中去掉;
2.改名 hadoop/sbin/start-all.sh 改为: start-all-hadoop.sh

3)通过 scp 命令将配置文件分发到其他机器上

scp -r /export/servers/spark node02:/export/servers
scp -r /export/servers/spark node03:/export/servers
scp /etc/profile root@node02:/etc
scp /etc/profile root@node03:/etc
source /etc/profile 刷新配置
1.4 启动和停止

集群启动和停止

在主节点上启动spark集群
/export/servers/spark/sbin/start-all.sh
在主节点上停止spark集群
/export/servers/spark/sbin/stop-all.sh

单独启动和停止

在master安装节点上启动和停止master:
start-master.sh
stop-master.sh
在Master所在节点上启动和停止worker(work指的是slaves配置文件中的主机名)
start-slaves.sh
stop-slaves.sh
1.5 查看 web 界面
正常启动spark集群后,查看spark的web界面,查看相关信息。
http://node01:8080/
1.6 测试

需求

使用集群模式运行Spark程序读取HDFS上的文件并执行WordCount

集群模式启动 spark-shell

/export/servers/spark-2.2.0-bin-2.6.0-cdh5.14.0/bin/spark-shell --master spark://node01:7077

运行程序

sc.textFile("hdfs://node01:8020/wordcount/input/words.txt")
.flatMap(_.split(" ")).map((_, 1)).reduceByKey(_ + _)
.saveAsTextFile("hdfs://node01:8020/wordcount/output2")

SparkContext web UI

http://node01:4040/jobs/

注意

集群模式下程序是在集群上运行的,不要直接读取本地文件,应该读取hdfs上的 因为程序运行在集群上,具体在哪个节点上我们运行并不知道,其他节点可能并没有那个数据文件

2、standalone-HA 高可用模式

2.1 原理
Spark Standalone集群是Master-Slaves架构的集群模式,和大部分的Master-Slaves结构集群一样,存在着Master单点故障的问题。
如何解决这个单点故障的问题,Spark提供了两种方案:
1.基于文件系统的单点恢复(Single-Node Recovery with Local File System)--只能用于开发或测试环境。
2.基于zookeeper的Standby Masters(Standby Masters with ZooKeeper)--可以用于生产环境。

46036104185903538cebcba2eda58dfe.png

2.2 配置 HA

该 HA 方案使用起来很简单,首先启动一个 ZooKeeper 集群,然后在不同节点上启动 Master,注意这些节点需要具有相同的 zookeeper 配置。

1)先停止Sprak集群
/export/servers/spark/sbin/stop-all.sh
2)在node01上配置:
vim /export/servers/spark/conf/spark-env.sh
3)注释掉Master配置
#export SPARK_MASTER_HOST=node01
4)在spark-env.sh添加SPARK_DAEMON_JAVA_OPTS,内容如下:
export SPARK_DAEMON_JAVA_OPTS="-Dspark.deploy.recoveryMode=ZOOKEEPER
-Dspark.deploy.zookeeper.url=node01:2181,node02:2181,node03:2181
-Dspark.deploy.zookeeper.dir=/spark"
参数说明
spark.deploy.recoveryMode:恢复模式
spark.deploy.zookeeper.url:ZooKeeper的Server地址
spark.deploy.zookeeper.dir:保存集群元数据信息的文件、目录。包括Worker、Driver、Application信息。
2.3 启动 zk 集群
zkServer.sh status
zkServer.sh stop
zkServer.sh start
2.4 启动 Spark 集群
1)node01上启动Spark集群执行
/export/servers/spark/sbin/start-all.sh
2)在node02上再单独只起个master:
/export/servers/spark/sbin/start-master.sh
3)注意:
在普通模式下启动spark集群
只需要在主节点上执行start-all.sh 就可以了
在高可用模式下启动spark集群
先需要在任意一台主节点上执行start-all.sh
然后在另外一台主节点上单独执行start-master.sh
4)查看node01和node02
http://node01:8080/
http://node02:8080/
可以观察到有一台状态为StandBy
2.5 测试 HA
测试主备切换
1)在node01上使用jps查看master进程id
2)使用kill -9 id号强制结束该进程
3)稍等片刻后刷新node02的web界面发现node02为Alive

e167da492fef08ff314c7531076e166b.png

2.6 测试集群模式提交任务
1.集群模式启动spark-shell
/export/servers/spark/bin/spark-shell --master
spark://node01:7077,node02:7077
2.运行程序
sc.textFile("hdfs://node01:8020/wordcount/input/words.txt")
.flatMap(_.split(" ")).map((_, 1)).reduceByKey(_ + _)
.saveAsTextFile("hdfs://node01:8020/wordcount/output3")

3、 on yarn 集群模式

官方文档http://spark.apache.org/docs/latest/running-on-yarn.html

3.1 准备工作
1.安装启动Hadoop(需要使用HDFS和YARN,已经ok)
2.安装单机版Spark(已经ok)
注意:不需要集群,因为把Spark程序提交给YARN运行本质上是把字节码给YARN集群上的JVM运行,
但是得有一个东西帮我去把任务提交上个YARN,所以需要一个单机版的Spark,
里面的有spark-shell命令,spark-submit命令
3.修改配置:
在spark-env.sh ,添加HADOOP_CONF_DIR配置,指明了hadoop的配置文件的位置
vim /export/servers/spark/conf/spark-env.sh
export HADOOP_CONF_DIR=/export/servers/hadoop/etc/hadoop
3.2 cluster 模式
1)说明
在企业生产环境中大部分都是cluster部署模式运行Spark应用
Spark On YARN的Cluster模式 指的是Driver程序运行在YARN集群上
2)补充Driver是什么:
运行应用程序的main()函数并创建SparkContext的进程
3)图解

0bd51011ee40b3325e029384e8c2441f.png

4)运行示例程序
 spark-shell是一个简单的用来测试的交互式窗口
spark-submit用来提交打成jar包的任务
/export/servers/spark-2.2.0-bin-2.6.0-cdh5.14.0/bin/spark-submit \
--class org.apache.spark.examples.SparkPi \
--master yarn \
--deploy-mode cluster \
--driver-memory 1g \
--executor-memory 1g \
--executor-cores 2 \
--queue default \
/export/servers/spark-2.2.0-bin-2.6.0-cdh5.14.0/examples/jars/spark-examples_2.11-2.2.0.jar \
10
5)查看界面
http://node01:8088/cluster

983f0746338cf0f01ba2c3b8e02cbb40.png

3.3 client 模式[了解]
1)说明
学习测试时使用,开发不用,了解即可
Spark On YARN的Client模式 指的是Driver程序运行在提交任务的客户端
2)图解

410c567cd7279c4de72df57bf324ced8.png

3)运行示例程序
/export/servers/spark-2.2.0-bin-2.6.0-cdh5.14.0/bin/spark-submit \
--class org.apache.spark.examples.SparkPi \
--master yarn \
--deploy-mode client \
--driver-memory 1g \
--executor-memory 1g \
--executor-cores 2 \
--queue default \
/export/servers/spark-2.2.0-bin-2.6.0-cdh5.14.0/examples/jars/spark-examples_2.11-2.2.0.jar \
10
3.4 两种模式的区别

Cluster 和 Client 模式最本质的区别是:Driver 程序运行在哪里!

运行在YARN集群中就是Cluster模式,
运行在客户端就是Client模式

当然还有由本质区别延伸出来的区别,面试的时候能简单说出几点就行

cluster模式:生产环境中使用该模式
1.Driver程序在YARN集群中
2.应用的运行结果不能在客户端显示
3.该模式下Driver运行ApplicattionMaster这个进程中,如果出现问题,yarn会重启ApplicattionMaster(Driver)
client模式:
1.Driver运行在Client上的SparkSubmit进程中
2.应用程序运行结果会在客户端显示
相关文章
|
6月前
|
运维 前端开发 安全
万字长文搞懂产品模式和项目模式
万字长文搞懂产品模式和项目模式
70 0
|
6月前
|
消息中间件 分布式计算 Kafka
Spark面试干货总结!(8千字长文、27个知识点、21张图)
Spark面试干货总结!(8千字长文、27个知识点、21张图)
141 1
|
9月前
|
信息无障碍 C++
万字长文,深度分析 c++的前景
万字长文,深度分析 c++的前景
89 0
|
分布式计算 资源调度 并行计算
5万字长文!搞定Spark方方面面(二)
5万字长文!搞定Spark方方面面
245 0
5万字长文!搞定Spark方方面面(二)
|
SQL 分布式计算 HIVE
5万字长文!搞定Spark方方面面(五)
5万字长文!搞定Spark方方面面
124 0
|
存储 缓存 分布式计算
5万字长文!搞定Spark方方面面(三)
5万字长文!搞定Spark方方面面
117 0
5万字长文!搞定Spark方方面面(三)
|
SQL 分布式计算 监控
5万字长文!搞定Spark方方面面(六)
5万字长文!搞定Spark方方面面
174 0
5万字长文!搞定Spark方方面面(六)
|
消息中间件 存储 分布式计算
5万字长文!搞定Spark方方面面(七)
5万字长文!搞定Spark方方面面
184 0
5万字长文!搞定Spark方方面面(七)
|
SQL JSON 分布式计算
5万字长文!搞定Spark方方面面(四)
5万字长文!搞定Spark方方面面
194 0
5万字长文!搞定Spark方方面面(四)
|
存储 SQL JSON