无公网IP本地PC如何通过IntelliJ IDEA向远程Spark集群提交代码?
正好我之前也做过类似的操作,给你整理一套从本地IntelliJ IDEA开发Scala/Spark代码,再提交到远程华为云Spark集群的完整流程,都是实操验证过的:
本地IntelliJ IDEA配置远程Spark集群提交环境
一、先把本地基础环境对齐集群
- 务必安装和集群完全匹配的版本:Scala 2.11.8、JDK 1.8.0_101,版本差一点都可能触发兼容性问题,踩过坑的人都懂😂
- 打开IntelliJ IDEA,安装Scala插件(在Settings -> Plugins里搜索安装,装完重启IDE生效)
二、创建Spark项目并配置依赖
推荐用Maven管理项目,依赖更清晰:
- 新建Scala-Maven项目,或者在现有Maven项目中添加Scala支持
- 在
pom.xml里添加Spark依赖,注意版本要和集群的Spark 2.0.1、Scala 2.11对应,而且要加<scope>provided</scope>避免和集群已有的依赖冲突:
<dependencies> <dependency> <groupId>org.apache.spark</groupId> <artifactId>spark-core_2.11</artifactId> <version>2.0.1</version> <scope>provided</scope> </dependency> <dependency> <groupId>org.apache.spark</groupId> <artifactId>spark-sql_2.11</artifactId> <version>2.0.1</version> <scope>provided</scope> </dependency> </dependencies>
三、两种提交方式任你选
方式1:IDEA直接提交到远程集群(开发调试更方便)
- 点击顶部菜单
Run -> Edit Configurations,点+号选择Spark Application - 关键参数配置:
- Main class:填你的Spark主类全路径(比如
com.xf.MySparkDemo) - Cluster manager:选Spark Standalone
- Master URL:填远程集群master的地址
spark://172.17.0.4:7077(默认端口7077,改了的话填你自己的端口) - JVM options:一定要加
-Dspark.driver.host=你的本地PC公网IP!因为远程worker节点需要回调本地driver,局域网的话得做端口映射或者用VPN让集群能访问到你 - 最后在Configuration标签页,选对项目模块的classpath,工作目录设为项目根目录
- Main class:填你的Spark主类全路径(比如
方式2:打包后通过命令行提交(正式运行更稳妥)
- 先在IDEA里打包:Maven项目执行
mvn clean package,生成瘦包就行(因为集群已有Spark依赖) - 用scp把jar包传到集群master节点:
scp target/your-spark-job.jar root@172.17.0.4:/opt/spark-jobs/
- 登录到master节点,执行spark-submit命令:
spark-submit \ --class com.xf.MySparkDemo \ --master spark://172.17.0.4:7077 \ /opt/spark-jobs/your-spark-job.jar
四、几个容易踩坑的注意点
- 版本一致性!版本一致性!版本一致性!重要的事说三遍,本地和集群的Scala、Spark、JDK版本必须完全一致,不然各种
ClassNotFoundException找上门 - 如果本地在局域网,一定要确保集群能访问到你的本地IP,要么做端口映射,要么用VPN打通网络,不然worker连不上driver会报错
- 集群防火墙要开放7077(master通信端口)以及driver的端口,避免连接被拒绝
- 先写个简单的WordCount程序测试,跑通了再搞复杂业务逻辑
内容的提问来源于stack exchange,提问作者XF Xu




