1.Spark框架概述
Apache Spark时用于大规模数据处理的统一分析引擎
Spark相对于Hadoop有着巨大的优势,但Spark并不能完全替代Hadoop
- 在计算层面,Spark相较于MR有着巨大的性能优势,但至今仍有许多计算工具基于MR框架,比如Hive
- Spark仅做计算,而Hadoop生态圈不仅有计算(MR)也有存储(HDFS)和资源调度(YARN),HDFS和YARN仍是许多大数据体系的核心架构
Spark特点
- 速度快:Spark支持内存计算,并用过有向无环图执行引擎支持无环数据流,所以官方宣称在内存中运算速度要比Hadoop的MR快100倍,在硬盘中快10倍。Spark处理数据时,可以将中间处理结果存储到内存中;Spark提供了非常丰富的算子(API),可以做到复杂任务的一个Spark程序中完成。
- 易于使用:Spark支持包括java、scala、python、R和SQL语言在内的多种语言
- 通用性强:在Spark的基础上,Spark提供了包括Spark SQL、Spark Streaming、MLib及Graphx在内的多个工具库,可以在一个应用中无缝地使用这些工具库
- 运行方式多:Spark支持多种运行方式,包括Hadoop和Mesos上也支持Standalone的独立运行模式,同时也可以运行在云K8s(Spark2.3开始)上
Spark框架模块(了解)
整个Spark框架模块包括:Spark Core、Spark SQL、Spark Streaming、Spark GraphxX、Spark MLlib,后四项的能力都是建立在Spark Core上的
Spark以RDD为数据抽象,提供Python、Java、Scala、R语言的API,可以编程进行海量离线数据批处理计算
SparkSQL提供结构化数据的处理模块。SparkSQL支持以SQL语言对数据进行处理,SparkSQL本身针对离线计算场景。同时基于SparkSQL,spark提供了StructuredStreaming模块,可以在SparkSQL为基础,进行数据的流式计算
SparkStreaming:提供数据的流式计算
MLlib:进行及其学习计算,内置大量的机器学习库和API
GraphX:进行图计算,提供大量的图计算API,方便用以分布式计算模式进行图计算
Spark的运行模式(了解)
Spark提供多种运行模式,包括:本地模式(单机)、Standalone模式(集群)、Hadoop YARN模式(集群)、K8s模式(容器集群)、云服务模式(运行在云平台上)
Spark的架构角色(理解)
Spark运行角色
Spark中由4个角色组成整个Spark的运行环境
Master角色,管理整个集群的资源,类比于YARN的ResouceManager
Worker角色,管理单个服务器的资源,类比于YARN的NodeManger
Driver角色,管理单个Spark任务在运行的时候的工作,类比于YARN的ApplicationMaster
Executor角色,单个任务运行的时候的一堆工作者,类比于YARN容器运行的TASK
从2个层面划分:
资源管理层面:
管理者:Spark是Master角色
工作中:Spark是Worker角色
从任务执行层面:
某任务管理者:Spark是Driver角色
某任务执行者:Spark是Executor角色
注:正常情况下Executor是干活的角色,不过在特殊场景下(local模式)Driver可以即管理又干活
2.Spark运行环境
2.1 Local
基本原理
本质:启动一个JVM Process进程(一个进程里面有多个线程),执行任务Task
Local模式可以限制模拟Spark集群环境的线程数量,即Local[N]或Local[]
其中N代表使用N个线程,不指定默认为1;Local[]代表按照cpu的Cores设置线程数
角色分部:
资源管理:
Master:Local进程本身
Worker:Local进程本身
执行时:
Driver:Local进程本身(可以算做一种特殊的Executor)
Executor:不存在
注:由于时间关系,不进行环境搭建
2.2 Standalone
Standalone模式是Spark自带的一种集群模式,不同于本地模式启动多个进程来模拟集群的环境,Standalone模式是真实地在多个及其之间搭建Spark集群的环境没完全可以利用该模式搭建多机器集群,用于实际的大数据处理。
StandAlone是完整的Spark运行环境,其中:
Master角色以Master进程存在,Worker角色以Worker进程存在
Driver角色在运行时存在于Master进程内,Executor运行于Worker进程内
2.3 Spark程序运行层次结构
监控页面有不同的端口,不如4040,8080,18080
4040是一个运行的Application在运行的过程中临时绑定的端口,用以查看当前任务的状态,4040被占会顺延到4041,4042等;4040是一个临时端口,当程序运行完成后,4040会被注销
8080:默认是StandAlone下,Master角色在WEB端口,用以查看当前Master的状态
18080:默认是历史服务器的端口,由于每个程序运行完成后,4040端口就被注销了,在以后想要看某个程序运行状态就可以通过历史服务器查看,历史服务器长期稳定运行,可供随时查看被记录的运行程序。
2.4 StandAlone HA
Spark Standalone集群是Master-Slaves加噶偶的集群模式,和大部分的Master-Slaves结构集群一样,存在着Master单点故障(SPOF)的问题
Spark解决单点故障的两个方案:
1.基于文件系统的单点恢复——只能用于开发或测试环境
2.基于zookeeper的Standby Masters——可以用于生产环境
StandAlone HA的原理
基于Zookeeper做状态的维护,开启多个Master进程,一个作为活跃,其他的作为备份,当活跃进程宕机,备份Master进行接管
跳过环境搭建
2.5 Spark on YARN
对于企业来说,在已经有YARN集群的亲体下在单独准备Spark StandAlone集群对资源的利用率就不高,在企业中,多数场景会将Spark运行在YARN集群中
对于Spark on YARN,无需部署Spark集群,只要找到一台服务器,充当Spark的客户端,即可提交任务到YARN集群中运行
Spark on YARN的本质
Master角色由YARN的ResourceManager担任
Worker角色由YARN的NodeManager担任
Driver角色运行在YARN容器内部或提交任务的客户端进程中
Executor运行在YARN提供的容器内部
Spark on YARN需要啥
1.需要Yarn集群
2.需要Spark客户端工具,比如spark-submit,可以将Spark程序提交到YARN中
3.需要被提交的代码程序
部署模式DeployMode
Spark on YARN是有两种运行模式,一种是Cluster模式另一种是Client模式
这两种模式的区别就是Driver运行的位置:Cluster模式中Driver运行在YARN容器内部和ApplicationMaster在同一容器内;Client模式中Driver运行在客户端进程中,比如Driver运行在spark-submit程序的进程中
Client模式:学习测试使用,输出结果会在客户端显示
Cluster模式:生产环境中使用该模式
3.PySpark
3.1 框架 vs 类库
类库:别人写好的代码,导入就可以使用,比如Pandas
框架:可以独立运行,并提供变成结构一的一种软件产品,Spark就是一个独立的框架
pandas用于小规模数据集的处理
spark用于大规模数据集的处理
3.2 什么是PySpark
bin/pyspark只是一个应用程序,提供python解释器执行环境来运行Spark任务
而PySpark值得是Python的运行类库,可以在Python代码中:import pyspark
PySpark是Spark官方提供的一个Pyhon类库,内置了完全的Spark API,可以通过PySpark类库来编写Spark应用程序,并将其调教到Spark集群中运行
安装PySpark
pip install pyspark
或
conda install pyspark
3.3 应用入口:SparkContext
Spark Application程序入口为:SparkContext,在任何一个应用首先需要构建SparkContext对象
conf = SparkConf().setAppName(appName).setMaster(master)
sc = SparkContext(conf=conf)
测试
from pyspark import SparkConf, SparkContext
import os
os.environ["PYSPARK_PYTHON"] = r"D:\anaconda\envs\spark\Lib\site-packages\pyspark\python.exe"
if __name__ == '__main__':
# 如果要拷给到服务器中运行,则删除.setMaster("local[*]")
conf = SparkConf().setMaster("local[*]").setAppName("WordCountHelloWorld")
# 通过SparkConf对象构建SparkContext对象
sc = SparkContext(conf = conf)
# 需求:wordcount单词计数,读取HDFS上的words.txt文件对其内部的单词统计出现的数量
# 读取文件
file_rrd = sc.textFile("hdfs://node1:8020/input/words.txt")
# 将单词进行切割,得到一个存储全部单侧的集合对象
words_rdd = file_rrd.flatMap(lambda line: line.split(" "))
# 将单词转换为元组对象,key是单词,value是数字1
words_with_one_rdd = words_rdd.map(lambda x: (x, 1))
# 将元组的value 按key来分组,对所有的value执行聚合操作(相加)
result_rdd = words_with_one_rdd.reduceByKey(lambda a, b: a + b)
# 通过collect方法收集RDD的数据打印输出结果
print(result_rdd.collect())
Python on Spark执行原理
PySpark总之是在不破坏Spark已有的运行时架构,在Spark架构外包装一层Python API,借助Py5j实现Python和Java的交换,进而实现通过Python编写Spark应用程。