spark3.0教程-SparkSQL:连接MySQL,写入数据,打包后,部署到yarn运行(依赖第三方包)

打包规范(企业标准)

  1. 打瘦包(thin jar)
    只打包自己编写的业务代码,不包含任何第三方依赖。
  2. Spark/Hadoop/Hive 依赖
    scope 设置为 provided,运行时由集群提供。
  3. 严禁打 Fat Jar
    包体积大、上传慢、极易与集群环境产生类冲突、版本冲突。

第三方依赖存放位置

为什么要将依赖放到 HDFS 上?

因为是 YARN 集群部署模式,所以必须使用统一共享存储:

  1. YARN 会随机调度容器到任意节点
    任务可能运行在集群中任何一台机器,依赖必须让所有节点都能访问。
  2. 生产节点成百上千,不能逐台部署 jar
    无法在每台服务器手动放包、更新包,运维不可行。
  3. YARN 是分布式环境,本地目录不共享
    某台节点的本地 /lib 其他节点看不见,会导致驱动找不到。
  4. HDFS 是 YARN 集群天然的共享文件系统
    所有 NodeManager 都能访问,一份文件全集群可用。
  5. 保证 Driver 和 Executor 依赖版本完全一致
    避免环境不一致导致的 NoClassDefFoundError、No suitable driver。
  6. 符合企业平台化、多租户架构
    调度系统(DolphinScheduler、自研平台)均基于 HDFS 管理公共依赖。

企业标准 HDFS 依赖目录

hdfs:///user/common/lib/

代码推荐配置项

val prop = new java.util.Properties()
prop.put("user", "root")
prop.put("password", "xxx")
prop.put("driver", "com.mysql.cj.jdbc.Driver")

移除运行模式

因为是 YARN 集群部署,所以运行模式必须由提交命令决定,不能写死在代码里

不要有 .setMaster("local[*]"),会报错如下:

User did not initialize spark context!

spark-submit 命令

  1. 所有参数必须放在【应用jar包之前】
    --jars / --conf / --packages 等不能写在业务 jar 后面,否则无效。
  2. YARN cluster 模式必须配置 classpath
    仅靠 --jars 分发不够,Driver 运行在 YARN 容器中,不会自动加载依赖,需手动指定。

提交任务格式

spark-submit \
--class com.xxx.xxx.MainClass \
--master yarn \
--deploy-mode cluster \
--jars hdfs:///lib/mysql-connector-java-8.0.18.jar \
--conf spark.driver.extraClassPath=./mysql-connector-java-8.0.18.jar \
your_app.jar

例子:

spark-submit \
--class com.recommender.offline.ContentBasedRecommender \
--master yarn \
--deploy-mode cluster \
--jars hdfs:///lib/mysql-connector-java-8.0.18.jar \
--conf spark.driver.extraClassPath=mysql-connector-java-8.0.18.jar \
/program/app-1.0-SNAPSHOT.jar

一句话总结

因为是 YARN 集群部署,所以依赖必须放 HDFS;
使用瘦包 + 统一共享依赖 + 正确提交参数 = 生产唯一稳定方案。