Spark学习笔记(2)——Spark运行环境部署

本系列文章内容全部来自尚硅谷教学视频,仅作为个人的学习笔记

Spark只是一个数据处理框架和计算引擎,它必须要在一个特定的环境中才能运行。常用的运行环境有如下三种

一、开发环境

当我们在idea中开发时,只需要在maven中引入spark的相关依赖,就可以编写运行调试spark代码了
如下,在Maven项目中引入Spark3.0的spark-core依赖,2.12对应的Scala版本

<dependencies>
 <dependency>
 <groupId>org.apache.spark</groupId>
 <artifactId>spark-core_2.12</artifactId>
 <version>3.0.0</version>
 </dependency>
</dependencies>

二、本地环境(Local模式)

Local模式是指不需要任何其它节点资源就可以在本地执行Spark代码的环境,不需要额外的进程进行资源管理,所有程序都运行在本地的一个进程环境中(如jvm),使用多线程来模拟集群,一般用于教学,调试,演示等。在 IDEA 中运行代码的环境我们称之为开发环境,不太一样。

如果要在本地终端中运行spark项目,则需在本地机器中下载Spark 下载地址
例如下载spark-3.1.3-bin-hadoop3.2.tgz(表示的是基于3.2版本的Hadoop编译的spark,如果要用到Hadoop的组件的话则需安装3.2版本的Hadoop)
下载spark然后解压到任意位置,将其bin目录配置到环境变量,然后在终端中使用spark-shell命令即可启动local环境,或者直接使用spark-submit提交运行spark项目的jar包

spark-submit --master local[*] testSpark-1.0-SNAPSHOT.jar

在这里插入图片描述

参考文章:Spark部署模式(一)——Local模式

三、集群环境

Local模式是在本地使用多线程模拟集群的环境,我们实际运行spark项目时通常都是在真实的集群环境中运行。

首先要准备一个服务器集群,并确保集群节点之间能够互相免密登录,每个节点上都安装了jdk

1. 部署Standalone模式

Standalone模式是Spark自带的一种集群模式,使用了分布式计算中的master-slave模型对集群资源进行管理和调度

master是集群中含有Master进程的节点
slave是集群中含有Executor进程的Worker节点

主节点Master:管理整个集群资源,接收提交应用,分配资源给每个应用,运行Task任务
从节点Worker:管理每个机器的资源,分配对应的资源来运行Task;
在这里插入图片描述
将spark-3.1.3-bin-hadoop3.2.tgz解压到一个节点,先在此节点上完成如下配置

设置master节点:

进入spark的conf 目录,修改 spark-env.sh.template 文件名为 spark-env.sh

mv spark-env.sh.template spark-env.sh

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

export JAVA_HOME=/opt/module/jdk1.8.0_144
SPARK_MASTER_HOST=linux1
SPARK_MASTER_PORT=7077

设置worker节点:

在conf目录中修改 slaves.template 文件名为 slaves

mv slaves.template slaves

修改 slaves 文件,添加 work 节点(linuxi为hosts文件中配置的集群中每个节点ip的映射名称)

linux1
linux2
linux3

最后将spark文件夹分发到每个集群节点的相同位置(使用scp或rsync命令)。这样就完成了spark的集群部署

启动集群:在集群任意节点的spark的sbin目录下执行脚本命令start-all.sh就能直接启动所有节点的spark,然后就可以使用bin目录下的spark-submit命令提交任务到集群运行了

配置高可用(HA)
所谓的高可用是因为当前集群中的 Master 节点只有一个,所以会存在单点故障问题。所以为了解决单点故障问题,需要在集群中配置多个 Master 节点,一旦处于活动状态的 Master发生故障时,由备用 Master 提供服务,保证作业可以继续执行。这里的高可用一般采用Zookeeper 设置

2. 部署Yarn模式

独立部署(Standalone)模式由 Spark 自身提供计算资源,无需其他框架提供资源。这种方式降低了和其他第三方资源框架的耦合性,独立性非常强。但是你也要记住,Spark 主要是计算框架,而不是资源调度框架,所以本身提供的资源调度并不是它的强项,并且Spark通常要依赖外部的分布式文件系统作为数据源,比如Hadoop系统的HDFS。所以Spark还是和其他专业的资源调度框架集成会更靠谱一些。所以接下来我们来学习在强大的 Yarn 环境下 Spark 是如何工作的(其实是因为在国内工作中,Yarn 使用的非常多)。
在这里插入图片描述
HDFS和Yarn都是Hadoop中的组件,因此我们还需要在集群中安装对应3.2版本的Hadoop 下载地址

(1)配置hadoop

假设有hadoop102,hadoop103,hadoop104三台机器构成的集群,要按照如下规划进行部署
在这里插入图片描述

先将hadoop-3.2.4.tar.gz解压到一个节点,先在此节点上完成如下配置。在hadoop安装目录下的etc/hadoop目录下修改core-site.xml,hdfs-site.xml,yarn-site.xml,mapred-site.xml,workers

核心配置文件core-site.xml:

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
 <!-- 指定HDFS的NameNode 的地址 -->
 <property>
 <name>fs.defaultFS</name>
 <value>hdfs://hadoop102:8020</value>
 </property>
 <!-- 指定 hadoop 数据的存储目录 -->
 <property>
 <name>hadoop.tmp.dir</name>
 <value>/opt/module/hadoop-3.2.4/data</value>
 </property>
 <!-- 配置 HDFS 网页登录使用的静态用户为 atguigu -->
 <property>
 <name>hadoop.http.staticuser.user</name>
 <value>atguigu</value>
 </property>
</configuration>

HDFS 配置文件hdfs-site.xml:

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
	<!-- HDFS的namenode数据存储地址-->
	<property>
    	<name>dfs.namenode.name.dir</name>
        <value>file:/data/hadoop/dfs/name</value>
	</property>
	<!-- HDFS的datanode数据存储地址-->
	<property>
        <name>dfs.datanode.data.dir</name>
        <value>file:/data/hadoop/dfs/data</value>
	</property>
<!-- nn web 端访问地址-->
<property>
 <name>dfs.namenode.http-address</name>
 <value>hadoop102:9870</value>
 </property>
<!-- 2nn web 端访问地址-->
 <property>
 <name>dfs.namenode.secondary.http-address</name>
 <value>hadoop104:9868</value>
 </property>
</configuration>

YARN 配置文件yarn-site.xml:

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
 <!-- 指定 MR 走 shuffle -->
 <property>
 <name>yarn.nodemanager.aux-services</name>
 <value>mapreduce_shuffle</value>
 </property>
 <!-- 指定 ResourceManager 的地址-->
 <property>
 <name>yarn.resourcemanager.hostname</name>
 <value>hadoop103</value>
 </property>
 <!--是否启动一个线程检查每个任务正使用的物理内存量,如果任务超出分配值,则直接将其杀掉,默认
是 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.1以上版本不需要配置-->
 <property>
 <name>yarn.nodemanager.env-whitelist</name>
<value>JAVA_HOME,HADOOP_COMMON_HOME,HADOOP_HDFS_HOME,HADOOP_CO
NF_DIR,CLASSPATH_PREPEND_DISTCACHE,HADOOP_YARN_HOME,HADOOP_MAP
RED_HOME</value>
 </property>
</configuration>

根据集群情况调优yarn可使用资源

 <!-- 单个container可申请的最多物理内存量,默认是8192(MB)
             对于spark一个executor就是一个container-->
        <property>
                <name>yarn.scheduler.maximum-allocation-mb</name>
                <value>10240</value>
        </property>

        <property>
                <name>yarn.nodemanager.resource.cpu-vcores</name>
                <value>30</value>
        </property>
        <property>
                <name>yarn.scheduler.minimum-allocation-vcores</name>
                <value>3</value>
        </property>
        <property>
                <name>yarn.scheduler.maximum-allocation-vcores</name>
                <value>6</value>
        </property>

        <!-- 每个yarn node节点可使用内存 -->
        <property>
                <name>yarn.nodemanager.resource.memory-mb</name>
                <value>57344</value>
        </property>
        <!-- 单个container最小内存 -->
        <property>
                <name>yarn.scheduler.minimum-allocation-mb</name>
                <value>1024</value>
        </property>
        <property>
                <name>yarn.scheduler.maximum-allocation-mb</name>
                <value>57344</value>
        </property>

yarn配置调优参考:

  1. yarn-site.xml 基本配置参考
  2. https://hadoop.apache.org/docs/r2.7.3/hadoop-yarn/hadoop-yarn-common/yarn-default.xml

MapReduce 配置文件mapred-site.xml:

<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" href="configuration.xsl"?>
<configuration>
<!-- 指定 MapReduce 程序运行在 Yarn 上 -->
 <property>
 <name>mapreduce.framework.name</name>
 <value>yarn</value>
 </property>
</configuration>

集群节点配置文件workers:

hadoop102
hadoop103
hadoop104

hadoop环境变量文件hadoop_env.sh
指定hadoop用户,我这里是root,在hadoop_env.sh中添加:

export HDFS_NAMENODE_USER=root
export HDFS_DATANODE_USER=root
export HDFS_JOURNALNODE_USER=root
export HDFS_SECONDARYNAMENODE_USER=root
export YARN_RESOURCEMANAGER_USER=root
export YARN_NODEMANAGER_USER=root

上述六个文件配置完成后将hadoop安装文件夹分发到集群每个节点的相同位置。这样就完成了hadoop的集群部署

启动yarn集群:
如果集群是第一次启动,需要在 hadoop102 节点格式化 NameNode

hdfs namenode -format

然后启动 HDFS。(若报错找不到JAVA_HOME,参考:解决

sbin/start-dfs.sh

最后在在配置了 ResourceManager 的节点(hadoop103)启动 YARN

sbin/start-yarn.sh
(2)配置spark

将spark-3.1.3-bin-hadoop3.2.tgz解压到一个节点,先在此节点上完成如下配置
修改 conf/spark-env.sh

export JAVA_HOME=/opt/module/jdk1.8.0_144
YARN_CONF_DIR=/opt/module/hadoop/etc/hadoop

将spark文件夹分发到每个集群节点的相同位置

就可以直接将任务提交到yarn集群上去运行了

bin/spark-submit \
--class org.apache.spark.examples.SparkPi \
--master yarn \
--deploy-mode cluster \
./examples/jars/spark-examples_2.12-3.0.0.jar
(3) 配置命令的环境变量

配置命令的环境变量使得在任意路径下都可以直接使用hadoop或spark的命令。
在/etc/profile中配置对所有用户生效,在~/.bashrc中配置只对当前用户生效,根据自己的需要添加配置

export HADOOP_HOME=/home/syc/hadoop-3.2.2
export LD_LIBRARY_PATH=$HADOOP_HOME/lib/native
export PATH=$PATH:$HADOOP_HOME/sbin:$HADOOP_HOME/bin
export SPARK_HOME=/home/syc/spark-3.2.3-bin-hadoop3.2
export SPARK_CONF_DI=$SPARK_HOME/conf
export PYTHONPATH=$SPARK_HOME/python:$SPARK_HOME/python/lib/py4j-0.10.9-src.zip:$PYTHONPATH
export PATH=$SPARK_HOME/bin:$SPARK_HOME/sbin:$SPARK_HOME/python:$PATH

参考资料
1.What is the difference between Spark Standalone, YARN and local mode?

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: Spark是一个开源的大数据处理框架,它提供了高效的数据处理能力和易用的API,支持多种数据处理模式,包括批处理、流处理和机器学习等。Spark的核心是分布式计算引擎,它可以在集群运行,利用多台计算机的计算能力来处理大规模数据。Spark的优势在于其高效的内存计算和强大的数据处理能力,可以在处理大规模数据时提供更快的计算速度和更高的性能。Spark的生态系统也非常丰富,包括Spark SQL、Spark Streaming、MLlib和GraphX等组件,可以满足不同的数据处理需求。 ### 回答2: Spark是一种大规模数据处理引擎,可以较快地处理大数据Spark并不是单独的一种工具,而是一系列的工具和库的整合。它具备高效的内存计算功能,能够在数秒或数分钟内完成数据处理任务。 Spark的核心是分布式计算引擎,通过将数据分成多个部分进行处理,缩短了计算时间。Spark基于RDD(弹性分布式数据集)进行数据处理,RDD是一种可缓存、可重用和容错的数据结构。RDD抽象了数据分布和分区,提供了简单的API。 Spark的架构包括四个组件:Driver、Cluster manager、Worker、和 Executor。其中Driver是Spark应用程序的主程序,Cluster manager通过Master节点来管理各个Worker节点,Worker节点包含了整个Spark集群的计算资源,Executor执行计算任务。 Spark支持多种编程语言,包括Scala、Java、Python和R。其中Scala是Spark的主要语言,因为它能够将Spark的API最大程度地利用。 除了分布式计算引擎外,Spark还提供了多种库和工具,包括Spark SQL、Spark Streaming、MLlib和GraphX。Spark SQL是一种用于结构化数据处理的库,能够使用SQL语句进行数据查询;Spark Streaming可以实时处理数据流,包括文本和图像等;MLlib是实现了多种机器学习算法的库,包括分类、回归、聚类和协同过滤;GraphX可以用于图计算和图分析领域。 总之,Spark是一种强大的大数据处理引擎,能够通过分布式计算架构实现快速的数据处理。它提供了多种语言支持和众多的库和工具,方便用户处理各类数据。 ### 回答3: Spark是一款开源的、分布式的大数据处理框架,它的出现将大数据处理的速度提升到了一个全新的水平。Spark的特点在于它的内存计算引擎,这使得Spark运行速度比传统的MapReduce处理速度要快很多,同时也比传统的Hadoop更加灵活。 Spark可以用于处理各种大数据应用场景,包括批处理、交互式查询、实时流处理等等。同时,Spark的生态系统非常丰富,有众多的开源库和工具可以使用,例如:Spark SQL、Spark Streaming、GraphX、MLlib等等。 Spark运行环境需要一个集群,因为Spark是分布式的,它可以通过在集群中多个节点上并行执行任务来提升处理速度,而且Spark支持多种集群管理和资源调度工具,例如:Apache Mesos、Hadoop YARNSpark自带的资源调度程序等等。 Spark的编程接口非常灵活,可以使用Scala、Java、Python等多种编程语言来编写Spark程序。无论是使用哪种编程语言,Spark都提供了相应的API和工具,例如:Spark SQL、Spark Streaming等。 总之,Spark是一个非常强大的大数据处理框架,它的出现是对传统的Hadoop框架的一种补充和升级,不仅可以处理海量的数据,而且可以提供更快速的数据处理速度和更强大的数据处理能力。因此,Spark已经成为现代大数据处理和机器学习领域中非常重要的工具之一。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值