承接上一篇 ClickHouse 部署笔记,本文记录 Linux 环境 Spark 3.1.3 集群部署,包含 Standalone、On Yarn 两种调度模式,以及 Spark-SQL 对接 Hive 元数据的实操配置。
一、Standalone 模式
Standalone 是 Spark 自带资源调度框架,适合学习理解 Master/Worker 架构。 解压安装包,复制模板配置文件,在 spark-env.sh 配置 Master 地址、核数、内存、JDK 和 Hadoop 类路径;workers 配置从节点,分发文件到各节点后执行 start-all.sh 启动集群,WebUI 访问地址 http://master:8080/。
避坑:Spark 与 Hadoop 存在同名启动脚本,优先使用
./执行,防止调用混淆。
提供 spark-submit 两种提交方式:client(日志本地输出,测试用)、cluster(日志存集群,生产上线),同时支持 spark-shell 直连集群。
# client
spark-submit --class org.apache.spark.examples.SparkPi --master spark://master:7077 \
--executor-memory 512m --total-executor-cores 1 --deploy-mode client \
spark-examples_2.12-3.1.3.jar 100
# cluster
spark-submit --class org.apache.spark.examples.SparkPi --master spark://master:7077 \
--executor-memory 512M --total-executor-cores 1 --deploy-mode cluster \
spark-examples_2.12-3.1.3.jar 100
二、On Yarn 模式
生产主流方案,复用已有 Yarn 资源调度。先停止 Standalone,在 spark-env.sh 指定 Hadoop 配置目录;修改 yarn-site.xml 关闭虚拟内存、物理内存检查,避免容器被无故杀死,分发配置并重启 Yarn。 同样支持 client / cluster 两种提交模式,cluster 模式需要通过 yarn logs -applicationId 查看任务日志。
配置 Spark History Server
开启事件日志持久化,修改 spark-defaults.conf,配置日志存储路径、保留任务数量,在 HDFS 创建对应目录,启动历史服务,用于任务结束后回看执行 UI。
spark.eventLog.enabled true
spark.eventLog.dir hdfs://master:9000/user/spark/applicationHistory
spark.yarn.historyServer.address master:18080
spark.eventLog.compress true
spark.history.fs.logDirectory hdfs://master:9000/user/spark/applicationHistory
spark.history.retainedApplications 15
三、Spark-SQL 几种使用方式
-
代码打包 spark-submit 提交:生产常用
-
spark-shell:交互式 REPL,适合调试
-
spark-sql:专用 SQL 命令行 注意:spark-shell、spark-sql 交互式工具仅支持 local / yarn-client,不支持 yarn-cluster。
spark-sql --master yarn --deploy-mode client
四、Spark-SQL 整合 Hive
目标:Spark-SQL 直接读取 Hive 元数据表,核心四步:
- Hive 开启 metastore 服务,
hive-site.xml配置hive.metastore.uris; - 将
hive-site.xml拷贝至 Spark 的 conf 目录; - 启动 metastore(前台调试 / nohup 后台常驻);
- 把 MySQL 驱动包放到 Spark jars,Spark 才能连接 Hive 的元数据库 MySQL。
启动 spark-sql,spark.sql.shuffle.partitions 默认200,小数据集测试建议调低,减少调度开销。
spark-sql --master yarn --deploy-mode client --conf spark.sql.shuffle.partitions=2
示例建外部表:
create table student(
id string,
name string,
age int,
gender string,
clazz string
)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ','
STORED AS textfile
location '/data/spark/stu/input/';
create external table score(
student_id string,
cource_id string,
sco int
)
ROW FORMAT DELIMITED FIELDS TERMINATED BY ','
STORED AS textfile
location '/data/spark/score/input/';
两条开窗 TopN 业务 SQL:
-- 各班总分前三名
select tt1.id
,tt1.name
,tt1.clazz
,tt1.sum_score
,tt1.rn
from (
select t1.id
,t1.name
,t1.clazz
,t2.sum_score
,row_number() over(partition by t1.clazz order by t2.sum_score desc) as rn
from student t1
join (
select student_id as id
,sum(sco) as sum_score
from score
group by student_id
) t2 on t1.id = t2.id
) tt1 where tt1.rn <= 3;
-- 各科成绩前十
select t1.student_id
,t1.cource_id
,t1.sco
,t1.rn
from (
select student_id
,cource_id
,sco
,row_number() over(partition by cource_id order by sco desc) as rn
from score
) t1 where rn<=10;
五、Broadcast Join 手动Hint优化
Spark 自动广播小表阈值默认 10M,可调整参数;统计信息不准时,手动加 /*+broadcast(a)*/ 提示广播小表,消除 Shuffle,提升 Join 性能。
set spark.sql.autoBroadcastJoinThreshold=10m;
select /*+broadcast(a)*/ * from
students as a
join
scores as b
on a.id=b.id;
小结
Standalone 多用于学习架构,生产优先 On Yarn。Spark-SQL 对接 Hive 元数据后可复用已有 Hive 表。高频坑点:交互式 SQL 不支持 yarn-cluster、shuffle 分区默认值偏大、Yarn 内存检查容易杀掉容器。Spark SQL 相比原生 MapReduce 语法友好、执行效率更高。