Spark 学习笔记
一、Spark 简介
基于内存计算的大数据并行计算框架
特点:
- 速度快
- 易用
- 通用
- 运行模式多样
二、Spark 生态系统
三、Spark 运行架构
RDD:Resillient Distributed Dataset(弹性分布式数据集)共享内存模型
DAG:有向无环图 反映 RDD 之间的依赖关系
Executor:运行在工作节点的一个进程,负责运行 Task
Application:用户编写的 Spark 应用程序
Task:运行在 Executor 上的工作单元
Job:一个 Job 包含多个 RDD 及作用于相应 RDD 上的各种操作
Stage:是 Job 的基本调度单位,一个 Job 会分为多组 Task,每组 Task 被称为 Stage,或者也被称为 TaskSet,代表了一组关联的、相互之间没有 Shuffle 依赖关系的任务组成的任务集
Spark 运行基本流程
RDD 在 Spark 中的运行过程:
创建 RDD 对象
SparkContext 负责计算 RDD 时间的依赖关系,构建DAG
DAGScheduler 负责把 DAG 图分解成多个 Stage, 每个 Stage 中包含了多个 Task,每个 Task 会 TaskScheduler
分发给各个 WorkerNode 上的 Executor 去执行
四、RDD 编程
1. RDD 创建
从文件系统中加载数据创建
sc.textFile("file:///")
本地文件系统sc.textFile("hdfs://地址")
分布式文件系统 HDFS通过并行集合(数组)创建 RDD
sc.parallelize()
2. RDD 操作 惰性求值
转换操作
filter:筛选、map:映射、flatMap、groupByKey()、reduceByKey()
行动操作 真正触发计算
count()
返回数据集中的元素个数
collect()
以数组的形式返回数据集中的所有元素
first()
返回数据集中的第一个元素
take(n)
以数组的形式返回数据集中的前n个元素
reduce(func)
通过函数 func(输入两个参数并返回一个值) 聚合数据集中的元素
foreach(func)
将数据集中的每个元素传递到函数func中运行
3. RDD 持久化
4. RDD 分区
5. 键值对 RDD
reduceByKey(func)
使用 func 函数合并具有相同键的值,用于对每个 key 对应的多个 value 进行 merge 操作,最重要的是它能够在本地先进行 merge 操作,并且 merge 操作可以通过函数自定义
groupByKey()
对具有相同 key 的 value 进行分组,但只生成一个 sequence,groupByKey 本身不能自定义函数,需要先用 groupByKey 生成 RDD,然后才能对此 RDD 通过 map 进行自定义函数操作
keys
只会把 Pair RDD 中的 key 返回形成一个新的 RDD
values
只会把 Pair RDD中 的 value 返回形成一个新的 RDD。
sortByKey()
返回一个根据键排序的 RDD,默认是升序排序
mapValues(func)
对键值对 RDD 中的每个 value 都应用一个函数,但是,key 不会发生变化
join
内连接,只有在两个数据集中都存在的 key 才会被输出,最终得到一个 (K,(V1,V2)) 类型的数据集。
combineByKey(createCombiner,mergeValue,mergeCombiners,partitioner ,mapSideCombine)
6. 共享变量
广播变量:把变量在所有节点的内存之间进行共享。缓存一个只读变量
通过调用 SparkContext.broadcast(v)
来从一个普通变量 v 中创建一个广播变量
通过调用 value
方法就可以获得这个广播变量的值,
累加器:支持在所有不同节点之间进行累加计算
通过调用 SparkContext.longAccumulator()
或者 SparkContext.doubleAccumulator()
来创建
只有任务控制节点(Driver Program)可以使用 value
方法来读取累加器的值
7. 数据读写
本地文件数据的读写
sc.textFile()
惰性机制,行动操作才进行加载
saveAsTextFile()
生成一个目录 part-00000 RDD 分区,再次加载只需要写这个目录
分布式文件系统读写
sc.textFile("hdfs://")
JSON 文件读写
sc.textFile()
对 json 进行解析 scala.util.parsing.json.Json 可以实现对 JSON 数据的解析
8. HBase
HBase 中需要根据行键、列族、列限定符和时间戳来确定一个单元格
HBase 需要时间戳是因为 HBAse 的底层是 HDFS,HDFS 要求一次写入不能进行修改,所以要修改单元格的数据只能生成新的版本,让最新的数指向最新的版本
四维坐标定位【行键、列族、列、版本时间戳】
一个单元格一个插入数据
五、Spark SQL
RDD 是分布式的 Java 对象的集合
DataFrame 是一种以 RDD 为基础的分布式数据集
spark.read.json()
读取 json 文件
spark.read.parquet("people.parquet")
spark.read.csv("people.csv")
- 本文作者: Kelly Liu
- 本文链接: http://tiantianliu2018.github.io/2020/06/12/Spark-学习笔记/
- 版权声明: 本博客所有文章除特别声明外,均采用 MIT 许可协议。转载请注明出处!