即解压spark-3.0.0-bin-hadoop3.2.tgz 文件到/opt/moudle/路径下,并改名为spark-local
[gaochuchu@s1 jvm]$ cd /opt/module/spark-local/
[gaochuchu@s1 spark-local]$ bin/spark-shell
命令行工具
在/opt/module/spark-local/data的目录下,添加一个word.txt文件。通过如下的命令执行单词统计程序
退出local模式
scala> :quit
提交本地的示例应用
bin/spark-submit \
--class org.apache.spark.examples.SparkPi \
--master local[2] \
./examples/jars/spark-examples_2.12-3.0.0.jar \
10
- –class 表示要执行程序的主类,此处可以更换为咱们自己写的应用程序
- -master local[2] 部署模式,默认为本地模式,数字表示分配的虚拟 CPU 核数量
- spark-examples_2.12-3.0.0.jar 运行的应用类所在的 jar 包,实际使用时,可以设置为自己打的 jar 包
- 数字 10 表示程序的入口参数,用于设定当前应用的任务数量
s1 | s2 | s3 | s4 | gracal | |
---|---|---|---|---|---|
Spark | Worker Master | Worker | Worker | Worker | Worker |
修改slaves配置文件
#进入spark-standline的conf目录
[gaochuchu@s1 ~]$ cd /opt/module/spark-standalone/conf/
#重命名
[gaochuchu@s1 conf]$ mv slaves.template slaves
#修改slaves文件,添加worker节点
[gaochuchu@s1 conf]$ vim slaves
s1
s2
s3
s4
gracal
环境变量配置文件spark-env.sh.tmpate 改名为spark-env.sh,并增加环境变量
#重命名
[gaochuchu@s1 conf]$ mv spark-env.sh.template spark-env.sh
#修改配置文件
[gaochuchu@s1 conf]$ vim spark-env.sh
#这里配置的是本服务器的java home的位置
export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.382.b05-1.el7_9.x86_64
SPARK_MASTER_HOST=s1
SPARK_MASTER_PORT=7077
这里的7077端口,相当于hadoop集群中内部通信的8020端口
分发spark-standalone目录
xsync spark-standalone
执行脚本启动集群
gaochuchu@s1 spark-standalone]$ sbin/start-all.sh
查看集群运行状态:可以知道s1为master,而其余节点为worker节点
执行脚本停止集群
gaochuchu@s1 spark-standalone]$ sbin/stop-all.sh
提交应用到集群环境
bin/spark-submit \
--class org.apache.spark.examples.SparkPi \
--master spark://s1:7077 \
./examples/jars/spark-examples_2.12-3.0.0.jar \
10
出现如下界面,说明应用执行完成,成功得到Pi的值
注意:
- –class 表示要执行程序的主类
- –master spark://s1:7077 独立部署模式,
连接到 Spark 集群
- spark-examples_2.12-3.0.0.jar 运行类所在的 jar 包
- 数字 10 表示程序的入口参数,用于设定当前应用的任务数量
Standalone模式之下,会产生多个java进程
执行任务时,在master的Web UI界面,可以看到节点的内存,以及服务器集群节点的总核数
参数 | 解释 | 可选值举例 |
---|---|---|
–class | Spark 程序中包含主函数的类 | |
–master | Spark 程序运行的模式(环境) | 模式:local[*]、spark://s1:7077、Yarn |
–executor-memory 1G | 指定每个 executor 可用内存为 1G | |
–total-executor-cores 2 | 指定所有executor使用的cpu核数为2个 | |
–executor-cores | 指定每个executor使用的cpu核数 | 其值=total-excutor-cores/ num-executors |
application-jar | 打包好的应用 jar,包含依赖。这个URL在集群全局可见。 比如 hdfs:// 共享存储系统,如果是flie://path,那么所有的节点 都包含相同的jar |
|
application-arguments | 传给main()方法的参数 | 如上述的数字10,说明num-executors为10 |
由于spark-shell停止后,集群监控s1:4040页面都看不到历史任务的运行情况,所以开发的时都配置历史服务器记录任务运行情况
# 修改文件名
[gaochuchu@s1 conf]$ mv spark-defaults.conf.template spark-defaults.conf
#配置日志存储路径
[gaochuchu@s1 conf]$ vim spark-defaults.conf
spark.eventLog.enabled true
spark.eventLog.dir hdfs://s1:8020/directory
注意:hdfs中必须已经存在directory
因此启动hadoop集群,并使用
hadoop fs -mkdir /directory
创建该目录
修改spark-env.sh文件,添加日志配置并分发配置
[gaochuchu@s1 conf]$ vim spark-env.sh
export SPARK_HISTORY_OPTS="
-Dspark.history.ui.port=18080
-Dspark.history.fs.logDirectory=hdfs://s1:8020/directory
-Dspark.history.retainedApplications=30"
参数 1 含义:WEB UI 访问的端口号为 18080
参数 2 含义:指定历史服务器日志存储路径 注意8020是当前版本的Hadoop集群的内部通信窗口,hadoop2.x也可能是9000
参数 3 含义:指定保存 Application 历史记录的个数,如果超过这个值,旧的应用程序信息将被删除,这个是内存中的应用数,而不是页面上显示的应用数。当 Spark 应用程序运行完成后,其元数据和日志可以被 Spark 历史服务器(Spark History Server)存储和显示,以便于开发者和管理员回顾和分析。需要注意的是,增加保留的应用程序数量将会增加 Spark 历史服务器的磁盘和内存使用量,因为它需要存储更多的元数据和日志信息。因此,在增加这个值时,你需要确保你的系统有足够的资源来支持这么做。
重新启动spark集群和历史服务器
[gaochuchu@s1 spark-standalone]$ sbin/start-all.sh
[gaochuchu@s1 spark-standalone]$ sbin/start-history-server.sh
提交任务
bin/spark-submit \
--class org.apache.spark.examples.SparkPi
\--master spark://s1:7077 \
./examples/jars/spark-examples_2.12-3.0.0.jar \
10
查看历史服务器:http://s1:18080
当前集群中只有一个Master节点,会存在单点故障问题。所以为了解决单点故障问题,需要在集群中配置多个Master节点,一旦活动状态的Master发生故障,由备用Master提供服务,保证作业能够继续执行。高可用一般采用Zookeeper
设置,因此需要确保集群中安装了Zookeeper
关闭Spark集群,启动Zookeeper集群
[gaochuchu@s1 spark-standalone]$ sbin/stop-all.sh
[gaochuchu@s1 spark-standalone]$ zk.sh start
修改spark-env.sh文件配置,添加如下内容,并且需要注释原来配置的master的host和port
[gaochuchu@s1 conf]$ vim spark-env.sh
#SPARK_MASTER_HOST=s1
#SPARK_MASTER_PORT=7077
SPARK_MASTER_WEBUI_PORT=8989
export SPARK_DAEMON_JAVA_OPTS="
-Dspark.deploy.recoveryMode=ZOOKEEPER
-Dspark.deploy.zookeeper.url=s1,s2,s3,s4,gracal
-Dspark.deploy.zookeeper.dir=/spark"
注意:Master 监控页面默认访问端口为 8080,但是可能会和 Zookeeper 冲突,所以改成 8989,也可以自定义为其他端口号
分发配置并启动spark集群
[gaochuchu@s1 spark-standalone]$ xsync conf/
[gaochuchu@s1 spark-standalone]$ sbin/start-all.sh
此时访问master节点的Web UI界面:http://s1:8989
启动s2的单独master节点,访问其Web UI:http://s2:8989
,发现此时s2会处于备用状态
[gaochuchu@s2 spark-standalone]$ sbin/start-master.sh
测试高可用
s1 | s2 | s3 | s4 | gracal | |
---|---|---|---|---|---|
HDFS | NameNode DataNameNode | DataNameNode | SecondaryNameNode DataNameNode | DataNameNode | DataNameNode |
YARN | NodeManager | ResourceManager NodeManager | NodeManager | NodeManager | NodeManager |
Zookeeper | Server1(follower) | Server2(follower) | Server3(may be learder) | Server4(follower) | Server5(follower) |
Spark | Worker Master | Worker 可开启备用Master | Worker | Worker | Worker |
即解压spark-3.0.0-bin-hadoop3.2.tgz 文件到/opt/moudle/路径下,并改名为spark-yarn
修改hadoop的配置文件yarn-site.xml,新增配置并且分发配置
[gaochuchu@s1 ~]$ cd /opt/module/hadoop-3.1.3/etc/hadoop/
[gaochuchu@s1 hadoop]$ vim 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>
[gaochuchu@s1 hadoop]$ xsync yarn-site.xml
环境变量配置文件spark-env.sh.tmpate 改名为spark-env.sh,并增加环境变量
[gaochuchu@s1 conf]$ mv spark-env.sh.template spark-env.sh
export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdk-1.8.0.382.b05-1.el7_9.x86_64
YARN_CONF_DIR=/opt/module/hadoop-3.1.3/etc/hadoop
启动HDFS以及Yarn集群
[gaochuchu@s1 conf]$ myhadoop.sh start
提交应用
特别注意:Yarn模式下已经不需要启动Spark集群了,只需要保证Hadoop集群处于启动状态即可
否则在启动Spark集群的时候会显示localhost: Authentication failed.
bin/spark-submit \
--class org.apache.spark.examples.SparkPi \
--master yarn \
--deploy-mode cluster \
./examples/jars/spark-examples_2.12-3.0.0.jar \
10
由于spark-shell停止后,集群监控s1:4040页面都看不到历史任务的运行情况,所以开发的时都配置历史服务器记录任务运行情况
# 修改文件名
[gaochuchu@s1 conf]$ mv spark-defaults.conf.template spark-defaults.conf
#配置日志存储路径
[gaochuchu@s1 conf]$ vim spark-defaults.conf
spark.eventLog.enabled true
spark.eventLog.dir hdfs://s1:8020/directory
注意:hdfs中必须已经存在directory
因此启动hadoop集群,并使用
hadoop fs -mkdir /directory
创建该目录
修改spark-env.sh文件,添加日志配置并分发配置
[gaochuchu@s1 conf]$ vim spark-env.sh
export SPARK_HISTORY_OPTS="
-Dspark.history.ui.port=18080
-Dspark.history.fs.logDirectory=hdfs://s1:8020/directory
-Dspark.history.retainedApplications=30"
参数 1 含义:WEB UI 访问的端口号为 18080
参数 2 含义:指定历史服务器日志存储路径 注意8020是当前版本的Hadoop集群的内部通信窗口,hadoop2.x也可能是9000
参数 3 含义:指定保存 Application 历史记录的个数,如果超过这个值,旧的应用程序信息将被删除,这个是内存中的应用数,而不是页面上显示的应用数。当 Spark 应用程序运行完成后,其元数据和日志可以被 Spark 历史服务器(Spark History Server)存储和显示,以便于开发者和管理员回顾和分析。需要注意的是,增加保留的应用程序数量将会增加 Spark 历史服务器的磁盘和内存使用量,因为它需要存储更多的元数据和日志信息。因此,在增加这个值时,你需要确保你的系统有足够的资源来支持这么做。
修改spark-default.conf,添加配置文件
[gaochuchu@s1 conf]$ vim spark-defaults.conf
spark.yarn.historyServer.address=s1:18080
spark.history.ui.port=18080
重新启动历史服务器
[gaochuchu@s1 spark-standalone]$ sbin/start-history-server.sh
重新提交应用
bin/spark-submit \
--class org.apache.spark.examples.SparkPi \
--master yarn \
--deploy-mode cluster \
./examples/jars/spark-examples_2.12-3.0.0.jar \
10
查看Yarn的WebUI http:s2:1666 ,以及历史服务器http:s1:18080
Spark on YARN模式的高可用性
使用YARN ResourceManager的HA机制,通过ResourceManager的自动故障转移实现Spark集群的高可用性。
Spark Standalone模式的高可用性:
使用Spark自带的HA机制,通过Zookeeper实现主节点的选举和故障转移,从而保证Spark集群的高可用性。
# 停止hadoop集群
[gaochuchu@s1 spark-yarn]$ myhadoop.sh stop
# 停止历史服务器
[gaochuchu@s1 spark-yarn]$ sbin/stop-history-server.sh