Spark面试题及详细答案100道(71-80)-- 配置与部署
《前后端面试题
》专栏集合了前后端各个知识模块的面试题,包括html,javascript,css,vue,react,java,Openlayers,leaflet,cesium,mapboxGL,threejs,nodejs,mangoDB,SQL,Linux… 。
文章目录
- 一、本文面试题目录
- 71. Spark standalone模式的部署步骤是什么?
- 72. 如何在YARN上部署Spark?需要配置哪些关键参数?
- 73. Spark on YARN的`client`模式和`cluster`模式有什么区别?
- 74. Spark的`spark-env.sh`和`spark-defaults.conf`配置文件的作用是什么?
- 75. 如何设置Spark应用程序的名称、资源(内存、核数)等参数?
- 76. 什么是Spark的历史服务器(History Server)?如何配置和使用?
- 77. Spark与Hadoop的兼容性如何?需要注意哪些配置?
- 78. 如何在Spark中集成Hive?
- 79. 如何在Spark中配置日志级别?
- 80. Spark应用程序提交的命令(`spark-submit`)的常用参数有哪些?
- 二、100道Spark面试题目录列表
一、本文面试题目录
71. Spark standalone模式的部署步骤是什么?
Spark standalone模式是Spark自带的集群部署模式,适用于小规模集群,部署步骤如下:
-
环境准备:
- 所有节点安装Java(JDK 8+),配置
JAVA_HOME
。 - 下载Spark二进制包(如
spark-3.4.0-bin-hadoop3.tgz
),解压到所有节点的相同路径(如/opt/spark
)。 - 配置SSH免密登录(Master节点可无密码登录所有Worker节点)。
- 所有节点安装Java(JDK 8+),配置
-
配置Master节点:
- 修改
$SPARK_HOME/conf/slaves
(或workers
,Spark 2.0+),添加所有Worker节点的主机名或IP:worker1 worker2 worker3
- (可选)修改
spark-env.sh
,配置Master端口和内存:export SPARK_MASTER_HOST=master # Master节点主机名 export SPARK_MASTER_PORT=7077 # Master端口(默认7077) export SPARK_MASTER_WEBUI_PORT=8080 # WebUI端口(默认8080) export SPARK_WORKER_MEMORY=8g # 每个Worker的内存 export SPARK_WORKER_CORES=4 # 每个Worker的核数
- 修改
-
启动集群:
- 在Master节点执行启动脚本:
$SPARK_HOME/sbin/start-all.sh
- 验证集群:访问
http://master:8080
,查看Worker节点是否注册成功。
- 在Master节点执行启动脚本:
-
提交应用:
$SPARK_HOME/bin/spark-submit \--master spark://master:7077 \--class org.apache.spark.examples.SparkPi \--executor-memory 2g \--total-executor-cores 4 \$SPARK_HOME/examples/jars/spark-examples_2.12-3.4.0.jar \100
-
停止集群:
$SPARK_HOME/sbin/stop-all.sh
72. 如何在YARN上部署Spark?需要配置哪些关键参数?
在YARN上部署Spark(Spark on YARN)需依赖Hadoop YARN集群,步骤及关键配置如下:
-
环境准备:
- 已部署Hadoop YARN集群(HDFS和YARN正常运行)。
- 确保Spark与Hadoop版本兼容(如Spark 3.x兼容Hadoop 2.7+)。
- 配置
HADOOP_CONF_DIR
指向Hadoop配置目录(/etc/hadoop/conf
):export HADOOP_CONF_DIR=/etc/hadoop/conf
-
关键配置参数(在
spark-defaults.conf
或提交命令中设置):spark.master=yarn
:指定YARN作为集群管理器。spark.yarn.appMasterEnv.JAVA_HOME
:YARN ApplicationMaster的JDK路径。spark.executorEnv.JAVA_HOME
:Executor的JDK路径。spark.yarn.jars
:Spark依赖JAR包的HDFS路径(避免每次提交上传JAR,如hdfs:///spark/jars/*
)。spark.yarn.queue
:指定YARN队列(默认default
)。spark.driver.memory
:Driver内存(默认1g)。spark.executor.memory
:每个Executor内存(默认1g)。spark.executor.cores
:每个Executor的核数(默认1)。spark.dynamicAllocation.enabled
:是否开启动态资源分配(默认false)。
-
提交应用到YARN:
spark-submit \--master yarn \--deploy-mode cluster \ # 或client模式--class org.apache.spark.examples.SparkPi \--executor-memory 2g \--executor-cores 2 \--num-executors 5 \$SPARK_HOME/examples/jars/spark-examples_2.12-3.4.0.jar \100
-
验证部署:
- 访问YARN WebUI(
http://yarn-resourcemanager:8088
)查看应用状态。 - 访问Spark应用UI(通过YARN WebUI跳转,默认端口4040)。
- 访问YARN WebUI(
73. Spark on YARN的client
模式和cluster
模式有什么区别?
Spark on YARN的client
和cluster
模式主要区别在于Driver程序的运行位置,具体差异如下:
特性 | client 模式 | cluster 模式 |
---|---|---|
Driver位置 | 运行在提交应用的客户端(如本地机器) | 运行在YARN集群的某个NodeManager节点上 |
网络通信 | Driver与Executor直接通信,需客户端与集群网络通畅 | Driver在集群内部,通信更高效 |
客户端依赖 | 客户端需保持运行(关闭则应用失败) | 客户端提交后可退出,不影响应用运行 |
适用场景 | 交互式场景(如Spark Shell、调试) | 生产环境、批处理任务(无需客户端持续连接) |
日志查看 | 驱动日志直接输出到客户端控制台 | 需通过YARN WebUI或yarn logs 命令查看 |
资源占用 | 客户端需占用一定资源运行Driver | 客户端资源占用少 |
示例:
client
模式提交(适合调试):spark-submit --master yarn --deploy-mode client ...
cluster
模式提交(适合生产):spark-submit --master yarn --deploy-mode cluster ...
选择建议:
- 开发调试用
client
模式,方便查看实时日志和交互。 - 生产环境用
cluster
模式,避免客户端故障影响应用,且更适合自动化任务(如定时调度)。
74. Spark的spark-env.sh
和spark-defaults.conf
配置文件的作用是什么?
spark-env.sh
和spark-defaults.conf
是Spark的核心配置文件,分别用于环境变量和应用参数配置:
-
spark-env.sh
:- 作用:配置Spark运行的环境变量,如JVM参数、集群地址、资源限制等,影响Spark进程(Master/Worker/Driver/Executor)的启动。
- 位置:
$SPARK_HOME/conf/spark-env.sh
(需从模板spark-env.sh.template
复制)。 - 常见配置:
export JAVA_HOME=/usr/lib/jvm/java-8-openjdk # JDK路径 export SPARK_MASTER_HOST=master # Standalone模式Master地址 export SPARK_WORKER_MEMORY=8g # Standalone模式Worker内存 export SPARK_WORKER_CORES=4 # Standalone模式Worker核数 export SPARK_DAEMON_JAVA_OPTS="-Xmx2g" # Master/Worker的JVM参数 export HADOOP_CONF_DIR=/etc/hadoop/conf # Hadoop配置目录(YARN模式)
-
spark-defaults.conf
:- 作用:配置Spark应用的默认参数(如
spark.master
、spark.executor.memory
),可被spark-submit
命令的参数覆盖。 - 位置:
$SPARK_HOME/conf/spark-defaults.conf
(需从模板spark-defaults.conf.template
复制)。 - 常见配置:
spark.master yarn # 默认集群管理器 spark.driver.memory 1g # Driver默认内存 spark.executor.memory 2g # Executor默认内存 spark.executor.cores 2 # 每个Executor默认核数 spark.sql.shuffle.partitions 200 # SQL Shuffle默认分区数 spark.serializer org.apache.spark.serializer.KryoSerializer # 序列化器 spark.yarn.jars hdfs:///spark/jars/* # YARN模式下的JAR包路径
- 作用:配置Spark应用的默认参数(如
优先级:spark-submit
命令参数 > spark-defaults.conf
> spark-env.sh
(环境变量)。
75. 如何设置Spark应用程序的名称、资源(内存、核数)等参数?
设置Spark应用的名称和资源参数可通过**spark-submit
命令**、代码或配置文件实现,常用方式如下:
-
通过
spark-submit
命令设置(优先级最高):spark-submit \--name "MySparkApp" \ # 应用名称--master yarn \ # 集群管理器--deploy-mode cluster \ # 部署模式--driver-memory 2g \ # Driver内存--executor-memory 4g \ # 每个Executor内存--executor-cores 2 \ # 每个Executor的核数--num-executors 10 \ # Executor总数(YARN模式)--total-executor-cores 20 \ # 所有Executor的总核数(Standalone模式)--class com.example.MyApp \ # 主类myapp.jar \ # 应用JAR包arg1 arg2 # 应用参数
-
在代码中设置(仅部分参数生效,如名称、内存):
import org.apache.spark.sql.SparkSessionval spark = SparkSession.builder().appName("MySparkApp") // 应用名称.config("spark.driver.memory", "2g").config("spark.executor.memory", "4g").config("spark.executor.cores", "2").getOrCreate()
-
通过
spark-defaults.conf
设置(默认值,可被命令覆盖):spark.app.name MySparkApp spark.driver.memory 2g spark.executor.memory 4g spark.executor.cores 2
注意:
- 资源参数(内存、核数)需根据集群实际容量调整,避免超过集群限制。
num-executors
仅在YARN模式有效,Standalone模式通过total-executor-cores
控制总核数。- 应用名称会显示在Spark UI和集群管理器(如YARN)中,便于识别。
76. 什么是Spark的历史服务器(History Server)?如何配置和使用?
Spark历史服务器(History Server) 用于持久化和展示已完成的Spark应用程序日志和统计信息,弥补实时UI(4040端口)在应用结束后关闭的不足。
配置步骤:
-
配置存储路径:
- 在
spark-defaults.conf
中指定日志存储目录(通常为HDFS路径,确保所有节点可访问):spark.eventLog.enabled true # 启用事件日志 spark.eventLog.dir hdfs:///spark/eventLogs # 日志存储路径(HDFS或本地) spark.history.fs.logDirectory hdfs:///spark/eventLogs # 历史服务器读取日志的路径
- 在
-
配置历史服务器端口(可选):
- 在
spark-env.sh
中设置WebUI端口(默认18080):export SPARK_HISTORY_OPTS="-Dspark.history.ui.port=18080"
- 在
-
启动历史服务器:
$SPARK_HOME/sbin/start-history-server.sh
-
访问历史服务器:
- 打开浏览器访问
http://history-server-host:18080
,查看所有已完成的应用日志。
- 打开浏览器访问
-
停止历史服务器:
$SPARK_HOME/sbin/stop-history-server.sh
使用场景:
- 分析已完成应用的性能瓶颈(如查看Stage、Task详情)。
- 排查失败应用的错误日志。
- 审计应用资源使用情况。
注意:需确保spark.eventLog.dir
目录存在且有写入权限(如hdfs dfs -mkdir -p /spark/eventLogs
)。
77. Spark与Hadoop的兼容性如何?需要注意哪些配置?
Spark与Hadoop兼容性良好,可无缝集成HDFS、YARN和Hive,但需注意版本匹配和配置细节:
-
版本兼容性:
- Spark官方对Hadoop的支持版本通常为Hadoop 2.7+和3.x(如Spark 3.4支持Hadoop 2.7-3.3)。
- 避免使用跨大版本组合(如Spark 3.x + Hadoop 1.x,可能存在API不兼容)。
- 查看Spark官网的“Downloads”页面获取具体版本兼容表。
-
关键配置:
- HDFS集成:无需额外配置,Spark默认使用Hadoop的
core-site.xml
和hdfs-site.xml
访问HDFS。 - YARN集成:
- 配置
HADOOP_CONF_DIR
指向Hadoop配置目录:export HADOOP_CONF_DIR=/etc/hadoop/conf
- 确保YARN的
yarn.resourcemanager.hostname
等参数正确配置。
- 配置
- 依赖包:
- 下载预编译的Spark版本(如
spark-3.4.0-bin-hadoop3.tgz
),避免手动编译。 - 若需自定义Hadoop版本,需重新编译Spark并指定Hadoop版本:
./dev/make-distribution.sh --name custom-spark --tgz -Phadoop-3.3
- 下载预编译的Spark版本(如
- HDFS集成:无需额外配置,Spark默认使用Hadoop的
-
注意事项:
- YARN的资源隔离:确保YARN的
yarn.nodemanager.resource.memory-mb
和yarn.scheduler.maximum-allocation-mb
足够分配Spark的Executor内存。 - HDFS权限:Spark应用需有HDFS路径的读写权限(如输出目录、事件日志目录)。
- 加密配置:若Hadoop启用了Kerberos认证,需为Spark配置相应的安全凭证(如
spark.yarn.keytab
和spark.yarn.principal
)。
- YARN的资源隔离:确保YARN的
78. 如何在Spark中集成Hive?
Spark集成Hive可实现访问Hive表、使用HiveQL和共享Hive元数据,步骤如下:
-
环境准备:
- 已安装Hive并配置Metastore(支持本地Derby或远程MySQL/PostgreSQL)。
- 确保Spark与Hive版本兼容(如Spark 3.x兼容Hive 2.3+)。
-
配置Hive元数据:
- 将Hive的配置文件(
hive-site.xml
)复制到Spark的conf
目录:cp $HIVE_HOME/conf/hive-site.xml $SPARK_HOME/conf/
hive-site.xml
中需正确配置Metastore地址(如远程Metastore):<property><name>hive.metastore.uris</name><value>thrift://hive-metastore-host:9083</value> </property>
- 将Hive的配置文件(
-
添加Hive依赖:
- Spark默认包含Hive支持(
-Phive
和-Phive-thriftserver
模块),无需额外安装。 - 若使用自定义编译的Spark,需确保编译时包含Hive模块。
- Spark默认包含Hive支持(
-
验证集成:
- 启动Spark Shell(自动加载Hive配置):
spark-shell --master yarn
- 在Spark中访问Hive表:
// 查看Hive数据库 spark.sql("show databases").show()// 读取Hive表 val df = spark.table("default.user") df.show()// 创建Hive表 spark.sql("create table if not exists spark_hive_test (id int, name string)")
- 启动Spark Shell(自动加载Hive配置):
-
启动Thrift Server(可选):
- 允许通过JDBC/ODBC访问Spark SQL(兼容HiveServer2):
$SPARK_HOME/sbin/start-thriftserver.sh --master yarn
- 使用Beeline连接:
beeline -u jdbc:hive2://localhost:10000 -n username
- 允许通过JDBC/ODBC访问Spark SQL(兼容HiveServer2):
注意:若Hive启用了Kerberos,需在spark-env.sh
中配置相应的安全参数。
79. 如何在Spark中配置日志级别?
Spark的日志级别控制(如DEBUG、INFO、WARN、ERROR)可通过以下方式配置,用于减少冗余日志或调试问题:
-
通过
log4j2.properties
配置(全局默认):- 复制模板文件并修改:
cp $SPARK_HOME/conf/log4j2.properties.template $SPARK_HOME/conf/log4j2.properties
- 编辑
log4j2.properties
,设置根日志级别或特定类的日志级别:# 根日志级别(默认INFO) rootLogger.level = WARN# 特定类的日志级别(如Spark SQL) logger.org.apache.spark.sql.name = org.apache.spark.sql logger.org.apache.spark.sql.level = INFO# Spark Core的日志级别 logger.org.apache.spark.name = org.apache.spark logger.org.apache.spark.level = ERROR
- 生效范围:所有Spark应用(需重启Spark服务或重新提交应用)。
- 复制模板文件并修改:
-
在代码中动态设置(针对当前应用):
import org.apache.log4j.{Level, Logger}// 设置Spark核心日志级别为WARN Logger.getLogger("org.apache.spark").setLevel(Level.WARN)// 设置Spark SQL日志级别为ERROR Logger.getLogger("org.apache.spark.sql").setLevel(Level.ERROR)// 设置Hadoop相关日志级别为ERROR Logger.getLogger("org.apache.hadoop").setLevel(Level.ERROR)
- 生效范围:仅当前应用,不影响其他应用。
-
通过
spark-submit
命令临时设置:spark-submit \--conf "spark.driver.extraJavaOptions=-Dlog4j.configuration=file:/path/to/custom-log4j2.properties" \--conf "spark.executor.extraJavaOptions=-Dlog4j.configuration=file:/path/to/custom-log4j2.properties" \...
- 适用于临时覆盖默认日志配置,无需修改全局文件。
常见日志级别(从低到高):TRACE < DEBUG < INFO < WARN < ERROR < FATAL。生产环境通常用WARN或ERROR减少日志量,调试时用DEBUG或INFO。
80. Spark应用程序提交的命令(spark-submit
)的常用参数有哪些?
spark-submit
是提交Spark应用的统一命令,常用参数按功能分类如下:
-
集群与部署模式:
--master <url>
:指定集群管理器(如yarn
、spark://master:7077
、local[*]
)。--deploy-mode <mode>
:部署模式(client
或cluster
,默认client
)。--queue <queue-name>
:YARN队列名称(默认default
)。
-
应用基本信息:
--name <name>
:应用名称(显示在UI中)。--class <class-name>
:主类全路径(如org.apache.spark.examples.SparkPi
)。--jars <paths>
:依赖的额外JAR包(逗号分隔)。--packages <packages>
:Maven坐标的依赖包(如org.apache.hadoop:hadoop-aws:3.3.1
)。
-
资源配置:
--driver-memory <memory>
:Driver内存(如2g
,默认1g
)。--driver-cores <cores>
:Driver核数(仅YARN cluster模式有效,默认1)。--executor-memory <memory>
:每个Executor内存(如4g
,默认1g
)。--executor-cores <cores>
:每个Executor的核数(YARN/Standalone模式,默认1)。--num-executors <num>
:Executor总数(仅YARN模式,默认2)。--total-executor-cores <num>
:所有Executor的总核数(仅Standalone模式)。
-
配置参数:
--conf <key=value>
:设置Spark配置参数(如spark.sql.shuffle.partitions=200
)。--properties-file <file>
:指定配置文件(默认spark-defaults.conf
)。
-
示例:
spark-submit \--master yarn \--deploy-mode cluster \--name "UserAnalysis" \--class com.example.UserAnalysis \--driver-memory 2g \--executor-memory 4g \--executor-cores 2 \--num-executors 10 \--conf spark.sql.shuffle.partitions=200 \--jars /path/to/mysql-connector.jar \user-analysis.jar \2023-01-01 2023-01-31
注意:参数需在应用JAR包和应用参数之前指定,不同集群管理器支持的参数略有差异(如num-executors
仅YARN有效)。
二、100道Spark面试题目录列表
文章序号 | Spark 100道 |
---|---|
1 | Spark面试题及答案100道(01-10) |
2 | Spark面试题及答案100道(11-20) |
3 | Spark面试题及答案100道(21-30) |
4 | Spark面试题及答案100道(31-44) |
5 | Spark面试题及答案100道(41-55) |
6 | Spark面试题及答案100道(56-70) |
7 | Spark面试题及答案100道(71-80) |
8 | Spark面试题及答案100道(81-90) |
9 | Spark面试题及答案100道(91-100) |