Spark on Yarn 环境搭建

该文章详细介绍了如何在三台Centos7机器上搭建Spark3.1.2运行在Yarn3.3.0集群上的步骤,包括配置Spark和Yarn环境、设置历史服务器、日志级别以及提交测试SparkPI程序。涉及的关键组件还包括Hadoop、Zookeeper和Python3.8.8。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 搭建目的

将Spark程序运行在Yarn集群中, 由Yarn集群完成资源调度

2. Spark On Yarn环境所依赖组件及版本

spark-3.1.2
hadoop-3.3.0
apache-hive-3.1.2-bin
zookeeper-3.4.6
Python 3.8.8
三台Centos7机器: 主机名分别为:node1、node2、node3

3. 配置Spark运行环境

vim conf/spark-env.sh

export SPARK_MASTER_PORT=7077

SPARK_MASTER_WEBUI_PORT=8080
SPARK_WORKER_CORES=2
SPARK_WORKER_MEMORY=2g
SPARK_WORKER_PORT=7078
SPARK_WORKER_WEBUI_PORT=8081

SPARK_HISTORY_OPTS="-Dspark.history.fs.logDirectory=hdfs://node1:8020/sparklog/ 
-Dspark.history.fs.cleaner.enabled=true"
SPARK_DAEMON_JAVA_OPTS="-Dspark.deploy.recoveryMode=ZOOKEEPER -Dspark.deploy.zookeeper.url=node1:2181,node2:2181,node3:2181 -Dspark.deploy.zookeeper.dir=/spark-ha"


HADOOP_CONF_DIR=/export/server/hadoop/etc/hadoop/
YARN_CONF_DIR=/export/server/hadoop/etc/hadoop/

4.配置Yarn运行环境

vim hadoop/etc/hadoop/yarn-site.xml

<configuration>
    <!-- 指定YARN的主角色(ResourceManager)的地址 -->
    <property>
        <name>yarn.resourcemanager.hostname</name>
        <value>node1</value>
    </property>

    <!-- NodeManager上运行的附属服务。需配置成mapreduce_shuffle,才可运行MapReduce程序默认值:"" -->
    <property>
        <name>yarn.nodemanager.aux-services</name>
        <value>mapreduce_shuffle</value>
    </property>
    <!-- 设置yarn集群的内存分配方案 -->
    <property>
        <name>yarn.nodemanager.resource.memory-mb</name>
        <value>20480</value>
    </property>
    <property>
        <name>yarn.scheduler.minimum-allocation-mb</name>
        <value>2048</value>
    </property>
    <property>
        <name>yarn.nodemanager.vmem-pmem-ratio</name>
        <value>2.1</value>
    </property>

    <!-- 是否将对容器实施物理内存限制 -->
    <property>
        <name>yarn.nodemanager.pmem-check-enabled</name>
        <value>false</value>
    </property>

    <!-- 是否将对容器实施虚拟内存限制。 -->
    <property>
        <name>yarn.nodemanager.vmem-check-enabled</name>
        <value>false</value>
    </property>
    <!-- 开启日志聚集 -->
    <property>
        <name>yarn.log-aggregation-enable</name>
        <value>true</value>
    </property>

    <!-- 设置yarn历史服务器地址 -->
    <property>
        <name>yarn.log.server.url</name>
        <value>http://node1:19888/jobhistory/logs</value>
    </property>

    <!-- 保存的时间7天 -->
    <property>
        <name>yarn.log-aggregation.retain-seconds</name>
        <value>604800</value>
    </property>

    <!-- Site specific YARN configuration properties -->

5.Spark设置历史服务器地址

vim spark/conf/spark-defaults.conf
spark.eventLog.dir hdfs://node1:8020/sparklog/

spark.eventLog.enabled  true
spark.eventLog.dir      hdfs://node1:8020/sparklog/
spark.eventLog.compress true
spark.yarn.historyServer.address        node1:18080
spark.yarn.jars  hdfs://node1:8020/spark/jars/*

配置后, 需要在HDFS上创建 sparklog目录
hdfs dfs -mkdir -p /sparklog

6. 设置日志级别

vim spark/conf/log4j.properties
log4j.rootCategory=WARN, console

log4j.rootCategory=WARN, console
log4j.appender.console=org.apache.log4j.ConsoleAppender
log4j.appender.console.target=System.err
log4j.appender.console.layout=org.apache.log4j.PatternLayout
log4j.appender.console.layout.ConversionPattern=%d{yy/MM/dd HH:mm:ss} %p %c{1}: %m%n

# Set the default spark-shell log level to WARN. When running the spark-shell, the
# log level for this class is used to overwrite the root logger's log level, so that
# the user can have different defaults for the shell and regular Spark apps.
log4j.logger.org.apache.spark.repl.Main=WARN

# Settings to quiet third party logs that are too verbose
log4j.logger.org.sparkproject.jetty=WARN
log4j.logger.org.sparkproject.jetty.util.component.AbstractLifeCycle=ERROR
log4j.logger.org.apache.spark.repl.SparkIMain$exprTyper=INFO
log4j.logger.org.apache.spark.repl.SparkILoop$SparkILoopInterpreter=INFO
log4j.logger.org.apache.parquet=ERROR
log4j.logger.parquet=ERROR

7.配置Spark相关依赖包地址

当Spark Application应用提交运行在YARN上时,默认情况下,每次提交应用都需要将依赖Spark相关jar包上传到YARN 集群中,为了节省提交时间和存储空间,将Spark相关jar包上传到HDFS目录中,设置属性告知Spark Application应用。

hadoop fs -mkdir -p /spark/jars/
hadoop fs -put spark/jars/*.jar  /spark/jars/

vim spark/conf/spark-defaults.conf
添加:
spark.yarn.jars hdfs://node1:8020/spark/jars/*

spark.eventLog.enabled  true
spark.eventLog.dir      hdfs://node1:8020/sparklog/
spark.eventLog.compress true
spark.yarn.historyServer.address        node1:18080
spark.yarn.jars  hdfs://node1:8020/spark/jars/*

8.启动服务

启动服务:
HDFS、YARN、MRHistoryServer和Spark HistoryServer,
命令如下:

start-dfs.sh
start-yarn.sh
mr-jobhistory-daemon.sh start historyserver
spark/sbin/start-history-server.sh

Spark HistoryServer服务WEB UI页面地址:

9.提交测试

计算圆周率PI的Spark程序,提交到Yarn上运行,在Centos平台上直接用spark-sumbit脚本提交程序

SPARK_HOME=/export/server/spark
${SPARK_HOME}/bin/spark-submit \
--master yarn \
--conf "spark.pyspark.driver.python=/root/anaconda3/bin/python3" \
--conf "spark.pyspark.python=/root/anaconda3/bin/python3" \
${SPARK_HOME}/examples/src/main/python/pi.py \
10

设置资源信息,提交运行pi程序至YARN上

SPARK_HOME=/export/server/spark
${SPARK_HOME}/bin/spark-submit \
--master yarn \
--driver-memory 512m \
--executor-memory 512m \
--executor-cores 1 \
--num-executors 2 \
--queue default \
--conf "spark.pyspark.driver.python=/root/anaconda3/bin/python3" \
--conf "spark.pyspark.python=/root/anaconda3/bin/python3" \
${SPARK_HOME}/examples/src/main/python/pi.py \
10

10. 参考文章

Spark-Standalone高可用集群搭建

### 配置 IntelliJ IDEA 连接 Spark on YARN 要在 IntelliJ IDEA 中配置并连接到 Spark on YARN 集群,可以按照以下方式操作: #### 1. 创建 Maven 或 SBT 项目 在 IntelliJ IDEA 中创建一个新的 Maven 或 SBT 项目,并确保引入必要的依赖项。以下是 Maven `pom.xml` 文件的一个示例配置[^1]: ```xml <dependencies> <!-- Spark Core --> <dependency> <groupId>org.apache.spark</groupId> <artifactId>spark-core_2.12</artifactId> <version>3.3.0</version> </dependency> <!-- Spark SQL --> <dependency> <groupId>org.apache.spark</groupId> <artifactId>spark-sql_2.12</artifactId> <version>3.3.0</version> </dependency> <!-- Hadoop Client (如果需要) --> <dependency> <groupId>org.apache.hadoop</groupId> <artifactId>hadoop-client</artifactId> <version>3.3.1</version> </dependency> </dependencies> ``` #### 2. 设置 SparkSession 和 Master URL 当编写 Spark 应用程序时,在初始化 `SparkSession` 或 `SparkContext` 时需指定 `--master yarn` 参数来表明应用程序将在 YARN 上运行。 下面是一个简单的 Java 示例代码用于设置 SparkSession 并提交至 YARN[^5]: ```java import org.apache.spark.sql.SparkSession; public class WordCount { public static void main(String[] args) { String appName = "Word Count"; String masterUrl = "yarn"; // 使用 YARN 作为资源管理器 // 初始化 SparkSession SparkSession spark = SparkSession.builder() .appName(appName) .master(masterUrl) .config("spark.submit.deployMode", "client") // 客户端模式 .getOrCreate(); try { System.out.println("Application started..."); // 执行一些逻辑... spark.read().textFile(args[0]).show(); // 假设输入文件路径通过命令行参数传递 } finally { spark.stop(); } } } ``` 注意:为了防止 DNS 解析问题,建议显式地将本地 IP 地址绑定给 Spark Driver 节点。可以通过如下方式进行配置: ```java .config("spark.driver.host", "<your-local-ip>") .config("spark.driver.bindAddress", "<your-local-ip>") ``` #### 3. 构建可执行 JAR 文件 构建包含所有依赖关系的 fat jar(uber-jar)。这通常通过 Maven 的 Shade 插件完成。编辑 `pom.xml` 添加插件定义[^2]: ```xml <build> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-shade-plugin</artifactId> <version>3.2.4</version> <executions> <execution> <phase>package</phase> <goals> <goal>shade</goal> </goals> </execution> </executions> </plugin> </plugins> </build> ``` 完成后运行以下命令生成 jar 文件: ```bash mvn clean package ``` #### 4. 提交作业到 YARN 使用 `spark-submit` 工具向 YARN 提交任务。假设已经生成了一个名为 `my-spark-app.jar` 的 jar 文件,则可以按以下格式调用[^4]: ```bash bin/spark-submit \ --class com.example.MainClass \ --master yarn \ --deploy-mode cluster/client \ /path/to/my-spark-app.jar input_path output_path ``` 其中: - `com.example.MainClass`: 主类名; - `/path/to/my-spark-app.jar`: 刚才打包好的 jar 文件位置; - `input_path`, `output_path`: 输入输出数据所在的 HDFS 路径; #### 5. 测试和调试 测试过程中可能会遇到权限不足或其他错误情况,请确认集群上的环境变量以及安全策略是否允许外部访问[^3]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值