- 目标
-
Spark
的进化过程当中, 一个很是重要的组成部分就是编程模型的进化, 经过编程模型能够看得出来内在的问题和解决方案shell - 过程
-
-
编程模型
RDD
的优势和缺陷apache -
编程模型
DataFrame
的优势和缺陷编程 -
编程模型
Dataset
的优势和缺陷
-
回顾和展望前端
入门案例java
Stuctured Streaming
的体系和结构node
Structured Streaming
是 Spark Streaming
的进化版, 若是了解了 Spark
的各方面的进化过程, 有助于理解 Structured Streaming
的使命和做用python
Spark
的 API
进化过程mysql
Spark
的序列化进化过程算法
Spark Streaming
和 Structured Streaming
sql
Spark
的进化过程当中, 一个很是重要的组成部分就是编程模型的进化, 经过编程模型能够看得出来内在的问题和解决方案shell
编程模型 RDD
的优势和缺陷apache
编程模型 DataFrame
的优势和缺陷编程
编程模型 Dataset
的优势和缺陷
编程模型 | 解释 |
---|---|
|
rdd.flatMap(_.split(" ")) .map((_, 1)) .reduceByKey(_ + _) .collect
|
|
spark.read .csv("...") .where($"name" =!= "") .groupBy($"name") .show()
|
|
spark.read .csv("...") .as[Person] .where(_.name != "") .groupByKey(_.name) .count() .show()
|
RDD
的优势
面向对象的操做方式
能够处理任何类型的数据
RDD
的缺点
运行速度比较慢, 执行过程没有优化
API
比较僵硬, 对结构化数据的访问和操做没有优化
DataFrame
的优势
针对结构化数据高度优化, 能够经过列名访问和转换数据
增长 Catalyst
优化器, 执行过程是优化的, 避免了由于开发者的缘由影响效率
DataFrame
的缺点
只能操做结构化数据
只有无类型的 API
, 也就是只能针对列和 SQL
操做数据, API
依然僵硬
Dataset
的优势
结合了 RDD
和 DataFrame
的 API
, 既能够操做结构化数据, 也能够操做非结构化数据
既有有类型的 API
也有无类型的 API
, 灵活选择
Spark
中的序列化过程决定了数据如何存储, 是性能优化一个很是重要的着眼点, Spark
的进化并不仅是针对编程模型提供的 API
, 在大数据处理中, 也必需要考虑性能
序列化和反序列化是什么
Spark
中什么地方用到序列化和反序列化
RDD
的序列化和反序列化如何实现
Dataset
的序列化和反序列化如何实现
Spark
中的序列化和反序列化的应用场景
RDD
的序列化
DataFrame
和
Dataset
中的序列化
当须要将对象缓存下来的时候, 或者在网络中传输的时候, 要把对象转成二进制, 在使用的时候再将二进制转为对象, 这个过程叫作序列化和反序列化
在 Spark
中有不少场景须要存储对象, 或者在网络中传输对象
Task
分发的时候, 须要将任务序列化, 分发到不一样的 Executor
中执行
缓存 RDD
的时候, 须要保存 RDD
中的数据
广播变量的时候, 须要将变量序列化, 在集群中广播
RDD
的 Shuffle
过程当中 Map
和 Reducer
之间须要交换数据
算子中若是引入了外部的变量, 这个外部的变量也须要被序列化
RDD
由于不保留数据的元信息, 因此必需要序列化整个对象, 常见的方式是 Java
的序列化器, 和 Kyro
序列化器
Dataset
和 DataFrame
中保留数据的元信息, 因此能够再也不使用 Java
的序列化器和 Kyro
序列化器, 使用 Spark
特有的序列化协议, 生成 UnsafeInternalRow
用以保存数据, 这样不只能减小数据量, 也能减小序列化和反序列化的开销, 其速度大概能达到 RDD
的序列化的 20
倍左右
理解 Spark Streaming
和 Structured Streaming
之间的区别, 是很是必要的, 从这点上能够理解 Structured Streaming
的过去和产生契机
Spark Streaming
时代
Structured Streaming
时代
Spark Streaming
和 Structured Streaming
Spark Streaming
时代
Structured Streaming
时代
Spark Streaming
和
Structured Streaming
了解 Structured Streaming
的编程模型, 为理解 Structured Streaming
时候是什么, 以及核心体系原理打下基础
需求梳理
Structured Streaming
代码实现
运行
验证结果
理解接下来要作的案例, 有的放矢
需求
总体结构
开发方式
简单来讲, 就是要进行流式的词频统计, 使用 Structured Streaming
实现 Structured Streaming
部分的代码编写
建立文件
建立 SparkSession
读取 Socket
数据生成 DataFrame
将 DataFrame
转为 Dataset
, 使用有类型的 API
处理词频统计
生成结果集, 并写入控制台
object SocketProcessor {
def main(args: Array[String]): Unit = {
// 1. 建立 SparkSession
val spark = SparkSession.builder()
.master("local[6]")
.appName("socket_processor")
.getOrCreate()
spark.sparkContext.setLogLevel("ERROR") import spark.implicits._ // 2. 读取外部数据源, 并转为 Dataset[String] val source = spark.readStream .format("socket") .option("host", "127.0.0.1") .option("port", 9999) .load() .as[String] // 3. 统计词频 val words = source.flatMap(_.split(" ")) .map((_, 1)) .groupByKey(_._1) .count() // 4. 输出结果 words.writeStream .outputMode(OutputMode.Complete()) .format("console") .start() .awaitTermination() } }
调整 Log 级别, 避免过多的 Log 影响视线 |
|
默认 readStream 会返回 DataFrame , 可是词频统计更适合使用 Dataset 的有类型 API |
|
统计全局结果, 而不是一个批次 | |
将结果输出到控制台 | |
开始运行流式应用 | |
阻塞主线程, 在子线程中不断获取数据 |
Structured Streaming
中的编程步骤依然是先读, 后处理, 最后落地
Structured Streaming
中的编程模型依然是 DataFrame
和 Dataset
Structured Streaming
中依然是有外部数据源读写框架的, 叫作 readStream
和 writeStream
Structured Streaming
和 SparkSQL
几乎没有区别, 惟一的区别是, readStream
读出来的是流, writeStream
是将流输出, 而 SparkSQL
中的批处理使用 read
和 write
代码已经编写完毕, 须要运行, 并查看结果集, 由于从结果集的样式中能够看到 Structured Streaming
的一些原理
开启 Socket server
运行程序
查看数据集
Socket server
和运行程序
运行的时候须要先开启 Socket server
Structured Streaming
的 API 和运行也是针对结构化数据进行优化过的
了解 Structured Streaming
的体系结构和核心原理, 有两点好处, 一是须要了解原理才好进行性能调优, 二是了解原理后, 才能理解代码执行流程, 从而更好的记忆, 也作到知其然更知其因此然
WordCount
的执行原理
Structured Streaming
的体系结构
Structured Streaming
是一个复杂的体系, 由不少组件组成, 这些组件之间也会进行交互, 若是没法站在总体视角去观察这些组件之间的关系, 也没法理解 Structured Streaming
的全局
了解 Dataset
这个计算模型和流式计算的关系
如何使用 Dataset
处理流式数据?
WordCount
案例的执行过程和原理
Dataset
和流式计算
Dataset
这个编程模型表示流式计算?
WordCount
的原理
Dataset
不只能够表达流式数据的处理, 也能够表达批量数据的处理
Dataset
之因此能够表达流式数据的处理, 由于 Dataset
能够模拟一张无限扩展的表, 外部的数据会不断的流入到其中
Structured Streaming
是一个复杂的体系, 由不少组件组成, 这些组件之间也会进行交互, 若是没法站在总体视角去观察这些组件之间的关系, 也没法理解 Structured Streaming
的核心原理
体系结构
StreamExecution
的执行顺序
StreamExecution
的执行顺序
StreamExecution
是整个 Structured Streaming
的核心, 负责在流上的查询
StreamExecution
中三个重要的组成部分, 分别是 Source
负责读取每一个批量的数据, Sink
负责将结果写入外部数据源, Logical Plan
负责针对每一个小批量生成执行计划
StreamExecution
中使用 StateStore
来进行状态的维护
Structured Streaming
不只支持 groupBy
, 还支持 groupByKey