spark3.0教程-SparkSQL:连接MySQL,写入数据,打包后,部署到yarn运行(依赖第三方包) 作者:马育民 • 2026-04-20 17:33 • 阅读:10003 # 打包规范(企业标准) 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/ ``` --- # 代码推荐配置项 ```scala 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 容器中,不会自动加载依赖,需手动指定。 ### 提交任务格式 ```bash 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; 使用瘦包 + 统一共享依赖 + 正确提交参数 = 生产唯一稳定方案。** 原文出处:http://www.malaoshi.top/show_1GW3AOj6Jsvj.html