《前后端面試題
》專欄集合了前后端各個知識模塊的面試題,包括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) |