本文介绍了Windows下使用IntelliJ IDEA创建Maven工程的步骤,需要首先搭建Spark环境,搭建过程见另一篇博客——Windows下使用IntelliJ IDEA搭建Spark环境。
1、 新建工程
在欢迎界面点击Create New Project
(或者主界面点击File
,选择New
- Project
),在打开的页面左侧边栏中,选择Maven
,然后在右侧的Project SDK
一项中,查看是否是正确的JDK配置项(如果每一步严格按照上文中的步骤操作的话,正常来说这一栏会自动填充的,因为我们之前在之前已经配置过了全局的Project JDK了,如果这里没有正常显示JDK的话,可以点击右侧的New...按
钮,然后指定JDK安装路径的根目录即可),然后点击Next,来到Maven项目最重要三个参数的设置页面,这三个参数分别为:GroupId
, ArtifactId
和Version
。
为了更好的解释这三个字段,用Maven标识符来进行讲解。
<groupId>com.hfut</groupId>
<artifactId>spark-test</artifactId>
<version>1.0</version>
- GroupId,可以理解为用来标志你整个项目组的,或者你这些代码属于某一个完整的项目,比如上面的
com.hfut
就可以非常好的来标志Apache的Spark这个项目了。一般来说可以使用倒序的公司网址来作为GroupId
,这可以类比为,沿袭了Java项目中使用倒序公司网址来作为Package名称的一个惯例。 - ArtifactId,一般是用来在整个项目组来标志本项目的,相比GroupId的范围,其概念要稍微小一些,比如
spark-test
就非常好的表示出了本项目主要是一个Spark程序的测试,从而能够与其他各种组件或架构很好的区分开来。 - Version,正如字面意思,就是本项目的迭代版本的信息,如上面的1.0。
2、 配置所需依赖包
Spark在运行过程中需要条件很多依赖包,为了管理方便,我们通常使用Maven进行版本管理,这里以在pom.xml中添加spark-core
为例进行说明:
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-core_2.11</artifactId>
<version>2.2.0</version>
</dependency>
注:本例artifactId中的版本号为scala版本号,version为spark版本号。
我们可以方便的从在线maven库里找到spark-core包:
以上使用了固定版本号,还可以让根据所安装的scala版本自己寻找对应的版本号,具体写法如下:
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-core_${scala.version}</artifactId>
<version>${spark.version}</version>
</dependency>
至此,一个完整的Spark环境就可以使用了,此处给出一个pom文件代码:
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.hfut</groupId>
<artifactId>spark-test</artifactId>
<version>1.0</version>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<spark.version>2.2.0</spark.version>
<scala.version>2.11</scala.version>
<hadoop.version>2.7.3</hadoop.version>
</properties>
<dependencies>
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-core_${scala.version}</artifactId>
<version>${spark.version}</version>
</dependency>
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-sql_${scala.version}</artifactId>
<version>${spark.version}</version>
</dependency>
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-hive_${scala.version}</artifactId>
<version>${spark.version}</version>
</dependency>
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-streaming_${scala.version}</artifactId>
<version>${spark.version}</version>
</dependency>
<dependency>
<groupId>org.apache.hadoop</groupId>
<artifactId>hadoop-client</artifactId>
<version>2.6.0</version>
</dependency>
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-streaming-kafka_${scala.version}</artifactId>
<version>${spark.version}</version>
</dependency>
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-mllib_${scala.version}</artifactId>
<version>${spark.version}</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.39</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
</dependencies>
<build>
<sourceDirectory>src/main/scala</sourceDirectory>
<testSourceDirectory>src/test/scala</testSourceDirectory>
</build>
</project>
写完pom文件后,点击右下角提示中的Import Changes
即可引入对应的依赖包。
Tips:
- 这里面会有
src/main/scala
和src/test/scala
需要手动在对应项目目录下构建这两个文件夹路径,若不构建会报错(也可以直接在软件中设置)。 - 如果依赖包导入速度慢,可以更改Maven源为阿里云。
3、 一个Wordcount程序
接下来,给出一个Wordcount
小程序的开发过程:
如果已经设置了Scala SDK
的全局变量,在src/main/scala
文件夹下,右键新建Package
,输入package的名字,我这里是com.test
然后新建Scala class
, 然后输入名字将类型改为object
,如下图:
Tips:
如果没有新建Scala class
选项,可以通过以下方法解决:
- 方法一:
在Project Structure
中选择Global Libraries
,这时候会在中间一栏位置处出现Scala的SDK,在其上右键点击后选择Copy to Modules
。 - 方法二:
新建一个File
文件,后缀改成.scala
,点ok后文件中空白区会显示没有scala的SDK,这个时候你点击提示信息就可以添加本地的scala SDK(提前你的电脑上已经安装了scala,这个时候它会自动的去识别SDK),效果与方法一一样。
代码实例:
package com.test
import org.apache.spark.{SparkContext, SparkConf}
object WordCountLocal {
def main(args: Array[String]) {
/**
* SparkContext 的初始化需要一个SparkConf对象
* SparkConf包含了Spark集群的配置的各种参数
*/
val conf = new SparkConf()
.setMaster("local") //启动本地化计算
.setAppName("testRdd") //设置本程序名称
//Spark程序的编写都是从SparkContext开始的
val sc = new SparkContext(conf)
//以上的语句等价与val sc=new SparkContext("local","testRdd")
val data = sc.textFile("e://hello.txt") //读取本地文件
data.flatMap(_.split(" ")) //下划线是占位符,flatMap是对行操作的方法,对读入的数据进行分割
.map((_, 1)) //将每一项转换为key-value,数据是key,value是1
.reduceByKey(_ + _) //将具有相同key的项相加合并成一个
.collect() //将分布式的RDD返回一个单机的scala array,在这个数组上运用scala的函数操作,并返回结果到驱动程序
.foreach(println) //循环打印
}
}
如果能正确的打印出结果,说明spark示例运行成功,打包及提交方式将在下一篇博客中写到,点击查看。
参考链接:
http://blog.youkuaiyun.com/u013963380/article/details/71713582