上一节我们介绍了如何使用Java语言开发一个集群模式的Spark任务:WordCount程序,但是使用Java开发出来的Spark任务显得冗长复杂。本节来介绍如何使用Scala语言开发一个本地模式的Spark任务:WordCount程序。相比之下,你就会发现Scala编写的Spark程序非常精简。
1.下载Spark安装目录下的所有Jar包
使用WinSCP工具将$SPARK_HOME/jars目录下的所有Jar包下载到本地目录如E:/sparklib中。
2.使用IDEA搭建Spark程序开发环境
- 打开IDEA开发工具,选择“Create New Project”,选择Scala下面的sbt工程,Next
- 工程名字:ScalaSparkWordCount,选择一个保存位置,比如:E:/ScalaSparkWordCount,Java版本和Scala版本需要和Spark集群环境中的保持一致,sbt版本保持默认,Finish
- 在ScalaSparkWordCount工程上右键单击,New,Directory,输入目录名:lib,OK
- 将刚才下载好的所有Jar包,复制粘贴到lib文件夹,在弹出的确认对话框中单击OK
- 选中lib目录下的所有的Jar包,右键,选中“Add as Libirary”,在弹出的对话框中输入库的名字,比如:spark_jars,OK
注意:IDEA构建工程的过程比较慢,请耐心等待。只有等工程构建完成后,工程的结构才会完整,写代码时才会有智能提示。可以通过更改sbt源的方式来提高构建速度,这里不作介绍。
3.编写WordCount程序
- 在ScalaSparkWordCount工程下的src/main/scala目录上右键,New,Package:demo,OK
- 在demo下面New,Scala Class:ScalaSparkWordCount.scala,种类选择:Object,OK
- 编写ScalaSparkWordCount.scala代码如下:
package demo
import org.apache.spark.{SparkConf, SparkContext}
object LocalWordCount {
def main(args: Array[String]): Unit = {
//设置Spark任务的配置选项
//setAppName("ScalaWordCount"):设置APP的名字为:ScalaWordCount
//setMaster("local"):设置Spark任务的运行模式为本地模式,不设的话,默认是Spark集群模式
val conf = new SparkConf().setAppName("ScalaWordCount").setMaster("local")
//根据配置创建SparkContext对象
val sc = new SparkContext(conf)
//从本地磁盘读入数据
val lines = sc.textFile("E:\\data.txt")
//进行分词操作
val words = lines.flatMap(_.split(" "));
//Map操作:每个单词记一次数
val wordPair = words.map((_,1)) //完整写法: words.map(x => (x,1))
//Reduce操作:将相同的Key的Value相加
val wordcount = wordPair.reduceByKey(_+_)
//调用Action算子:collect触发计算
val result = wordcount.collect()
//将结果打印在屏幕上
result.foreach(println)
//停止SparkContext对象
sc.stop()
}
}
说明:我们完全可以像上一节一样,将上述程序的运行模式设置为Spark集群模式(去掉setMaster(“local”),更改输入输出即可),并打包成Jar包放到集群中运行。但是这里演示的是一种开发调试过程中使用的本地模式,可以从本地磁盘中读取数据,将计算结果打印到屏幕上。
4.在IDEA中运行Spark程序
输入的文件E:\data.txt的内容:
I love Beijing
I love China
Beijing is the capital of China
按Ctrl + Shift + F10或者在代码上右键,Run “ScalaSparkWordCount”运行,结果如下:
image
本节介绍了使用IEDA开发工具,开发一个Spark任务的全过程,使用Spark任务的本地运行模式,可以直接在本地运行测试Spark任务,而不需要使用Spark集群测试。当本地测试通过后再修改为集群模式,打包上传到Spark集群去运行。祝你玩的愉快!