问题现象
在IDEA中运行sparkPI,报错:
Exception in thread “main” org.apache.spark.SparkException: A master URL must be set in your configuration
问题根因
从提示中可以看出找不到程序运行的master,此时需要配置环境变量,指定spark集群的运行模式。
传递给Spark的master url可以有如下几种:
local 本地单线程
local[K] 本地多线程(指定K个内核)
local[*] 本地多线程(指定所有可用内核)
spark://HOST:PORT 连接到指定的 Spark standalone cluster master,需要指定端口。
mesos://HOST:PORT 连接到指定的 Mesos 集群,需要指定端口。
yarn-client客户端模式 连接到 YARN 集群。需要配置 HADOOP_CONF_DIR。
yarn-cluster集群模式 连接到 YARN 集群。需要配置 HADOOP_CONF_DIR。
问题解决
方法1:配置IDEA的VM参数
点击edit configuration,在左侧点击该项目。在右侧在右侧VM options中输入“-Dspark.master=local”,指示本程序本地单线程运行,再次运行即可。
仅仅配置“local”,运行时依旧会报错:
还是得配置成”-Dspark.master=local”才会运行成功,控制台输出信息如下:
/usr/lib/java/jdk1.7.0_71/bin/java
-Dspark.master=local
-Didea.launcher.port=7542
-Didea.launcher.bin.path=/usr/local/idea/idea-IC-135.1306/bin
-Dfile.encoding=UTF-8
方法2:在代码中直接设置运行模式
val conf = new SparkConf().setAppName(“Spark Pi”).setMaster(“local”)
非local模式的配置
val conf = new SparkConf().setAppName("Spark Pi").setMaster("spark://Master:7077")
错以为IDEA在运行时会去自动启动spark分布式环境,于是手动使用stop-all.sh分别将hadoop集群、spark集群关闭,按如上配置后报错:
ERROR SparkDeploySchedulerBackend: Application has been killed. Reason: All masters are unresponsive! Giving up.
使用start-all.sh手动重启hadoop集群、spark集群:
重新运行SparkPI依旧报错:
java.lang.ClassNotFoundException: org.apache.spark.examples.SparkPi$$anonfun$1
分布式的启动配置暂时搁置,先使用local模式学习spark为先,后续再究。