在本地IDE里直接运行spark程序操作远程集群
一般运行spark作业的方式有两种:
本机调试,通过设置master为local模式运行spark作业,这种方式一般用于调试,不用连接远程集群。
集群运行。一般本机调试通过后会将作业打成jar包通过spark-submit提交运行。生产环境一般使用这种方式。
本文介绍第3种方式:
- 在本地将spark作业运行到远程集群中。这种方式比较少见,很多人认为不可行,包括我之前也是。经过试验发现是可行的,可以满足一些特定场景的需求。原理方面,可以参考这篇博客,
http://blog.jasonding.top/2015/07/08/Spark/%E3%80%90Spark%E3%80%91Spark%E5%BA%94%E7%94%A8%E6%89%A7%E8%A1%8C%E6%9C%BA%E5%88%B6/,应该是将Driver运行在了本地,分布式计算则分发给各个节点。
操作方法
1.设置master
两种方式:
- 在程序中设置
SparkConf conf = new SparkConf()
.setAppName("helloworld")
.setMaster("spark://192.168.130.15:7077");
- 在run configuration中设置
VM options中添加:
-Dspark.master="spark://192.168.130.15:7077"
2.设置HDFS
在程序中使用HDFS路径,会出现文件系统不匹配hdfs,可以将集群中的hadoop配置中的core-site.xml和hdfs-site.xml拷贝到项目src/main/resources下
3.发送jar包
如果程序中使用了自定义的算子和依赖的jar包,需要将本项目jar包和依赖的jar包发送到集群中SPARK_HOME/jars目录下,可以用maven-assembly打成带依赖的jar包,spark的jars相当于mvn库。
注意集群中每个节点的jars目录下都要放自己的jar包。
可能遇到的问题
如果遇到了节点间通信问题,可能是jar包没有在所有节点放置好。
incompatible loaded等问题,是依赖的spark版本不匹配,修改dependency。
至此,就可以直接在IDE中运行了。