(一)什么是SparkONYarn模式
Spark on YARN(Yet Another Resource Negotiator)是 Spark 框架在 Hadoop 集群中运行的一种部署模式,它借助 Hadoop YARN 来管理资源和调度任务。
架构组成
ResourceManager:作为 YARN 的核心,负责整个集群的资源管理和调度。它会接收来自各个应用程序的资源请求,并根据集群资源的使用情况进行合理分配。
NodeManager:部署在集群中的每个节点上,负责管理该节点上的资源使用情况,监控容器的运行状态,并且与 ResourceManager 保持通信,汇报节点的资源使用信息。
ApplicationMaster:在 Spark 应用启动时,YARN 会为其分配一个 ApplicationMaster。它的主要职责是向 ResourceManager 申请资源,并且与 NodeManager 协作,启动和管理 Spark 的 Executor 进程。
Spark Driver:负责执行用户编写的 Spark 应用程序代码,将其转化为一系列的任务,并调度这些任务到各个 Executor 上执行。
Executor:运行在 NodeManager 管理的容器中,负责具体执行 Spark 任务,并将执行结果返回给 Driver。
(二)运行流程
提交应用:用户通过命令行或者其他方式向 YARN 提交 Spark 应用程序。
启动 ApplicationMaster:ResourceManager 接收到应用程序的请求后,会在集群中的某个节点上启动一个 ApplicationMaster 进程。
申请资源:ApplicationMaster 向 ResourceManager 注册,并根据应用程序的需求申请资源。
启动 Executor:ResourceManager 根据资源分配情况,通知相应的 NodeManager 启动 Executor 进程。
任务执行:Spark Driver 将任务分发给各个 Executor 执行,Executor 执行完任务后将结果返回给 Driver。
应用结束:当所有任务执行完毕后,ApplicationMaster 向 ResourceManager 注销,释放占用的资源。
(三)模式分类
Client 模式:Driver 运行在客户端进程中,客户端会与 ApplicationMaster 和 Executor 进行通信。这种模式适用于交互式应用,例如使用 Spark Shell 进行数据探索和分析。在这种模式下,用户可以在客户端直接看到 Driver 的输出和日志信息,方便调试和监控应用程序的运行状态。
Cluster 模式:Driver 运行在集群中的某个节点上,由 ApplicationMaster 负责管理。这种模式适用于生产环境中的长时间运行的应用程序。在 Cluster 模式下,客户端提交应用程序后可以断开连接,应用程序会在集群中独立运行,不受客户端的影响。
(四)配置集群
1.上传并解压spark-3.1.2-bin-hadoop3.2.tgz,重命名解压之后的目录为spark-yarn。对应的命令是:tar -zxvf spark-3.3.1-bin-hadoop3.tgz -C /opt/module
2. 修改一下spark的环境变量,/etc/profile.d/my_env.sh 。
# spark 环境变量
export SPARK_HOME=/opt/module/spark-yarn
export PATH=$PATH:$SPARK_HOME/bin:$SPARK_HOME/sbin
同步给其他的设备: xsync /etc/profile.d/
3.修改hadoop的配置。/opt/module/hadoop-3.1.3/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>
把这个设置分发到其他节点。使用xsync /opt/module/hadoop-3.1.3/etc/hadoop/同步一下。
4.修改spark配置。 把三个文件的名字重新设置一下。
workers.tempalte 改成 workers,spark-env.sh.template 改成 spark-env.sh,
spark-defaults.conf.template 改成 spark-defaults.conf。
然后,在workers文件中添加
hadoop100
hadoop101
hadoop102
在spark-env.sh文件中,添加如下
SPARK_MASTER_HOST=hadoop100
SPARK_MASTER_PORT=7077
HADOOP_CONF_DIR=/opt/module/hadoop-3.1.3/etc/hadoop
YARN_CONF_DIR=/opt/module/hadoop-3.1.3/etc/hadoop
export SPARK_HISTORY_OPTS="-Dspark.history.fs.logDirectory=hdfs://hadoop100:8020/directory"
在spark-defaults.conf文件中,添加如下
spark.eventLog.enabled true
spark.eventLog.dir hdfs://hadoop100:8020/directory
spark.yarn.historyServer.address=hadoop100:18080
spark.history.ui.port=18080
5.同步配置文件到其他设备。xsync /opt/module/spark-yarn/sbin