打包规范(企业标准)
- 打瘦包(thin jar)
只打包自己编写的业务代码,不包含任何第三方依赖。 - Spark/Hadoop/Hive 依赖
scope 设置为provided,运行时由集群提供。 - 严禁打 Fat Jar
包体积大、上传慢、极易与集群环境产生类冲突、版本冲突。
第三方依赖存放位置
为什么要将依赖放到 HDFS 上?
因为是 YARN 集群部署模式,所以必须使用统一共享存储:
- YARN 会随机调度容器到任意节点
任务可能运行在集群中任何一台机器,依赖必须让所有节点都能访问。 - 生产节点成百上千,不能逐台部署 jar
无法在每台服务器手动放包、更新包,运维不可行。 - YARN 是分布式环境,本地目录不共享
某台节点的本地/lib其他节点看不见,会导致驱动找不到。 - HDFS 是 YARN 集群天然的共享文件系统
所有 NodeManager 都能访问,一份文件全集群可用。 - 保证 Driver 和 Executor 依赖版本完全一致
避免环境不一致导致的NoClassDefFoundError、No suitable driver。 - 符合企业平台化、多租户架构
调度系统(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 命令
- 所有参数必须放在【应用jar包之前】
--jars/--conf/--packages等不能写在业务 jar 后面,否则无效。 - 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;
使用瘦包 + 统一共享依赖 + 正确提交参数 = 生产唯一稳定方案。