文章目录
-
- 一、SparkCore
- 二、算子
-
- 1.Transformations转换算子
-
- 1.1 filter算子
- 1.2 map算子
- 1.3 flatMap算子
- 1.4 sample算子
- 1.5 reduceByKey算子
- 1.6 sortByKey与sortBy算子
- 1.7 join算子
- 1.8 union算子
- 1.9 intersection算子
- 1.10 subtract算子
- 1.11 mapPartition算子
- 1.12 distinct算子(map+reduceByKey+map)
- 1.13 cogroup算子
- 1.14 mapPartitionWithIndex算子
- 1.15 repartition算子
- 1.16 coalesce算子
- 1.17 groupByKey算子
- 1.18 zip算子
- 1.19 zipWithIndex算子
- 2.Action行动算子
- 3.控制算子(持久化算子)
- 课程地址:spark讲解
- Scala | Spark基础入门 | IDEA配置 | 集群搭建与测试
- Scala | Spark核心编程 | SparkCore | 算子
- Scala | 宽窄依赖 | 资源调度与任务调度 | 共享变量 | SparkShuffle | 内存管理
- Scala | SparkSQL | 创建DataSet | 序列化问题 | UDF与UDAF | 开窗函数
一、SparkCore
1.RDD
1.1 概念
RDD(Resilient Distributed Dataset) ,弹性分布式数据集。
1.2 RDD的五大属性(重点)
- RDD 是由一系列的 partition 组成的。
- 函数是作用在每一个 partition(split)上的。
- RDD 之间有一系列的依赖关系。
- 分区器是作用在 K,V 格式的 RDD 上。
- RDD 提供一系列最佳的计算位置,体现了大数据中“计算移动数据不移动”的理念。
1.3 RDD理解图
注意:
-
textFile
方法底层封装的是MR
读取文件的方式,读取文件之前先split
,默认split
大小是一个block
大小。 -
RDD
实际上不存储数据,这里方便理解,暂时理解为存储数据。 -
什么是
K、V 格式的 RDD
?
如果RDD
里面存储的数据都是二元组对象,那么这个 RDD 我们就叫做 K,V 格式的 RDD。 -
哪里体现
RDD
的弹性?
RDD
是由 一系列的partition
组成。其大小和数量都是可以改变的,默认情况下,partition的个数和block块个数相同,体现了RDD
的弹性。 -
哪里体现
RDD
的容错?
RDD
之间存在依赖关系,子RDD可以找出对应的父RDD然后通过一系列计算得到相应结果,这就是容错的体现。 -
哪里体现
RDD
的分布式?RDD
是由Partition
组成,partition
是分布在不同节点上的。RDD
提供计算最佳位置,体现了数据本地化。体现了大数据中“计算移动数据不移动”的理念。
2.Spark任务执行原理
以standalone模式为例,Standalone模式是Spark自带的一种集群模式,Standalone模式是真实地在多个机器之间搭建Spark集群的环境,完全可以利用该模式搭建多机器集群,用于实际的大数据处理。
以上图中有四个机器节点,Driver 和 Worker 是启动在节点上的进程,运行在 JVM 中的进程。其中:
- Master角色以Master进程存在, Worker角色以Worker进程存在
- Driver和Executor运行于Worker进程内, 由Worker提供资源供给它们运行
- Driver 与集群节点之间有频繁的通信。
- Driver 负责任务(tasks)的分发和结果的回收。任务的调度。如果 task的计算结果非常大就不要回收了。会造成 oom。
这里只是做了简单介绍,更多可查看Spark四种运行模式介绍
3.Spark代码流程
- 创建
SparkConf
对象- 可以设置
Application name
。 - 可以设置运行模式及资源需求。
- 可以设置
- 创建
SparkContext
对象 - 基于
SparkContext
即上下文环境对象创建一个RDD
,对RDD
进行处理。 - 应用程序中要有
Action
类算子来触发Transformation
类算子执行。 - 关闭
Spark
上下文对象。
二、算子
常见的算子如下图所示,主要也分为如下几种:
1.Transformations转换算子
Transformations 类算子是一类算子(函数)叫做转换算子,如map,flatMap,reduceByKey 等。Transformations 算子是延迟执行,也叫懒加载执行。
1.1 filter算子
filter
:过滤符合条件的记录数,true 保留,false 过滤掉。
Operator_filter.scala
:
package com.shsxt.scalaTest.core.transform_operator
import org.apache.spark.{
SparkConf, SparkContext}
object Operator_filter {
def main(args: Array[String]): Unit = {
val conf = new SparkConf()
conf.setMaster("local").setAppName("filter")
val sc = new SparkContext(conf)
val lines = sc.textFile("data/word.txt")
val result = lines.filter {
_.indexOf("Spark") >= 0 }
result.foreach {
println}
sc.stop()
}
}
hello Spark
1.2 map算子
map
:将一个 RDD 中的每个数据项,通过 map 中的函数映射变为一个新的元素。
特点:输入一条,输出一条数据。
package com.shsxt.scalaTest.core.transform_operator
import org.apache.spark.{
SparkConf, SparkContext}
object Operator_map {
def main(args: Array[String]): Unit = {
val conf = new SparkConf()
conf.setMaster("local").setAppName("map")
val sc = new SparkContext(conf)
val lines = sc.textFile("data/word.txt")
val result = lines.map {
_.split(" ") }
result.foreach(println)
sc.stop()
}
}
[Ljava.lang.String;@1c200b99
[Ljava.lang.String;@1ae41188
[Ljava.lang.String;@72a7be25
[Ljava.lang.String;@26de52e0
1.3 flatMap算子
flatMap
:先 map
后 flat
。与 map 类似,每个输入项可以映射为 0 到多个输出项。
package com.shsxt.scalaTest.core.transform_operator
import org.apache.spark.{
SparkConf, SparkContext}
object Operator_flatMap {
def main(args: Array[String]): Unit = {
val conf = new SparkConf()
conf.setMaster("local").setAppName("flatMap")
val sc = new SparkContext(conf)
val lines = sc.textFile("data/word.txt")
val result = lines.flatMap {
_.split(" ")}
result.foreach(println)
sc.stop()
}
}
hello
tiantian
hello
shsxt
hello
gzsxt
hello
Spark
1.4 sample算子
sample
:随机抽样算子,根据传进去的小数按比例进行有放回或者无放回的抽样。
package com.shsxt.scalaTest.core.transform_operator
import org.apache.spark.{
SparkConf, SparkContext}
object Operator_sample {
def main(args: Array[String]): Unit = {
val conf = new SparkConf()
conf.setMaster("local").setAppName("sample")
val sc = new SparkContext(conf)
val lines = sc.textFile("data/word.txt")
lines.sample(true, 0.5,10).foreach(println)
}
}
hello shsxt
1.5 reduceByKey算子
reduceByKey
:将相同的 Key 根据相应的逻辑进行处理。
package com.shsxt.scalaTest.core.transform_operator
import org.apache.spark.{
SparkConf, SparkContext}
object Operator_reduceByKey {
def main(args: Array[String]): Unit = {
val conf = new SparkConf()
conf.setMaster("local").setAppName("reduceByKey")
val sc = new SparkContext(conf)
val lines = sc.textFile("data/word.txt")
val flatMap = lines.flatMap {
_.split(" ")}
val map = flatMap.map {
(_,1)}
map.reduceByKey(_+_).foreach(println)
sc.stop()
}
}
(Spark,1)
(shsxt,1)
(tiantian,1)
(hello,4)
(gzsxt,1)
1.6 sortByKey与sortBy算子
sortByKey/sortBy
:作用在 K、V 格式的 RDD 上,对 key 进行升序或者降序排序。
package com.shsxt.scalaTest.core.transform_operator
import org.apache.spark.{
SparkConf, SparkContext}
object Operator_sortByKey {
def main(args: Array[String]): Unit = {
val conf = new SparkConf()
conf.setMaster("local").setAppName("sortByKey")
val sc = new SparkContext(conf)
val lines = sc.textFile("data/word.txt")
val reduceResult = lines.flatMap {
_.split(" ")}.map {
(_,1)}.reduceByKey(_+_)
reduceResult.map(f => {
(f._2,f._1)}).sortByKey(false).map(f => {
(f._2,f._1)}).foreach(println)
sc.stop()
}
}
(hello,4)
(Spark,1)
(shsxt,1)
(tiantian,1)
(gzsxt,1)
package com.shsxt.scalaTest.core.transform_operator
import org.apache.spark.{
SparkConf, SparkContext}
object Operator_sortBy {
def main(args: Array[String]): Unit = {
val conf = new SparkConf()
conf.setMaster("local").setAppName("sortBy")
val sc = new SparkContext(conf)
val lines = sc.textFile("data/word.txt")
val reduceResult = lines.flatMap {
_.split(" ")}.map{
(_,1)}.reduceByKey(_+_)
val result = reduceResult.sortBy(_._2,false)
result.foreach{
println}
sc.stop()
}
}
(hello,4)
(Spark,1)
(shsxt,1)
(tiantian,1)
(gzsxt,1)
1.7 join算子
join
算子:作用在 K,V
格式的 RDD 上。根据 K
进行连接,对(K,V)join(K,W)
返回(K,(V,W))
leftOuterJoin
算子rightOuterJoin
算子fullOuterJoin
算子
注意:join 后的分区数与父 RDD 分区数多的那一个相同。
package com.shsxt.scalaTest.core.transform_operator
import org.apache.spark.rdd.RDD
import org.apache.spark.{
SparkConf, SparkContext}
object Operator_Join {
def main(args: Array[String]): Unit = {
val conf = new SparkConf()
conf.setMaster("local").setAppName("flatMap")
val sc = new SparkContext(conf)
val rdd1 = sc.parallelize(
Array(("a",1),("b",2),("c",3)),
3
)
val rdd2 = sc.parallelize(
Array(("a",1),("d",2),("e",3)),
2
)
val result1: RDD[(String, (Int, Int))] = rdd1.join(rdd2)