Spark(一)
一、 Spark 概述
1、Spark 是什么
Spark 是一种基于内存的快速、通用、可扩展的大数据分析计算引擎。
2、Spark and Hadoop
Hadoop:
- Hadoop 是由 java 语言编写的,在分布式服务器集群上存储海量数据并运行分布式
分析应用的开源框架 - MapReduce 是一种编程模型,Hadoop 根据 Google 的 MapReduce 论文将其实现,
作为 Hadoop 的分布式计算模型,是 Hadoop 的核心。基于这个框架,分布式并行
程序的编写变得异常简单。综合了 HDFS 的分布式存储和 MapReduce 的分布式计
算,Hadoop 在处理海量数据时,性能横向扩展变得非常容易 - HBase 是对 Google 的 Bigtable 的开源实现,但又和 Bigtable 存在许多不同之处。
HBase 是一个基于 HDFS 的分布式数据库,擅长实时地随机读/写超大规模数据集。
它也是 Hadoop 非常重要的组件
Spark:
- Spark 是一种由 Scala 语言开发的快速、通用、可扩展的大数据分析引擎
- Spark Core 中提供了 Spark 最基础与最核心的功能
- Spark SQL 是 Spark 用来操作结构化数据的组件。通过 Spark SQL,用户可以使用
SQL 或者 Apache Hive 版本的 SQL 方言(HQL)来查询数据 - Spark Streaming 是 Spark 平台上针对实时数据进行流式计算的组件,提供了丰富的
处理数据流的 API
Spark 和Hadoop 的根本差异是多个作业之间的数据通信问题 : Spark 多个作业之间数据
通信是基于内存,而 Hadoop 是基于磁盘
我们可以看出在绝大多数的数据计算场景中,Spark 确实会比 MapReduce
更有优势。但是 Spark 是基于内存的,所以在实际的生产环境中,由于内存的限制,可能会
由于内存资源不够导致 Job 执行失败,此时,MapReduce 其实是一个更好的选择,所以 Spark
并不能完全替代 MR
3、Spark 核心模块
① Spark Core:
Spark Core 中提供了 Spark 最基础与最核心的功能,Spark 其他的功能如:Spark SQL,
Spark Streaming,GraphX, MLlib 都是在 Spark Core 的基础上进行扩展的
② Spark SQL:
Spark SQL 是 Spark 用来操作结构化数据的组件。通过 Spark SQL,用户可以使用 SQL
或者 Apache Hive 版本的 SQL 方言(HQL)来查询数据
③ Spark Streaming:
Spark Streaming 是 Spark 平台上针对实时数据进行流式计算的组件,提供了丰富的处理
数据流的 API。
④ Spark MLlib:
MLlib 是 Spark 提供的一个机器学习算法库。MLlib 不仅提供了模型评估、数据导入等
额外的功能,还提供了一些更底层的机器学习原语
⑤ Spark GraphX:
GraphX 是 Spark 面向图计算提供的框架与算法库
二、Spark 快速上手
1、创建 Maven 项目
1.1、增加依赖关系
修改 Maven 项目中的 POM 文件,增加 Spark 框架的依赖关系。
<dependencies>
<dependency>
<groupId>org.apache.spark</groupId>
<artifactId>spark-core_2.12</artifactId>
<version>3.0.0</version>
</dependency>
</dependencies>
1.2、WordCount
object Spark01_WordCount {
def main(args: Array[String]): Unit = {
// Application
// Spark框架
// TODO 建立和Spark框架的连接
// JDBC : Connection
val sparConf = new SparkConf().setMaster("local").setAppName("WordCount")
val sc = new SparkContext(sparConf)
// TODO 执行业务操作
// 1. 读取文件,获取一行一行的数据
// hello world
val lines:RDD[String] = sc.textFile("datas")
// 2. 将一行的数据进行拆分,形成一个一个的单词(分词)
// 扁平化操作:将整体拆分为个体的操作
// “hello world” => hello,world,hello ,world
val words: RDD[String] = lines.flatMap(_.split(" "))
// 3. 将数据根据单词进行分组,便于统计
// (hello,hello,hello),(world,world,world,world)
val wordGroup: RDD[(String, Iterable[String])] = words.groupBy(word=>word)
// 4. 对分组后的数组进行转换
// (hello 3),(world 4)
val wordToCount = wordGroup.map {
case ( word,list) => {
(word,list.size)
}
}
// 5. 将转换结果采集到控制台打印出来
val array: Array[(String, Int)] = wordToCount.collect()
array.foreach(println)
// TODO 关闭连接
sc.stop()
}
}
object Spark02_WordCount {
def main(args: Array[String]): Unit = {
// Application
// Spark框架
// TODO 建立和Spark框架的连接
// JDBC : Connection
val sparConf = new SparkConf().setMaster("local").setAppName("WordCount")
val sc = new SparkContext(sparConf)
// TODO 执行业务操作
val lines:RDD[String] = sc.textFile("datas")
val words: RDD[String] = lines.flatMap(_.split(" "))
val wordToOne : RDD[(String, Int)] = words.map(
word => (word, 1)
)
val wordGroup: RDD[(String, Iterable[(String, Int)])] = wordToOne.groupBy(
t => t._1
)
val wordToCount = wordGroup.map {
case ( word,list) => {
list.reduce(
(t1,t2) =>{
(t1._1,t1._2+t2._2)
}
)
}
}
// 5. 将转换结果采集到控制台打印出来
val array: Array[(String, Int)] = wordToCount.collect()
array.foreach(println)
// TODO 关闭连接
sc.stop()
}
}
object Spark03_WordCount {
def main(args: Array[String]): Unit = {
// Application
// Spark框架
// TODO 建立和Spark框架的连接
// JDBC : Connection
val sparConf = new SparkConf().setMaster("local").setAppName("WordCount")
val sc = new SparkContext(sparConf)
// TODO 执行业务操作
val lines:RDD[