SparkBase

#博学谷IT学习技术支持#

1.Spark 框架概述

1.1 Spark 是什么

定义:Apache Spark是用于大规模数据(large-scala data)处理的统一(unified)分析引擎。

Spark 最早源于一篇论文 Resilient Distributed Datasets: A Fault-Tolerant Abstraction for In-Memory Cluster Computing,该论文是由加州大学柏克莱分校的 Matei Zaharia 等人发表的。论文中提出了一种弹性分布式数据集(即 RDD)的概念。

翻译过来就是:RDD 是一种分布式内存抽象,其使得程序员能够在大规模集群中做内存运算,并且有一定的容错方式。而这也是整个 Spark 的核心数据结构,Spark 整个平台都围绕着RDD进行。

简而言之,Spark 借鉴了 MapReduce 思想发展而来,保留了其分布式并行计算的优点并改进了其明显的缺陷。让中间数据存储在内存中提高了运行速度、并提供丰富的操作数据的API提高了开发速度。

为什么Spark框架会如何的快呢?

1)数据结构(编程模型):Spark框架核心

RDD:弹性分布式数据集,认为是列表List

Spark 框架将要处理的数据封装到集合RDD中,调用RDD中函数处理数据

RDD 数据可以放到内存中,内存不足可以放到磁盘中

2)Task任务运行方式:以线程Thread方式运行

MapReduce中Task是以进程Process方式运行,当时Spark Task以线程Thread方式运行。

线程Thread运行在进程Process中,启动和销毁是很快的(相对于进程来说)。

1.3 扩展:Spark VS Hadoop

为什么Spark框架会如此的快呢?

尽管Spark相对于Hadoop而言具有较大优势,但Spark并不能完全替代Hadoop

  • Spark主要用于替代Hadoop中的MapReduce计算模型。存储依然可以使用HDFS,但是中间结果可以存放在内存中;

  • Spark已经很好地融入了Hadoop生态圈,并成为其中的重要一员,它可以借助于YARN实现资源调度管理,借助于HDFS实现分布式存储。

面试题:Hadoop的基于进程的计算和Spark基于线程方式优缺点?

答案:Hadoop中的MR中每个map/reduce task都是一个java进程方式运行,好处在于进程之间是互相独立的,每个task独享进程资源,没有互相干扰,监控方便,但是问题在于task之间不方便共享数据,执行效率比较低。比如多个map task读取不同数据源文件需要将数据源加载到每个map task中,造成重复加载和浪费内存。而基于线程的方式计算是为了数据共享和提高执行效率,Spark采用了线程的最小的执行单位,但缺点是线程之间会有资源竞争。

【扩展阅读】:线程基本概念

线程是CPU的基本调度单位
一个进程一般包含多个线程, 一个进程下的多个线程共享进程的资源
不同进程之间的线程相互不可见
线程不能独立执行
一个线程可以创建和撤销另外一个线程
1.4 Spark 四大特点

Spark 使用Scala语言进行实现,它是一种面向对象、函数式编程语言,能够像操作本地集合一样轻松的操作分布式数据集。Spark具有运行速度快、易用性好、通用性强和随处运行等特点。

速度快

由于Apache Spark支持内存计算,并且通过DAG(有向无环图)执行引擎支持无环数据流,所以官方宣称其在内存中的运算速度要比Hadoop的MapReduce快100倍,在硬盘中要快10倍。

Spark处理数据与MapReduce处理数据相比,有如下两个不同点:

  • 其一、Spark处理数据时,可以将中间处理结果数据存储到内存中;

  • 其二、Spark Job调度以DAG方式,并且每个任务Task执行以线程(Thread)方式,并不是像MapReduce以进程(Process)方式执行。

易于使用

Spark 的版本已经更新到 Spark 3.1.2(截止日期2021.06.01),支持了包括 Java、Scala、Python 、R和SQL语言在内的多种语言。为了兼容Spark2.x企业级应用场景,Spark仍然持续更新Spark2版本。

通用性强

在 Spark 的基础上,Spark 还提供了包括Spark SQL、Spark Streaming、MLib 及GraphX在内的多个工具库,我们可以在一个应用中无缝地使用这些工具库。

运行方式

Spark 支持多种运行方式,包括在 Hadoop 和 Mesos 上,也支持 Standalone的独立运行模式,同时也可以运行在云Kubernetes(Spark 2.3开始支持)上。

对于数据源而言,Spark 支持从HDFS、HBase、Cassandra 及 Kafka 等多种途径获取数据。

1.5 Spark 框架模块-了解

整个Spark 框架模块包含:Spark Core、 Spark SQL、 Spark Streaming、 Spark GraphX、 Spark MLlib,而后四项的能力都是建立在核心引擎之上

整个Spark 框架通信采用模块:netty

什么是RPC:https://www.jianshu.com/p/2accc2840a1b

lSpark 1.6,引入了Netty。

lSpark 2.0之后,完全使用Netty,并把akka移除了。

2.Spark环境-Local

基本原理

Local模式就是常用于本地开发测试,本地还分为local单线程和local-cluster多线程;

本质:启动一个JVM Process进程(一个进程里面有多个线程),执行任务Task

  • 该模式被称为Local[N]模式,是用单机的多个线程来模拟Spark分布式计算,直接运行在本地,便于调试,通常用来验证开发出来的应用程序逻辑上有没有问题。

  • 通常Cpu有几个Core,就指定几个线程,最大化利用计算能力.

  • 其中N代表可以使用N个线程,每个线程拥有一个cpu core。如果不指定N,则默认是1个线程(该线程有1个core)。

  • 如果是local[*],则代表 Run Spark locally with as many worker threads as logical cores on your machine.按照Cpu最多的Cores设置线程数

3.PySpark

Spark框架自带的案例Example中涵盖圆周率PI计算程序,可以使用【$SPARK_HOME/bin/spark-submit】提交应用执行,运行在本地模式。

 
SPARK_HOME=/export/server/spark
${SPARK_HOME}/bin/spark-submit \
--master local[2] \
${SPARK_HOME}/examples/src/main/python/pi.py \
10

(1)基本语法

 

bin/spark-submit \  
--class <main-class> --class: 你的应用的启动类
--master <master-url> \--master 指定Master的地址
--executor-memory 1G   \指定每个executor可用内存为1G
--total-executor-cores 2   \指定每个executor使用的cup核数为2个
--deploy-mode <deploy-mode> \--deploy-mode: 是否发布你的驱动到worker节点
--py-files XXXX.zip \ .py、.egg或者.zip文件的逗号分隔列表,包括Python应用程序,这些文件将被交付给每一个执行器来使用。
--conf <key>=<value> \--conf: 任意的Spark配置属性, 格式key=value.
... # other options
<application-jar> \打包好的应用jar,包含依赖. 
[application-arguments]传给main()方法的参数

(2)参数说明:

 
--master 指定Master的地址,默认为Local
--class: 你的应用的启动类 (如 org.apache.spark.examples.SparkPi)
--deploy-mode: 是否发布你的驱动到worker节点(cluster) 或者作为一个本地客户端 (client) (default: client)
--conf: 任意的Spark配置属性, 格式key=value. 如果值包含空格,可以加引号“key=value” 
application-jar: 打包好的应用jar,包含依赖. 这个URL在集群中全局可见。 比如hdfs:// 共享存储系统, 如果是 file:// path, 那么所有的节点的path都包含同样的jar
application-arguments: 传给main()方法的参数
--executor-memory 1G 指定每个executor可用内存为1G
--total-executor-cores 2 指定每个executor使用的cup核数为2个

4.环境搭建-Standalone

4.1 Standalone 架构

Standalone模式是Spark自带的一种集群模式,不同于前面本地模式启动多个进程来模拟集群的环境,Standalone模式是真实地在多个机器之间搭建Spark集群的环境,完全可以利用该模式搭建多机器集群,用于实际的大数据处理。

Standalone集群使用了分布式计算中的master-slave模型,master是集群中含有Master进程的节点,slave是集群中的Worker节点含有Executor进程。

http://spark.apache.org/docs/latest/cluster-overview.html

Spark Standalone集群,类似Hadoop YARN,管理集群资源和调度资源:

  • 主节点Master:

  • 管理整个集群资源,接收提交应用,分配资源给每个应用,运行Task任务

  • 从节点Workers:

  • 管理每个机器的资源,分配对应的资源来运行Task;

  • 每个从节点分配资源信息给Worker管理,资源信息包含内存Memory和CPU Cores核数

  • 历史服务器HistoryServer(可选):

  • Spark Application运行完成以后,保存事件日志数据至HDFS,启动HistoryServer可以查看应用运行相关信息。

4.3 测试
 
Pyspark shell脚本:
/export/server/spark/bin/pyspark --master spark://node1:7077 \
--conf "spark.pyspark.driver.python=/root/anaconda3/bin/python3" \ 
--conf "spark.pyspark.python=/root/anaconda3/bin/python3"    

提交运行圆周率

将上述运行在Local Mode的圆周率PI程序,运行在Standalone集群上,修改【--master】地址为Standalone集群地址:spark://node1:7077,具体命令如下

 
${SPARK_HOME}/bin/spark-submit \
--master spark://node1:7077 \
--conf "spark.pyspark.driver.python=/root/anaconda3/bin/python3" \
--conf "spark.pyspark.python=/root/anaconda3/bin/python3" \
${SPARK_HOME}/examples/src/main/python/pi.py \
10
4.4 Spark 应用架构

从图中可以看到Spark Application运行到集群上时,由两部分组成:Driver Program和Executors。

  • 第一、Driver Program

  • 相当于AppMaster,整个应用管理者,负责应用中所有Job的调度执行;

  • 运行JVM Process,运行程序的MAIN函数,必须创建SparkContext上下文对象;

  • 一个SparkApplication仅有一个;

  • 第二、Executors

  • 相当于一个线程池,运行JVM Process,其中有很多线程,每个线程运行一个Task任务,一个Task任务运行需要1 Core CPU,所有可以认为Executor中线程数就等于CPU Core核数;

  • 一个Spark Application可以有多个,可以设置个数和资源信息;

用户程序从最开始的提交到最终的计算执行,需要经历以下几个阶段:

  • 1)、用户程序创建 SparkContext 时,新创建的 SparkContext 实例会连接到 ClusterManager。 Cluster Manager 会根据用户提交时设置的 CPU 和内存等信息为本次提交分配计算资源,启动 Executor。

  • 2)、Driver会将用户程序划分为不同的执行阶段Stage,每个执行阶段Stage由一组完全相同Task组成,这些Task分别作用于待处理数据的不同分区。在阶段划分完成和Task创建后, Driver会向Executor发送 Task;

  • 3)、Executor在接收到Task后,会下载Task的运行时依赖,在准备好Task的执行环境后,会开始执行Task,并且将Task的运行状态汇报给Driver;

  • 4)、Driver会根据收到的Task的运行状态来处理不同的状态更新。 Task分为两种:一种是Shuffle Map Task,它实现数据的重新洗牌,洗牌的结果保存到Executor 所在节点的文件系统中;另外一种是Result Task,它负责生成结果数据;

  • 5)、Driver 会不断地调用Task,将Task发送到Executor执行,在所有的Task 都正确执行或者超过执行次数的限制仍然没有执行成功时停止;

WEB UI 监控

Spark 提供了多个监控界面,当运行Spark任务后可以直接在网页对各种信息进行监控查看。运行spark-shell交互式命令在Standalone集群上,命令如下:

/export/server/spark/bin/spark-shell --master spark://node1.itcast.cn:7077 

在node1运行pyspark-shell,WEB UI监控页面地址:http://node1:4040

还可以发现在一个Spark Application中,包含多个Job,每个Job有多个Stage组成,每个Job执行按照DAG图进行的。

其中每个Stage中包含多个Task任务,每个Task以线程Thread方式执行,需要1Core CPU。

Spark Application程序运行时三个核心概念:Job、Stage、Task,说明如下:

  • Task:被分配到各个 Executor 的单位工作内容,它是 Spark 中的最小执行单位,一般来说有多少个 Paritition(物理层面的概念,即分支可以理解为将数据划分成不同部分并行处理),就会有多少个 Task,每个 Task 只会处理单一分支上的数据。

  • Job:由多个 Task 的并行计算部分,一般 Spark 中的 action 操作(如 save、collect,后面进一步说明),会生成一个 Job。

  • Stage:Job 的组成单位,一个 Job 会切分成多个 Stage,Stage 彼此之间相互依赖顺序执行,而每个 Stage 是多个 Task 的集合,类似 map 和 reduce stage。

5.Standalone HA

5.1 高可用HA

Spark Standalone集群是Master-Slaves架构的集群模式,和大部分的Master-Slaves结构集群一样,存在着Master单点故障(SPOF)的问题。

如何解决这个单点故障的问题,Spark提供了两种方案:

  • 1.基于文件系统的单点恢复(Single-Node Recovery with Local File System)--只能用于开发或测试环境。

  • 2.基于zookeeper的Standby Masters(Standby Masters with ZooKeeper)--可以用于生产环境。

  • ZooKeeper提供了一个Leader Election机制,利用这个机制可以保证虽然集群存在多个Master,但是只有一个是Active的,其他的都是Standby。当Active的Master出现故障时,另外的一个Standby Master会被选举出来。由于集群的信息,包括Worker, Driver和Application的信息都已经持久化到文件系统,因此在切换的过程中只会影响新Job的提交,对于正在进行的Job没有任何的影响。加入ZooKeeper的集群整体架构如下图所示。

官方文档:http://spark.apache.org/docs/3.1.2/spark-standalone.html#standby-masters-with-zookeeper

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值