本文介绍了Windows下使用IntelliJ IDEA创建Maven工程的步骤,需要首先搭建Spark环境,搭建过程见另一篇博客——Windows下使用IntelliJ IDEA搭建Spark环境。
在欢迎界面点击Create New Project
(或者主界面点击File
,选择New
- Project
),在打开的页面左侧边栏中,选择Maven
,然后在右侧的Project SDK
一项中,查看是否是正确的JDK配置项(如果每一步严格按照上文中的步骤操作的话,正常来说这一栏会自动填充的,因为我们之前在之前已经配置过了全局的Project JDK了,如果这里没有正常显示JDK的话,可以点击右侧的New...按
钮,然后指定JDK安装路径的根目录即可),然后点击Next,来到Maven项目最重要三个参数的设置页面,这三个参数分别为:GroupId
, ArtifactId
和Version
。
为了更好的解释这三个字段,用Maven标识符来进行讲解。
<groupId>com.hfutgroupId>
<artifactId>spark-testartifactId>
<version>1.0version>
com.hfut
就可以非常好的来标志Apache的Spark这个项目了。一般来说可以使用倒序的公司网址来作为GroupId
,这可以类比为,沿袭了Java项目中使用倒序公司网址来作为Package名称的一个惯例。spark-test
就非常好的表示出了本项目主要是一个Spark程序的测试,从而能够与其他各种组件或架构很好的区分开来。 Spark在运行过程中需要条件很多依赖包,为了管理方便,我们通常使用Maven进行版本管理,这里以在pom.xml中添加spark-core
为例进行说明:
<dependency>
<groupId>org.apache.sparkgroupId>
<artifactId>spark-core_2.11artifactId>
<version>2.2.0version>
dependency>
注:本例artifactId中的版本号为scala版本号,version为spark版本号。
我们可以方便的从在线maven库里找到spark-core包:
以上使用了固定版本号,还可以让根据所安装的scala版本自己寻找对应的版本号,具体写法如下:
<dependency>
<groupId>org.apache.sparkgroupId>
<artifactId>spark-core_${scala.version}artifactId>
<version>${spark.version}version>
dependency>
至此,一个完整的Spark环境就可以使用了,此处给出一个pom文件代码:
<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.0modelVersion>
<groupId>com.hfutgroupId>
<artifactId>spark-testartifactId>
<version>1.0version>
<properties>
<project.build.sourceEncoding>UTF-8project.build.sourceEncoding>
<spark.version>2.2.0spark.version>
<scala.version>2.11scala.version>
<hadoop.version>2.7.3hadoop.version>
properties>
<dependencies>
<dependency>
<groupId>org.apache.sparkgroupId>
<artifactId>spark-core_${scala.version}artifactId>
<version>${spark.version}version>
dependency>
<dependency>
<groupId>org.apache.sparkgroupId>
<artifactId>spark-sql_${scala.version}artifactId>
<version>${spark.version}version>
dependency>
<dependency>
<groupId>org.apache.sparkgroupId>
<artifactId>spark-hive_${scala.version}artifactId>
<version>${spark.version}version>
dependency>
<dependency>
<groupId>org.apache.sparkgroupId>
<artifactId>spark-streaming_${scala.version}artifactId>
<version>${spark.version}version>
dependency>
<dependency>
<groupId>org.apache.hadoopgroupId>
<artifactId>hadoop-clientartifactId>
<version>2.6.0version>
dependency>
<dependency>
<groupId>org.apache.sparkgroupId>
<artifactId>spark-streaming-kafka_${scala.version}artifactId>
<version>${spark.version}version>
dependency>
<dependency>
<groupId>org.apache.sparkgroupId>
<artifactId>spark-mllib_${scala.version}artifactId>
<version>${spark.version}version>
dependency>
<dependency>
<groupId>mysqlgroupId>
<artifactId>mysql-connector-javaartifactId>
<version>5.1.39version>
dependency>
<dependency>
<groupId>junitgroupId>
<artifactId>junitartifactId>
<version>4.12version>
dependency>
dependencies>
<build>
<sourceDirectory>src/main/scalasourceDirectory>
<testSourceDirectory>src/test/scalatestSourceDirectory>
build>
project>
写完pom文件后,点击右下角提示中的Import Changes
即可引入对应的依赖包。
Tips:
src/main/scala
和src/test/scala
需要手动在对应项目目录下构建这两个文件夹路径,若不构建会报错(也可以直接在软件中设置)。 接下来,给出一个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.csdn.net/u013963380/article/details/71713582