spark
一、关于spark
1.1 What is spark
Spark是一种基于内存的快速、通用、可扩展的Big Data 计算引擎
1.2spark的特点
快速:Spark基于内存的运算是Hadoop的MapReducer的100倍,快相对于Hadoop的MapReducer而言。、
Spark实现了高效的DAG执行引擎,可以通过基于内存来高效的处理数据流。
DAG(有向无环图)
通用:Spark 结合了SQL, Streaming和复杂分析.Spark 提供了大量的类库, 包括 SQL 和 DataFrames, 机器学习(MLlib), 图计算(GraphicX), 实时流处理(Spark Streaming) .
易用:Spark 支持 Scala, Java, Python, R 和 SQL 脚本, 并提供了超过 80 种高性能的算法, 非常容易创建并行 App
可融合性:Spark 可以使用 Hadoop 的 YARN 和 Apache Mesos 作为它的资源管理和调度器, 并且可以处理所有Hadoop 支持的数据, 包括 HDFS, HBase等
上图:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sH7Ypzlb-1596092343489)(img\微信截图_20200730102935.png)]
1.3 Spark 与 Hadoop的区别
1.3.1 功能上的区别
小结:HDFS 的分布式存储和 MapReduce 的分布式计算,使Hadoop在处理海量数据时,性能横向扩展变的更加容易。
小结:Spark主要用于计算。
1.3.2 Spark的优势
①Spark就是在传统的MapReduce 计算框架的基础上,利用其计算过程的优化,从而大大加快了数据分析、挖掘的运行和读写速度,并将计算单元缩小到更适合并行计算和重复使用的RDD计算模型。
②是一个分布式数据快速分析项目。它的核心技术是弹性分布式数据集(Resilient Distributed Datasets),提供了比MapReduce丰富的模型,可以快速在内存中对数据集进行多次迭代,来支持复杂的数据挖掘算法和图形计算算法。
③Spark基于scala语言擅长机器学习中基于数据集或者数据集的衍生数据反复查询反复操作的ALS、凸优化梯度和交互式数据挖掘。
1.3.3 Spark与Hadoop的差异
Spark Core中提供了Spark最基础与最核心的功能,Spark其他的功能如:Spark SQL,Spark Streaming,GraphX, MLlib都是在Spark Core的基础上进行扩展的
二、 Spark 快速上手
2.1创建一个Maven的项目
2.1.1添加Scala插件(采用Idea)
在创建的maven项目上右键
2.1.2 在pom.xml中添加依赖
<dependencies>
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-core_2.12</artifactId>
<version>3.0.0</version>
</dependency>
</dependencies>
<build>
<plugins>
<!-- 该插件用于将Scala代码编译成class文件 -->
<plugin>
<groupId>net.alchim31.maven</groupId>
<artifactId>scala-maven-plugin</artifactId>
<version>3.2.2</version>
<executions>
<execution>
<!-- 声明绑定到maven的compile阶段 -->
<goals>
<goal>compile</goal>
</goals>
</execution>
</executions>
</plugin>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-assembly-plugin</artifactId>
<version>3.0.0</version>
<configuration>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
</configuration>
<executions>
<execution>
<id>make-assembly</id>
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
2.1.3 Word Count案例
在刚创建的module --> src -->main -->创建一个目录(spark,目录名任意)
在该目录上鼠标右击
然后该目录变成浅蓝色就OK了
在该目录下创建一个Scala文件
写入一下代码:
其中文件目录可以写相对路径和绝对路径,本人以绝对路径为例
val rdd: RDD[String] = sparkContext.textFile("D:\\0421hadoop\\Spark\\input")
object WordCount {
/*
SparkConf: 整个应用的全局的配置对象,一旦创建之后,对自动读取系统中的spark.*开头的变量!
用户也可以调用对象,手动设置,手动设置优先级更高!
SparkContext: Spark的应用上下文!一个SparkContext就代表和Spark集群的一个连接!
可以用来创建RDD,累加器,广播变量,进行编程!
RDD,累加器,广播变量:spark中的编程模型,类似Mapper,Reducer,Combiner
*/
def main(args: Array[String]): Unit = {
//创建Spark的配置对象
val conf :SparkConf = new SparkConf().setMaster("local").setAppName("My app")
//创建应用上下文
val sparkContext = new SparkContext(conf)
/*
textFile:读取文件系统(hdfs ,本地)中的一个UTF-8编码的文本文件,返回RDD[String],RDD中的每一个元素就是一行内容!
本质是使用Hadoop提供给的 InputFormat 类读取文件中的数据!
InputFormat ----> TextInputFormat ----><每行数据的偏移量,一行内容>
暂且理解RDD是一个集合!可以使用Scala中的集合操作的方法,操作RDD!
Spark中提供了和Scala集合操作同名,同功效的方法!
collect():将结果收集到Driver端
将RDD中定义的方法,称为算子!
分为两类:
Transform operation:转换算子 将一个RDD转为另一个RDD
懒执行!
Action operation:行动算子 真正提交Job,运行Job
*/
// 读取文件,基于读取的数据,创建一个RDD hello hello hello
val rdd: RDD[String] = sparkContext.textFile("D:\\0421hadoop\\Spark\\input")
//hello hello hello ---> hello,hello,hello
val rdd1: RDD[String] = rdd.flatMap(line=>line.split(" "))
//hello,hello,hello ---->Map[单词,Iterable[单词]]
val rdd2: RDD[(String, Iterable[String])] = rdd1.groupBy(word=>word)
//Map[单词,Iterable[单词]] ----> Map[单词,个数]
val rdd3: RDD[(String, Int)] = rdd2.map {
case (word, wordList) => (word, wordList.size)
}
//在控制台打印
println(rdd3.collect().mkString(","))
Thread.sleep(10000)
//关闭上下文
sparkContext.stop()
}
}
我的文件目录如下
文件内容为
word.txt
hello evevyone i am bao qing kun
and i am every handsum
you are very handsum
everyone is very handsum
word1.txt
hello hello hello da jia hao
wo shi bao qing kun
bao qing ku jiu shi wo
wo zhang de hen shuai
运行即可
出现一下内容则表示成功
dsum
everyone is very handsum
word1.txt
hello hello hello da jia hao
wo shi bao qing kun
bao qing ku jiu shi wo
wo zhang de hen shuai
运行即可
出现一下内容则表示成功
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200801082724495.png)
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200801082709645.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQxNTA0NTg1,size_16,color_FFFFFF,t_70)