×

mac idea 搭建 运行 本地/远程spark

96
Helen_Cat
2017.09.10 15:14* 字数 1769

在mac 上使用IDEA 开发java scala 项目是非常顺手的,当在开发大数据项目中,如果 项目总是 不断的手工打jar ,并重复在Terminal 中 spark submit 提交jar 包,是一件非常繁琐的事情,好的开发模式就是不断使开发更加便利和简单。在不断的接触到各种坑以后,决定把其中的门道总结一下。
下面我们主要讨论使用 scala 开发spark 项目中 idea 搭建spark 运行环境。

1.首先 mac 安装IDEA最新版 ,我当时是2017.1版,官网下载

2.本地 搭建 java 和scala 语言 运行环境,配置环境变量,这个就不详细说了,java版本是8-111,scala 版本是2.12.1

image.png

3.在IDEA 中 安装 scala 插件,在其仓库中就能找到,一定要安装 最新的scala 插件,好像是2017.1.20版的,之前的scala 版本插件有严重的问题,避免采坑 重蹈覆辙,一定要下载安装最新的,之后重启IDEA

4.本地搭建 MAVEN Sbt scala java 的建构工具 运行环境,并配置变量。sbt 的版本是0.13.13

5.本地 搭建 hadoop 和spark 的运行环境 ,并配置环境变量,hadoop我安装的是2.7.3,spark 是2.1.0,这个搭建需要些时间,保证都可以使用

6.在IDEA 中新建scala sbt 项目,注意的是scala 和sbt 版本,sbt 版本要选择和本地一样的,而scala 版本 一定要和本地spark 版本相匹配的,不然会有严重的兼容问题,无法启动运行。其实有一个小窍门,Terminal 进入spark 安装根目录 ,找到 jar 包目录 、/spark/jars/,观察其中的scala 版本号是多少,那么新建项目就是多少,通过观察 spark 2.10.中 jars 目录的scala 版本是2.11.8,所以项目选择 scala 是2.11.8

image.png

7.引入 spark 依赖 ,尤其是 spark-core spark -streaming spark-mllib ,这个时候要注意两点,这些spark 依赖的版本也一定要和 安装spark 根目录下jars 目录中的spark 相关jar包版本一致,通过观察 jars 中的spark 相关jar包都是 spark_*_2.11.0_2.1.0,一定要注意其中的版本,2.11.0代表的是spark 引用的scala 版本大号,

image.png

非常重要,另外一点 敲黑板 ,引入的依赖 一定要 “compile” 或则 “runtime”,否则spark conf 无法初始化,这辈子也运行不了,千万不要是 “provided".

image.png

libraryDependencies += "org.apache.spark" % "spark-streaming_2.11" % "2.1.0" % "compile"
libraryDependencies += "org.apache.spark" % "spark-mllib_2.11" % "2.1.0" % "compile"
8.选择View --tool windows --sbt ,把sbt view 整出来后,选择构建项目 同步sbt view 的左上角的 蓝色圆圈,注意 一定要有vpn ss 可以翻墙,sbt 构建 下载jar包 必须翻墙,也可以找到国内的jar包仓库替代,大概需要 十五分钟左右

image.png

9.项目创建 包 创建 scala 文件,写有main 函数 ,和spark 相关运行代码

10.配置 jvm option 讲 spark master地址写上面,IDEA右上角 运行 绿箭头旁边,点击 edit configuration,在弹出的框 右侧上部分 有 【VM options:】,配置spark master,比如
-Dspark.master=spark://mullerhadoop-1.local:7077
Main class 就是你要运行的那个类,JRE也要整对了。

image.png

11.File --project structure 弹出框后 左侧的Artifacts ,选择 【+】,---jar ---from mudules with dependency, 又弹出小框, 选择Main Class ,就是你要运行的那个类。

image.png

选择 ok 关闭,在原来的中弹框 右侧 第三行 打钩 【include in project build】,这样 就可以每次运行 打jar 包了,在 sparkhost:8080 和sparkhost:4040 .可以查看运行情况

image.png

12.开始运行项目,不出意外,可以正常输出运行,若有问题基本不是环境问题,代码问题,自己解决吧

13.总结其中出现的Terminal 报错内容
one
Exception in thread "main" java.lang.NoClassDefFoundError: scala/Product$class at org.apache.spark.SparkConf$DeprecatedConfig.(SparkConf.scala:762) at org.apache.spark.SparkConf$.(SparkConf.scala:615) at org.apache.spark.SparkConf$.(SparkConf.scala) at org.apache.spark.SparkConf.set(SparkConf.scala:84) at org.apache.spark.SparkConf.set(SparkConf.scala:73) at org.apache.spark.SparkConf.setMaster(SparkConf.scala:105)
这个一般来说 项目应该是没有 编译成功,即使成功了 也可能是假的,有一些spark 的依赖包 没有被真的 引入进来,或者是其他的jar包冲突 导致引入 失败,还有就是 默认仓库里没有找到,解决方法是 1.添加更多的sbt 的仓库源,以保证引入源找到包,2,先暂时去掉 非spark的jar包依赖声明,防止因为冲突造成
two
[Runtime NoClassDefFoundError: org/apache/spark/SparkConf ](https://stackoverflow.com/questions/39331956/runtime-noclassdeffounderror-org-apache-spark-sparkconf-despite-compiling-fine)
three
I have built Spark 1.3.0 successfully on IntelliJ IDEA 14, but when i try to run SparkPi example under the examples module i face this error: Exception in thread "main" java.lang.NoClassDefFoundError: org/apache/spark/SparkConf at org.apache.spark.examples.SparkPi$.main(SparkPi.scala:27) at org.apache.spark.examples.SparkPi.main(SparkPi.scala) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:606) at com.intellij.rt.execution.application.AppMain.main(AppMain.java:134) Caused by: java.lang.ClassNotFoundException: org.apache.spark.SparkConf at java.net.URLClassLoader$1.run(URLClassLoader.java:366) at java.net.URLClassLoader$1.run(URLClassLoader.java:355) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(URLClassLoader.java:354) at java.lang.ClassLoader.loadClass(ClassLoader.java:425) at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:308) at java.lang.ClassLoader.loadClass(ClassLoader.java:358) ... 7 more

`
uccessfully created connection to /10.20.30.50:7077 after 25 ms (0 ms spent in bootstraps)
Connecting to master spark://10.20.30.50:7077...
Still have 2 requests outstanding when connection from /10.20.30.50:7077 is closed
Failed to connect to master 10.20.30.50:7077

org.apache.spark.SparkException: Exception thrown in awaitResult
`
Failed to connect to master 一般是 本地项目中 spark声明的jar 依赖 和 远程 spark 安装目录 下 jars 目录中的spark 不匹配,记住 spark-streaming_2.11" % "2.2.0" 和spark-streaming_2.11" % "2.1.0" 就不匹配 ,还有就是 spark 的scala 版本,看 远程 spark 安装目录下的jars的scala版本是多少 ,那么你项目引入的scala 版本应该是一致的,至少 都是2.11.8 就应该用2.11.8~11,千万不要用 2.12.X


image.png

出现 awaitResult master 连接不上,
1.可能是 项目中的spark jar包与 连接的spark 版本不符
或者 项目中的spark jar 包 和 项目中的scala 依赖版本不符
或者 项目中的scala jar 包与 连接的额spark 版本不符
2.就是 项目 中的 SparkConf.setmaster("")改成 local[*],如果 spark在本地启动时时 standalone 模式

java 编程
Web note ad 1