Spark学习记录1

目录

1、Spark概述

1.1 Spark简介

1.2 Spark 组件

2.Spark集群部署

2.1 环境准备

2.2 Standalone模式

2.2.1 配置

2.2.2 启动spark集群

2.3  Yarn 模式集群部署

3. Spark作业提交原理

3.1 spark提交作业的语法

3.2 spark提交作业方式

3.2.1 Standalone模式

3.2.2 YARN-client模式

3.2.3 YARN-Cluster模式

4.SparkShell


1、Spark概述

1.1 Spark简介

  •  Spark是一种快速、通用、可扩展的大数据分析引擎(不进行数据存储,兼容很多数据源)
  • Spark 采用了先进的DAG执行引擎,支持循环数据流和内存计算,使得 Spark 速度更快,在内存中的速度是Hadoop MR的百倍,在磁盘上的速度是Hadoop MR的十倍(官网数据) 。
  • Spark 易用,可以用Scala、Java、Python、R等开发分布式应用,Spark 提供了大量高级API,方便开发。
  • Spark 集成了多种数据源,并且可以通过local、Yarn、Mesos、Standalone(Spark 提供的部署方式)等各种模式运行。

1.2 Spark 组件

Spark Core

实现了 Spark 的基本功能,包含任务调度、内存管理、错误恢复、与存储系统 交互等模块。Spark Core 中还包含了对弹性分布式数据集(resilient distributed dataset,简称RDD)的 API 定义。

Spark SQL

是 Spark 用来操作结构化数据的程序包。通过 Spark SQL,我们可以使用 SQL 或者 Apache Hive 版本的 SQL 方言(HQL)来查询数据。Spark SQL 支持多种数据源,比 如 Hive 表、Parquet 以及 JSON 等。

Spark Streaming

是 Spark 提供的对实时数据进行流式计算的组件。提供了用来操作数据流的 API,并且与 Spark Core 中的 RDD API 高度对应。

Spark MLlib

提供常见的机器学习(ML)功能的程序库。包括分类、回归、聚类、协同过滤等,还提供了模型评估、数据 导入等额外的支持功能。

Spark GraphX

GraphX在Spark基础上提供了一站式的数据解决方案,可以高效地完成图计算的完整流水作业。GraphX是用于图计算和并行图计算的新的(alpha)Spark API。通过引入弹性分布式属性图(Resilient Distributed Property Graph),一种顶点和边都带有属性的有向多重图,扩展了Spark RDD。

Structured Streaming(2.X版本)

结构化流是构建在sparksql引擎上的可伸缩且容错的流处理引擎。在内部,默认情况下,结构化流式处理查询使用微批处理引擎进行处理,该引擎将数据流作为一系列小批处理作业进行处理,从而实现低至100毫秒的端到端延迟,并且只保证一次容错。

2.Spark集群部署

2.1 环境准备

环境预准备,至少三台机器互通互联,免密登录,时间同步,安装好JDK1.8。

这里我们的三台服务器名为user1、user2、user3。

2.2 Standalone模式

Spark自身节点运行的集群模式,也就是我们所谓的独立部署(Standalone)模式。Spark的Standalone模式体现了经典的master-slave模式。

集群规划:

基本条件:同步时间、免密登录、关闭防火墙、安装JDK1.8

user1

user2

user3

spark

Master  Worker

Worker

Worker

2.2.1 配置

1)解压缩文件

通过MobaXterm_CHS将spark压缩安装文件上传至之前建立的/root/softwares 下,通过命令

tar -zxvf /root/softwares/spark-3.1.2-bin-hadoop3.2.tgz -C /usr/local

解压缩在指定位置并进行文件名修改

mv /usr/local/spark-3.1.2-bin-hadoop3.2/ /usr/local/spark-3.1.2

2)修改配置文件

①进入解压缩后路径的conf目录,修改workers.template文件名为workers

mv /usr/local/spark-3.1.2/conf/workers.template /usr/local/spark-3.1.2/conf/workers

②修改workers文件,添加worker节点

vi /usr/local/spark-3.1.2/conf/workers

覆盖为:

user1
user2
user3

这个文件是用来告诉master我的worker在那些节点上启动。

③修改spark-env.sh.template文件名为spark-env.sh

mv /usr/local/spark-3.1.2/conf/spark-env.sh.template /usr/local/spark-3.1.2/conf/spark-env.sh

④ 修改spark-env.sh文件,添加JAVA_HOME环境变量和集群对应的master节点

vi /usr/local/spark-3.1.2/conf/spark-env.sh

 文件末尾追加如下内容

#引入jdk所在路径(具体根据自己jdk路径修改)
export JAVA_HOME=/usr/local/jdk1.8.0_152/
#确定把master启动到哪台服务器上面,=user1就说明在user1上启动master
SPARK_MASTER_HOST=user1
#Master的内部通信端口设置为7077
SPARK_MASTER_PORT=7077

注意:7077端口,相当于hadoop3内部通信的9820端口,不能用于外部访问,此处的端口需要确认自己的Hadoop配置 

3)配置环境变量

①配置spark的环境变量

vi /etc/profile

修改如下

#追加
export SPARK_HOME=/usr/local/spark-3.1.2/
export PATH=$PATH:$JAVA_HOME/bin:$HADOOP_HOME/bin:$HADOOP_HOME/sbin:$SPARK_HOME/bin:$SPARK_HOME/sbin:

② 刷新环境变量和测试环境变量

[root@user1 ~]# source /etc/profile
[root@user1 ~]# which spark-shell
/usr/local/spark-3.1.2/bin/spark-shell

4)分发配置好的内容到其他节点 

#分发spark的安装目录
[root@user1 ~]# scp -r /usr/local/spark-3.1.2 user2:/usr/local/
[root@user1 ~]# scp -r /usr/local/spark-3.1.2 user3:/usr/local/

#在qianfeng01上分发配置好的环境到user2和user3
[root@user1 ~]# scp /etc/profile user2:/etc/
[root@user1 ~]# scp /etc/profile user3:/etc/

#分别在user2和user3上刷新spark的环境变量
[root@user2 ~]# source /etc/profile
[root@user3 ~]# source /etc/profile

2.2.2 启动spark集群

 从user1进入到安装目录找sbin目录进入 

cd /usr/local/spark-3.1.2/sbin/

启动spark集群

./start-all.sh

检查启动情况

spark提供webUI界面端口是一样8080或8081 内部通信7077

http://user1:8080http://user1:8081

 spark计算pai值:

spark-submit \
--class org.apache.spark.examples.SparkPi \
--master spark://user1:7077 \
--executor-memory 512m \
--total-executor-cores 2 \
/usr/local/spark-3.1.2/examples/jars/spark-examples_2.12-3.1.2.jar 100

spark-submit :提交命令

--class :运行的包名+类名

--master spark:spark-env.sh配置文件中配置的master的地址(主机和端口)

--executor-memory :每个executor(类似yarn的container)的内存

--total-executor-cores :每个executor的cpu个数

xxxx.jar(要执行的jar包--要执行的程序) 参数

所有spark提交命令只能写一行,如果写多行需要\来取标识

2.3  Yarn 模式集群部署

需要注意:配置yarn的文件中不要保留标签和队列,容易造成后续提交到Yarn中无法执行的效果,队列可以保留但是内存给的足够到时没有什么问题

独立部署(Standalone)模式由Spark自身提供计算资源,无需其他框架提供资源。这种方式降低了和其他第三方资源框架的耦合性,独立性非常强。Spark主要是计算框架,而不是资源调度框架,所以本身提供的资源调度并不是它的强项,所以可以使用Hadoop生态中Yarn进行资源调度操作。

1)解压缩spark文件

        操作步骤同2.2.1 1)

2) 修改hadoop中的配置文件/usr/local/hadoop-3.3.1/etc/hadoop/yarn-site.xml

vi /usr/local/hadoop-3.3.1/etc/hadoop/yarn-site.xml

<!--在该文件末尾追加如下内容-->

<!--是否启动一个线程检查每个任务正使用的物理内存量,如果任务超出分配值,则直接将其杀掉,默认是true -->
<property>
     <name>yarn.nodemanager.pmem-check-enabled</name>
     <value>false</value>
</property>

<!--是否启动一个线程检查每个任务正使用的虚拟内存量,如果任务超出分配值,则直接将其杀掉,默认是true -->
<property>
     <name>yarn.nodemanager.vmem-check-enabled</name>
     <value>false</value>
</property>

3)分发到不同的节点

scp /usr/local/hadoop-3.3.1/etc/hadoop/yarn-site.xml user2:/usr/local/hadoop-3.3.1/etc/hadoop/
scp /usr/local/hadoop-3.3.1/etc/hadoop/yarn-site.xml user3:/usr/local/hadoop-3.3.1/etc/hadoop/
#分发完成将yarn重启
start-yarn.sh

4)修改spark的配置文件

进入解压缩后路径的conf目录,修改workers.template文件名为workers
修改spark-env.sh.template文件名为spark-env.sh

这两个如果在2.2.1中修改过了,就无需再修改


修改spark-defaults.conf.template文件名为spark-defaults.conf

mv /usr/local/spark-3.1.2/conf/spark-defaults.conf.template /usr/local/spark-3.1.2/conf/spark-defaults.conf

workers文件中添加 

vi /usr/local/spark-3.1.2/conf/workers
user1
user2
user3

spark-env.sh文件中添加

vi /usr/local/spark-3.1.2/conf/spark-env.sh
#需要将standalone的配置覆盖掉
export JAVA_HOME=/usr/local/jdk1.8.0_152
HADOOP_CONF_DIR=/usr/local/hadoop-3.3.1/etc/hadoop
YARN_CONF_DIR=/usr/local/hadoop-3.3.1/etc/hadoop
export SPARK_HISTORY_OPTS="-Dspark.history.ui.port=18080 -Dspark.history.fs.logDirectory=hdfs://user1:9820/sparkHistory -Dspark.history.retainedApplications=30"

 spark-defaults.conf文件中添加

vi /usr/local/spark-3.1.2/conf/spark-defaults.conf
#在该文件末尾追加如下内容
spark.eventLog.enabled      true
spark.eventLog.dir       hdfs://user1:9820/sparkHistory
spark.yarn.historyServer.address=user1:18080
spark.history.ui.port=18080

注意:需要启动hadoop集群,HDFS上的目录需要提前存在。

#HDFS启动,如果已经启动则忽略
start-dfs.sh
#提前创建历史服务的目录
hdfs dfs -mkdir /sparkHistory

分发到不同的节点

#分发spark的配置文件
scp -r /usr/local/spark-3.1.2/conf/* user2:/usr/local/spark-3.1.2/conf/
scp -r /usr/local/spark-3.1.2/conf/* user3:/usr/local/spark-3.1.2/conf/

5)启动集群 

spark的yarn模式依赖yarn集群,还有可能hdfs集群。所以保障yarn和hdfs集群可用。
注意:
1、spark基于yarn的集群不需要启动spark集群(不用执行./sbin/start-all.sh)
2、spark基于yarn必须要yarn的集群启动并且可用
3、spark基于yarn的集群原则上不依赖hdfs集群,所以hdfs集群就可以不启动。
但是配置spark的historyserver是需要存储数据到hdfs集群中,
所以spark基于yarn也是需要依赖hdfs的,所以最终需要启动hdfs集群并且可用。
4、spark启动历史服务
./sbin/start-history-server.sh

3. Spark作业提交原理

Spark作业(任务)提交就是使用spark中spark-sumbit命令将已经封装好成jar包的程序提交到spark集群中执行运行从而得到计算结果的过程,在提交过程中我们对提交的作业(任务)进行参数设置操作。

3.1 spark提交作业的语法

bin/spark-submit \
--class <main-class>
--master <master-url> \
... # other options
<application-jar> \
[application-arguments]

参数

解释

--class

Spark程序中包含主函数的类

--master

Spark程序运行的模式(环境)

--deploy-mode

master设为为Yarn模式之后,使用的模式client 和 cluster

--driver-cores

master设为为Yarn模式之后,设置driver端的的cores个数

--driver-memory

master设为为Yarn模式之后,用于设置driver进程的内存(单位G或单位M)

--num-executors

master设为为Yarn模式之后,用于设置Spark作业总共要用多少个Executor进程来执行

--executor-memory

指定每个executor可用内存(单位G或单位M)

--total-executor-cores 2

指定所有executor使用的cpu核数为2个

--executor-cores

指定每个executor使用的cpu核数

application-jar

打包好的应用jar,包含依赖。这个URL在集群中全局可见。 比如hdfs:// 共享存储系统,如果是file:// path,那么所有的节点的path都包含同样的jar

application-arguments

传给main()方法的参数

3.2 spark提交作业方式

提交Spark提供的利用蒙特·卡罗算法求π的例子,其中100这个参数是计算因子

3.2.1 Standalone模式

spark-submit \
--class org.apache.spark.examples.SparkPi \
--master spark://user1:7077 \
--executor-memory 512m \
--total-executor-cores 2 \
/usr/local/spark-3.1.2-bin/examples/jars/spark-examples_2.12-3.1.2.jar 100

注意:在启动任务的时候并没有指定分配资源,而是有多少资源就使用了多少资源。我们在跑任务的时候是可以指定资源的(指定使用核数和内存资源)。

3.2.2 YARN-client模式

spark-submit \
--class org.apache.spark.examples.SparkPi \
--master yarn \
--deploy-mode client \
--driver-cores 1 \
--driver-memory 600M \
--executor-memory 800M \
--executor-cores 2  \
/usr/local/spark-3.1.2/examples/jars/spark-examples_2.12-3.1.2.jar 100

3.2.3 YARN-Cluster模式

spark-submit \
--class org.apache.spark.examples.SparkPi \
--master yarn \
--deploy-mode cluster \
--driver-cores 1 \
--driver-memory 600M \
--executor-memory 800M \
--executor-cores 2  \
/usr/local/spark-3.1.2/examples/jars/spark-examples_2.12-3.1.2.jar 100

Cluseter的运行结果需要我们通过端口8088去查看历史日志

 

注意,要查看logs必须保证yarn的历史日志启动,如果没有启动,会报连接错误,需通过mapred --daemon start historyserver命令开启JobHistoryServer 进程。

在Logs的最下面我们可以看到运行结果。

YARN-Cluster和YARN-Client的区别

  • 理解YARN-Client和YARN-Cluster深层次的区别之前先清楚一个概念:Application Master。在YARN中,每个Application实例都有一个ApplicationMaster进程,它是Application启动的第一个容器。它负责和ResourceManager打交道并请求资源,获取资源之后告诉NodeManager为其启动Container。从深层次的含义讲YARN-Cluster和YARN-Client模式的区别其实就是ApplicationMaster进程的区别
  • YARN-Cluster模式下,Driver运行在AM(Application Master)中,它负责向YARN申请资源,并监督作业的运行状况。当用户提交了作业之后,就可以关掉Client,作业会继续在YARN上运行,因而YARN-Cluster模式不适合运行交互类型的作业
  • YARN-Client模式下,Application Master仅仅向YARN请求Executor,Client会和请求的Container通信来调度他们工作,也就是说Client不能离开

总结

(1)Yarn-Cluster的Driver是在集群的某一台NM上,但是Yarn-Client就是在Client的机器上;
(2)Driver会和Executors进行通信,所以Yarn_Cluster在提交App之后可以关闭Client,而Yarn-Client不可以;
(3)Yarn-Cluster适合生产环境,Yarn-Client适合交互和调试。

4.SparkShell

  • spark-shell 是Spark自带的交互式Shell程序,方便用户进行交互式编程,用户可以在该命令行下用Scala编写Spark程序。
  • spark-shell 程序一般用作Spark程序测试练习来用。spark-shell 属于Spark的特殊应用程序,我们可以在这个特殊的应用程序中提交应用程序
  • spark-shell 启动有两种模式,local模式和cluster模式。

1) Local模式

spark-shell

2) Standalone Cluster模式(集群模式)

spark-shell --master spark://user1:7077

3) Yarn模式(YARN-client模式)

spark-shell --master yarn

注意,这里的--master必须使用yarn-client模式,不是yarn-cluster因为spark-shell作为一个与用户交互的命令行

总结:

1.spark-shell会创建两个对象:sc和spark,分别表示两个重要的上下文环境:SparkContext和SparkSession。
2.master=local[]表示运行在Local模式,[]表示CPU的核心数量。
3.spark-shell模式会启用WebUI端口4040,如果同一时间启动多个spark-shell,该端口依次递增。

4)退出spark-shell

正确退出:quit 千万不要ctrl+c退出,这样是错误的。若使用了ctrl+c退出,使用命令查看监听端口:

netstat -apn | grep 4040

再使用kill -9 端口号杀死进程。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值