1.maven安装及搭建 (参照word文档搭建)
a.下载maven3.3.9版本。解压至D,将m2放到解压后的路径中
b.配置本地仓库
修改{Maven_HOME}/conf/settings.xml
添加以下内容(本地仓库位置最好不要放在C盘,因为我们需要在线下载jar包):
D:\Maven-3.3.9\m2\repository
c.IDEA配置Maven
【Setting】–>【Build,Execution,Deployment】–>【Build Tools】–> 【Maven】
修改【Maven home directory】 = “D:\Maven-3.3.9”
【Users setting file】 = “D:\Maven-3.3.9\conf\settings.xml”
【local repository】 = “D:\Maven-3.3.9\m2\repository”
d.基于Maven构建Scala工程 File–>new -->Project/Modules 选择Maven
指定groupId=com.crx //说明:设置Maven库中所在的组
指定artifactId = scala //说明:设置唯一标识
指定version = 1.0.0 //说明:设置版本号
d.src -> new Director,标记为source
f.File->Modules-> Dependencies ->选择Maven scala或scala-sdk-2.11.8
http://mvnrepository.com
搜索:scala
点击:Scala Library --> 2.11.8
pom.xml 增加内容(改为2.11.9 查看路径下,下载版本D:\Maven-3.3.9\m2\repository\org\scala-lang\scala-library)
<dependencies>
<dependency>
<groupId>org.scala-lang</groupId>
<artifactId>scala-library</artifactId>
<version>2.11.8</version>
</dependency>
</dependencies>
刷新后,会出来Dependencies
下载源码包:Maven Project->Dependencies->右键Downlod Source
到manven下找到2.11.8
Lifecycle --> mvn compile 编译源代码
mvn deploy 发布项目
mvn test-compile 编译测试源代码
mvn test 运行应用程序中的单元测试
mvn site 生成项目相关信息的网站
mvn clean 清除项目目录中的生成结果
mvn package 根据项目生成的jar
mvn install 在本地Repository中安装jar
1.构建独立应用,采用Maven搭建Spark应用程序
a. 1.新建spark的project项目构建maven项目
2.本地仓库seting修改 右边compile (每次创建 项目本地仓库都需要修改)
3.File -->Project Structure..选择+ -->lib 选scala -->Dependences 勾选scala-sdk-2.11.8
4.https://mvnrepository.com/search?q=spark
Spark Project Core
5.加载spark-core_2.11依赖库 -->Import Changes -->2.1.2:
<dependencies>
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-core_2.11</artifactId>
<version>2.1.2</version>
</dependency>
</dependecies>
注意:spark-core_{版本号},版本号应为scala的对应版本
version为spark 2.1.2
6.创建spark文件 标记为源码包
main -->新建文件夹 (sparkTest) -->右键Mark Directory as -->Resources Root
b.编写spark Driver端程序
1).创建SparkConf对象,并指定集群模式和AppName;
2).创建SparkContext对象,生成sc
3).创建RDD
4).针对业务需求,编写相应的RDD操作
创建sc对象两种方式
1)spark shell: 直接可以用sc对象
2)javaAPI:先创建SparkConf,再通过SparkConf创建SparkContext
val conf = new SparkConf().setMaster("local").setAppName("wordcount")
val sc = new SparkContext(conf)
sc创建RDD3种方式
1)由外部存储系统的数据集创建,包括本地的文件系统,还有所有Hadoop支持的数据集,比如HDFS、Cassandra、HBase等
rdd2 = sc.textFile("hdfs://slave1:9000/words.txt")
2)由一个已经存在的集合创建。
rdd1 = sc.parallelize(Array(1,2,3,4,5,6,7,8))
3)由一个已经存在的集合创建makeRDD
rdd3 = sc.makeRDD(Array(1,2,3,4,5,6,7,8))
例1:
import org.apache.spark.{SparkConf,SparkContext}
object WordCount {
def main(args: Array[String]): Unit = {
//构建Spark的conf对象,并通过setMaster方法设置集群模式运行的方式{“本地”},通过setAppName方法指定应用名字
val conf = new SparkConf().setMaster("local").setAppName("ListTest")
val sc = new SparkContext(conf);
val rdd = sc.parallelize(List(1,3,5,2,56))
println(rdd.count())
}
}
例2:
import org.apache.spark.{SparkConf,SparkContext}
object WordCount {
def main(args: Array[String]): Unit = {
//构建Spark的conf对象,并通过setMaster方法设置集群模式运行的方式{“本地”},通过setAppName方法指定应用名字
val conf = new SparkConf().setMaster("local").setAppName("wordcount")
val sc = new SparkContext(conf);
val rdd = sc.textFile("file:///E:/inputwordcount")
//1.统计rdd的行数
println(rdd.count())
}
}
2.WordCount案例
object WordCount {
def main(args: Array[String]): Unit = {
//构建Spark的conf对象,并通过setMaster方法设置集群模式运行的方式{“本地”},通过setAppName方法指定应用名字
val conf = new SparkConf().setMaster("local").setAppName("wordcount")
val sc = new SparkContext(conf);
val rdd = sc.textFile("file:///D:/测试数据/spark_wordcount.txt")
//中间结果保存
// val rdd1 = rdd.flatMap(x=> x.split(" "))
// val rdd2 = rdd1.map(x=>(x,1))
// val rdd3 = rdd2.reduceByKey((x,y)=>x+y)
//saveAsTextFile是无返回值类型的,所以不用接收返回类型
// rdd3.saveAsTextFile("file:///D:/测试数据/spark_wordcount_res")
//1)收集rdd数据到当前节点再转为list打印输出,即将磁盘的数据输出到控制台
println(rdd.collect().toList)
rdd.flatMap(_.split(" ")).map((_,1)).reduceByKey(_+_).saveAsTextFile("file:///E:/spark_wordcount_res0")
//2)用foreach实现
rdd2.collect().toList.foreach(println(_))
}
总结mapreduce和spark的区别:
mapreduce运行wordcount例子里map和reduce中间结果不保留
spark可以保存中间结果 rdd3可以save,rdd2也可以save,所有的中间结果都可以保存起来
对应的 SQL 查询语句会是这样:
SELECT word, COUNT(*) as count FROM raw_words GROUP BY word;