接着之前文章 sbt 以及 IDEA sbt 插件安装配置教程 我们可以利用sbt和IDEA搭建一套可以远程调用spark的scala项目. 本文就详细的介绍一下方法和其中的各种坑.
前置条件
0. hosts添加地址映射
在 C:\Windows\System32\drivers\etc\hosts 文件中添加 Spark集群的相关ip和机器名, 如下示例:
192.168.4.225 hadoop1
192.168.4.216 hadoop2
192.168.4.156 hadoop3
192.168.4.239 hadoop4
1. 解决 null\bin\winutils.exe 错误
因为Windows系统没有安装hadoop系统, 所以系统运行时会报找不到的错误(hbase等工程也会报).可以从网上下载 hadoop-common-2.2.0-bin-master.zip, 并设置环境变量, 示例如下:
HADOOP_HOME=E:\hadoop-2.6.0
Path=%HADOOP_HOME%\bin
2.spark 启动
要确保 spark 服务启动才可调试.
启动方法: %spark_home%/sbin/start-all.sh
启动后, 使用 jps
命令可以看到Master和Worker进程:
同时还可以访问web ui界面:
http://192.168.4.225:4040/
spark web ui 一般为8080, 这可能与其他服务冲突, 解决方法是在 spark目录/sbin/start-master.sh 下, 修改这一段:
if [ "$SPARK_MASTER_WEBUI_PORT" = "" ]; then
SPARK_MASTER_WEBUI_PORT=4040
fi
创建工程
idea 使用 sbt 创建:
scala 版本最好与系统安装的一样, 以免出现问题:
最后点 finish 整个工程就搭建好了:
引入依赖和sbt相关插件
添加spark依赖:
在build.sbt中添加
libraryDependencies += "org.apache.spark" % "spark-core_2.11" % "2.1.0"
core_2.11中的2.11指的是spark编译使用的scala版本, 后面的2.1.0是spark版本
添加后 IDEA 会进行自动导入, 如果没有可以ctrl+s试试, 还不行那就需要下面的插件, 使用命令sbt update gen-idea
来更新了
添加sbt相关插件
想要更便利的时候sbt, 最好添加下面的两个插件, gen-idea 是生成可供idea使用的项目, sbt-assembly是打包
在project目录下新建 plugins.sbt, 然后写入:
addSbtPlugin("com.github.mpeltonen" % "sbt-idea" % "1.6.0")
addSbtPlugin("com.eed3si9n" % "sbt-assembly" % "0.11.2")
之后就可以使用 sbt gen-idea
和 sbt assembly
命令了
sbt 0.13.7 之前版本的 sbt 要求sbt文件中每行代码间有一个空行, 性情请见 sbt官网关于空行的说明
写入口代码
在src/main/scala 下新建 scala 文件WordCount.scala
这里如果新建没有scala选项, 可以自己手动新建.scala文件, 后面idea会自动处理
object WordCount extends App {
// 读取hdfs文件
// val path = "hdfs://192.168.4.216:8020/tmp/touch.data"
// 读取本地文件
val path = "./README.md"
// 本地调试
// val conf = new SparkConf().setAppName("SparkDemo").setMaster("local")
//远程调试
val conf = new SparkConf()
.setAppName("SparkDemo")
.setMaster("spark://192.168.4.225:7077")
.setJars(List("E:\\CodeReference\\CUNCODE\\sparkDemo\\out\\artifacts\\sparkDemo_jar\\sparkDemo.jar"))
val sc = new SparkContext(conf)
val lines = sc.textFile(path)
val words = lines.flatMap(_.split(" ")).filter(word => word != " ")
val pairs = words.map(word => (word, 1))
val wordscount: RDD[(String, Int)] = pairs.reduceByKey(_ + _)
wordscount.collect.foreach(println)
}
此时, 调用本地spark执行已经没有问题了, 但是要调用集群环境依然还需要配置. 可以看到setJars方法后的jar路径. 我们要进行jar包设置
jar 包设置
写代码前, 要先指定要在代码构建的时候生成jar, 这样才能提交到spark集群运行
选中项目名 -> 右键 -> 选择 Open Module Settings (快捷键 F4)
选择mainclass, 并且勾选 Include in project build(就是在build的时候就要生成jar包)
注意路径就是要往setJars里写的:
运行
点击确定,运行, 之后项目就可以远程调用spark了. 结果如下:
参考
(一) 从零开始搭建Spark Standalone集群环境搭建 http://www.cnblogs.com/ooon/p/5460060.html
(二)win7下用Intelij IDEA 远程调试spark standalone 集群 http://www.cnblogs.com/ooon/p/5490247.html
sbt Reference Manual — Getting Started summary http://www.scala-sbt.org/0.13/docs/Summary.html
Idea下用SBT搭建Spark Helloworld - X.Jan - 博客园 http://www.cnblogs.com/yongjian/p/6211007.html