1、什么是Spark:
1、Spark是一个开源的分布式计算系统,是致力于快速的分析数据
2、总结来说就是专门为大规模数据处理而设计的快速通用的计算引擎
3、Spark可以完成各种运算,例如SQL查询,文本分析,机器学习等。
4、Spark是由Scala语言开发的,与Scala紧密结合。
2、Spark的组成部分:
1、Spark Core (核心底层部分):
(1)、是基于RDD
(2)、支持多种语言(Java、R、python、Scala、SQL等语言)
2、Spark SQL
(1)、基于dataframe
(2)、结构化数据查询
3、Spark Streming 流处理
4、Spark MLLib 机器学习
5、Spark Graphx 图计算
3、对于Spark和MapReduce的对比(为什么Spark的速度要比MapReduce的速度要快?)
1、MapReduce慢的原因:
(1)、额外的复制,会不断的取读取hdfs中文件,导致速度会变慢
(2)、序列化,频繁的写磁盘,中间会产生序列化
(3)、磁盘的IO开销,基于磁盘计算,不断的写,写完再存,存完再取,也会导致速度很慢。
(4)、细粒度资源调度(每执行一次任务就需要申请资源称为细粒度资源调度)
2、Spark快的原因:
(1)、Spark时基于内存的
(2)、DAG有向无环图
(3)、粗粒度调度资源(一次性将所需要的资源全部申请称为粗粒度资源调度,缺点:只有等所有的任务全部完成,才会释放资源,就会造成资源的浪费)
spark的搭建:
4、Spark的部署方式(支持多种部署方式)(Spark Core 阶段):
1、Local模式:
1、主要用于本地开发测试
2、由本地提供资源
3、可以设置线程数:local , local[4] , local[*
1、Local本地模式的环境搭建:
1、创建maven项目
2、在idea中安装scala插件
// 导入依赖:因为saprk是在scala的基础之上,所以对于scala的依赖也需要导入,需要在idea下载scala的插件
<dependency>
<groupId>org.scala-lang</groupId>
<artifactId>scala-library</artifactId>
<version>2.12.10</version>
</dependency>
<dependency>
<groupId>org.scala-lang</groupId>
<artifactId>scala-compiler</artifactId>
<version>2.12.10</version>
</dependency>
<dependency>
<groupId>org.scala-lang</groupId>
<artifactId>scala-reflect</artifactId>
<version>2.12.10</version>
</dependency>
//在pom.xml中添加Scala编译插件
<plugin>
<groupId>org.scala-tools</groupId>
<artifactId>maven-scala-plugin</artifactId>
<version>2.15.2</version>
<executions>
<execution>
<goals>
<goal>compile</goal>
<goal>testCompile</goal>
</goals>
</execution>
</executions>
</plugin>
//在pom.xml文件中添加Spark-Core依赖
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-core_2.12</artifactId>
<version>3.1.3</version>
</dependency>
2、Standalone模式(主从架构):
1、独立运行模式
2、自带完整的资源管理服务
3、可单独部署到一个集群中
4、无需依赖任何其他资源管理系统
5、主从架构:Master/Worker
6、支持两种任务提交方式 Cluster:适用于生产环境 Client:适用于交互、调试
Standalone模式环境搭建:
1、上传解压,并修改名称:
tar -zxvf spark-3.1.3-bin-without-hadoop.tgz -C /usr/local/soft
mv spark-3.1.3-bin-without-hadoop spark-3.1.3
2、修改配置文件:
# 重命名文件
cp spark-env.sh.template spark-env.sh
cp workers.template workers
3、增加配置:vim spark-env.sh
export SPARK_MASTER_HOST=master
export SPARK_MASTER_PORT=7077
export SPARK_WORKER_CORES=1
export SPARK_WORKER_MEMORY=2g
export JAVA_HOME=/usr/local/soft/jdk1.8.0_171
export SPARK_DIST_CLASSPATH=$(/usr/local/soft/hadoop-3.1.1/bin/hadoop classpath)
4、增加节点配置:vim workers
以node1和node2作为节点
vim workers
node1
node2
5、复制到其他节点:
cd /usr/local/soft/
scp -r spark-3.1.3 node1:`pwd`
scp -r spark-3.1.3 node2:`pwd`
6、配置环境变量:vim /etc/profile,配置完成后需要进行source /etc/profile
7、在主节点执行启动命令:
注意:需要切换到sbin目录下,start-all.sh 与Hadoop的sbin目录中的启动命令有冲突
cd /usr/local/soft/spark-3.1.3/sbin/start-all.sh
8、访问Spark Web UI
http://master:8080/
9、测试
切换目录:cd /usr/local/soft/spark-3.1.3/examples/jars
两种模式:
1、standalone client模式:日志在本地输出,一般用于上线前测试
spark-submit --class org.apache.spark.examples.SparkPi --master spark://master:7077 --executor-memory 512m --total-executor-cores 1 --deploy-mode client spark-examples_2.12-3.1.3.jar 100
--executor-memory:指定每一个executor可用内存
--total-executor-cores:指定所有executor使用的cpu核数
--executor-cores:指定每一个executor使用的cpu核数
2、standalone cluster模式:上线使用,不会在本地打印日志缺点
spark-submit --class org.apache.spark.examples.SparkPi --master spark://master:7077 --executor-memory 512M --total-executor-cores 1 --deploy-mode cluster spark-examples_2.12-3.1.3.jar 100
两种模式的最主要的区别就是Driver端的启动位置不同,client是在运行master节点运行,然而对于cluster是在worker端随机选择一个运行。
10、在Standdlone中还有一张方式:Spark shell,提供的是一种交互式命令行,可以直接写代码:
spark-shell --master spark://master:7077
3、 ON YARN模式
1、将Spark程序提交到Yarn上运行
2、由Yarn负责管理维护资源
3、不需要额外构建Spark集群
4、支持两种任务提交方式: Cluster:适用于生产环境 Client:适用于上线前的测试
ON YARN模式的环境搭建:
第一步:停止Spark Standalone集群模式
# 切换目录
cd /usr/local/soft/spark-3.1.3/
# 停止集群
./sbin/stop-all.sh
第二步:增加hadoop的配置文件地址
vim spark-env.sh
# 增加HADOOP_CONF_DIR
export HADOOP_CONF_DIR=/usr/local/soft/hadoop-3.1.1/etc/hadoop
第三步:关闭yarn
stop-yarn.sh
第四步:修改yarn配置
cd /usr/local/soft/hadoop-3.1.1/etc/hadoop/
vim yarn-site.xml
# 加入如下配置
<property>
<name>yarn.nodemanager.pmem-check-enabled</name>
<value>false</value>
</property>
<property>
<name>yarn.nodemanager.vmem-check-enabled</name>
<value>false</value>
</property>
第五步:同步到其他节点
scp -r yarn-site.xml node1:`pwd`
scp -r yarn-site.xml node2:`pwd`
第六步:启动yarn
start-yarn.sh
第七步:测试
切换目录:cd /usr/local/soft/spark-3.1.3/examples/jars
两种运行模式:
1、Spark on Yarn Client模式:
spark-submit --master yarn --deploy-mode client --class org.apache.spark.examples.SparkPi --executor-memory 512M --num-executors 2 spark-examples_2.12-3.1.3.jar 100
2、Spark on Yarn Cluster模式:
spark-submit --master yarn --deploy-mode cluster --class org.apache.spark.examples.SparkPi --executor-memory 512M --num-executors 2 spark-examples_2.12-3.1.3.jar 100
获取yarn程序执行日志 执行成功之后才能获取到
yarn logs -applicationId application_1696862869049_0001
最后一步:开启Spark On Yarn的WEB UI
修改配置文件:
# 切换目录
cd /usr/local/soft/spark-3.1.3/conf
# 去除后缀
cp spark-defaults.conf.template spark-defaults.conf
# 修改spark-defaults.conf
vim spark-defaults.conf
# 加入以下配置,历史服务器日志
spark.eventLog.enabled true
spark.eventLog.dir hdfs://master:9000/user/spark/applicationHistory
spark.yarn.historyServer.address master:18080
spark.eventLog.compress true
spark.history.fs.logDirectory hdfs://master:9000/user/spark/applicationHistory
spark.history.retainedApplications 15
创建HDFS目录用于存储Spark History日志
hdfs dfs -mkdir -p /user/spark/applicationHistory
启动Spark History Server
cd /usr/local/soft/spark-3.1.3/sbin/start-history-server.sh
5、Spark任务架构:
1、Driver
Driver 是一个 JVM 进程,
负责执行 Spark 任务的 main 方法
执行用户提交的代码,创建 SparkContext 或者 SparkSession
将用户代码转化为 Spark 任务(Jobs)创建血缘(Lineage),逻辑计划(Logical Plan)和物理计划(Physical Plan)
在 Cluster Manager 的辅助下,把 task 任务分发调度出去
跟踪任务的执行情况,收集日志
2、Spark Context/Session
它是由 Spark driver 创建,每个 Spark 应用对应一个程序和集群交互的入口可以连接到 Cluster Manager
3、Cluster Manager
负责部署整个 Spark 集群,包括上面提到的 driver 和 executors,具有以下几种常见的部署模式:
Standalone
YARN
Mesos
Kubernetes
主要维护的信息包括:worker的节点状况,worker节点的位置,worker节点的内存
4、Executor
一个创建在 worker 节点的进程
一个 Executor 有多个 slots(线程)
一个 slot 就是一个线程,对应了一个 task
可以并发执行多个 tasks
负责执行 Spark 任务,把结果返回给 Driver
可以将数据缓存到 worker 节点的内存
Driver就是来负责任务的分配,然而对于Executor是负责来执行任务,并将结果返回给Driver,RDD是直接换存在Executer中。
一个行为算子会触发一个job,一个job包含多个stage,一个stage是多个可以并行执行的task,task的数量跟分区数量有关,最后生成的文件也与task有关