开源软件的更新速度很快,而市面上的书籍往往软件版本较低,一些配置、界面都已发生变化。笔者最近在学习spark,刚学会了用IntelliJ IDEA编写wordcount,特此记下,供同 样菜的菜鸟参考。
笔者的的idea是15.0.4版本,spark为1.6,Scala为2.10.6
首先从官网下载http://www.jetbrains.com/idea/,(就是首页那个大大的download按钮)。自己学习的话选择社区版就够了。
将软件放在自己的想要安装的目录下面解压:tar -zxvf 文件名
如何打开图形界面呢?只要进入idea目录下的bin目录,运行idea.sh脚本(./idea.sh)
第一次安装就选择下一个了
选择自己喜欢的界面风格,发现没有确定按钮,按Enter也没用?其实应该点击右上角的关闭按钮
在之后的界面中点击右下角的Configure,选择plugin
选择browse repositories
搜索scala,点击install会下载安装
安装好Scal插件之后,就可以开始新建一个项目了,File--->New--->Project,选择Scala项目,还是不能移动窗口,那么就按Enter
输入项目的名字,选择自己的JDK和Scala版本号,按Enter
项目建立成功之后,就建立scala类吧。在src上右击,选择New,选择Scala Class,输入自己的类名(一定要和代码一致),如果需要的话还可以先建立包,就是Scala Class下面的Package
1.本地运行
以下是Spark的最简单的WordCount的例子,这是本地运行的代码,,在SparkContext中"local"代表本地模式,"wordcount"是任务的名字,本例中需要先建立com.hq的包
package com.hq
import org.apache.spark.SparkConf
import org.apache.spark.SparkContext
object WordCount {
def main(args: Array[String]) {
if (args.length < 1) {
System.err.println("Usage: <file>")
System.exit(1)
}
val conf = new SparkConf()
val sc = new SparkContext("local","wordcount",conf)
val line = sc.textFile(args(0))
line.flatMap(_.split(" ")).map((_, 1)).reduceByKey(_+_).collect().foreach(println)
sc.stop()
}
}
此时还没有导入spark的jar包,所以还有大量无法识别的类和方法,下面导入jar包,点击Project Structure按钮
在Libraries下,点击+按钮,选择Java,选择spark的jar包,在spark安装目录下的lib下:
选好之后,按ok就行了
此时apache就可以识别出来了,程序也不报错了
运行之前还需要进行一下配置:
点击左上角的加号,选择Application:
在我们这个案例中,只需要选择一下main class和program arguments就行了,在这个例子中,参数只有一个,就是统计词频的文件路径
一切准备就绪,按绿色的小箭头就可以运行了。结果会出现在控制台里
2. 打包运行
也可以将spark代码打成jar包放在集群上运行,我们对代码做一点点小小的修改,就是这两句
val conf = new SparkConf().setAppName("wordcount")
val sc = new SparkContext(conf)
首先还是在Project structure中修改:
选择好main class和打包的路径,点击OK,出现如下窗口:
在已有spark的集群上,可以不需要一些jar包,将红框圈出的部分依次选中,点击减号删除,只剩下“test1 compile output”,点击OK
在主界面上,点击build---->build artifacts,选择build,就开始打包了,jar包就在之前指定的路径下:
打开spark集群
在jar包的目录下,通过命令:
spark-submit --master spark://master:7077 --class com.hq.WordCount test1.jar /etc/profile
即可运行该程序了
其中,spark-submit可以直接使用是因为spark已经配置了环境变量,--master是主节点和端口号,--class指定的是main class的路径,test1.jar是jar包名,最后的/etc/profile是参数