目录
2.对 DStream 的数据的进行操作也是按照 RDD 为单位来进行的:
前言
Apache Spark是一个开源的、强大的分布式查询和处理引擎,它提供MapReduce的灵活性和可扩展性,但速度明显要快上很多;拿数据存储在内存中的时候来说,它比Apache Hadoop 快100倍,访问磁盘时也要快上10倍。
第1章 Spark概述
1.1 Spark是什么
Spark 是一种由 Scala 语言开发的快速、通用、可扩展的大数据分析引擎。
Spark Core:Spark Core包含Spark的基本功能,如内存计算、任务调度、部署模式、故障恢复、存储管理等。Spark建立在统一的抽象RDD之上,使其可以以基本一致的方式应对不同的大数据处理场景;通常所说的Apache Spark,就是指Spark Core;
Spark SQL:兼容HIVE数据,提供比Hive更快的查询速度(10~100x)的分布式SQL引擎,开发者可以轻松地使用SQL命令进行查询,并进行更复杂的数据分析;
Spark Streaming:流式计算分解成一系列小的批处理作业利用spark轻量级低时延的框架来支持流数据处理,目前已经支持Kafka,Flume等;
MLilb:提供基于Spark的机器学习算法库,包括聚类、分类、回归、协同过滤等,降低了机器学习的门槛,开发人员只要具备一定的理论知识就能进行机器学习的工作;
GraphX:提供图形计算框架,与Pregel/GraphLab兼容。
1.2 Spark VS Hadoop
尽管 Spark 相对于 Hadoop 而言具有较大优势,但 Spark 并不能完全替代 Hadoop,Spark 主要用于替代Hadoop中的 MapReduce 计算模型。存储依然可以使用 HDFS,但是中间结果可以存放在
内存中;调度可以使用 Spark 内置的,也可以使用更成熟的调度系统 YARN 等。
1.3 Spark优势及特点
1.3.1 优秀的数据模型和丰富计算抽象
首先看看MapReduce,它提供了对数据访问和计算的抽象,但是对于数据的复用就是简单的将中间数据写到一个稳定的文件系统中(例如 HDFS),所以会产生数据的复制备份,磁盘的I/O以及数据的序列化,所以在遇到需要在多个计算之间复用中间结果的操作时效率就会非常的低。而这类操作是非常常见的,例如迭代式计算,交互式数据挖掘,图计算等。
因此 AMPLab 提出了一个新的模型,叫做 RDD。
RDD 是一个可以容错且并行的数据结构(其实可以理解成分布式的集合,操作起来和操作本地集合一样简单),它可以让用户显式的将中间结果数据集保存在 内存 中,并且通过控制数据集的分区来达到数据存放处理最优化。同时 RDD 也提供了丰富的 API (map、reduce、filter、foreach、redeceByKey...)来操作数据集。
后来 RDD 被 AMPLab 在一个叫做 Spark 的框架中提供并开源。
1.3.2 spark的特点
快:与 Hadoop 的 MapReduce 相比,Spark 基于内存的运算要快 100 倍以上,基于硬盘的运算也要快 10 倍以上。Spark 实现了高效的 DAG 执行引擎,可以通过基于内存来高效处理数据流。
易用:Spark 支持 Java、Python、R 和 Scala 的 API,还支持超过 80 种高级算法,使用户可以快速构建不同的应用。而且 Spark 支持交互式的 Python 和 Scala 的 shell,可以非常方便地在这些 shell 中使用 Spark 集群来验证解决问题的方法。
通用:Spark 提供了统一的解决方案。Spark 可以用于批处理、交互式查询(Spark SQL)、实时流处理(Spark Streaming)、机器学习(Spark MLlib)和图计算(GraphX),这些不同类型的处理都可以在同一个应用中无缝使用。
兼容性:Spark 可以非常方便地与其他的开源产品进行融合。比如,Spark 可以使用 Hadoop 的 YARN 和 Apache Mesos 作为它的资源管理和调度器,并且可以处理所有 Hadoop 支持的数据,包括 HDFS、HBase 和 Cassandra 等。这对于已经部署 Hadoop 集群的用户特别重要,因为不需要做任何数据迁移就可以使用 Spark 的强大处理能力。
1.4 Spark 运行环境
① local 本地模式(单机) - 不需要其他任何节点资源就可以在本地执行Spark代码的环境
学习测试使用。
分为 local 单线程和 local-cluster 多线程。
② standalone 独立集群模式
学习测试使用。
典型的 Mater/slave 模式。
③ standalone-HA 高可用模式
生产环境使用
基于 standalone 模式,使用 zk 搭建高可用,避免 Master 是有单点故障的。
④ on yarn 集群模式
生产环境使用
运行在 yarn 集群之上,由 yarn 负责资源管理,Spark 负责任务调度和计算。
好处:计算资源按需伸缩,集群利用率高,共享底层存储,避免数据跨集群迁移。
⑤ on mesos 集群模式
国内使用较少
运行在 mesos 资源管理器框架之上,由 mesos 负责资源管理,Spark 负责任务调度和计算。
⑥ on cloud 集群模式
中小公司未来会更多的使用云服务
比如 AWS 的 EC2,使用这个模式能很方便的访问 Amazon 的 S3。
1.5 Spark运行架构
Spark 框架的核心是一个计算引擎,整体来说,它采用了标准 master-slave 的结构。
如下图所示,它展示了一个 Spark 执行时的基本结构。图形中的 Driver 表示 master,负责管理整个集群中的作业任务调度。图形中的 Executor 则是 slave,负责实际执行任务。
第2章 Scala基础
一、Scala简介
Scala源自Java,构建在JVM之上,与Java兼容、互通。
Scala的优势:
1.多范式编程:
(1)面向对象编程:
每个值都是对象;
对象的数据类型和行为由类(Class)和特征(Trait,类似于interface)描述;
利用特征实现混入式多重继承。
(2)函数式编程:
每个函数都是一个值;
支持高阶函数、柯里化(currying)、样例类(case class)及模式匹配......
2.Scala是静态语言,表达能力强,代码精简
3.Spark采用Scala语言设计,提供的API更加优雅,基于JVM的语言更融入Hadoop生态圈。
4.扩展性:隐式类、字符串差值
二、Scala变量(var)与常量(val)
变量:
赋值后可以改变,生命周期中可以被多次赋值。
var 变量名称:类型=xxx
一般无需显示指定类型,Scala编译器会自动推断出类型
// 下面的方式声明变量才不会报错
var name = "zhangsan"
name="lisi"
println(name) // lisi
常量:
赋值后不可变,类似于Java中的final变量
val 常量名称:类型=xxx
三、Scala数据类型
Scala与Java有相同的数据类型,但是Scala的数据类型首字母全部大写
Byte、Short、Int、Long、Float、Double、Char、Boolean、String
1)Scala中一切数据都是对象,都是Any的子类;
2)Scala中数据类型分为两大类:数值类型(AnyVal)、引用类型(AnyRef),不管是值类型还是引用类型都是对象;
3)Scala数据类型仍然遵守,低精度的值类型向高精度值类型,自动转换(隐式转换);
4)Scala中的StringOps是对Java中的String增强;
5)Unit:对应Java中的void,用于方法返回值的位置,表示方法没有返回值。Unit是 一个数据类型,只有一个对象就是()。Void不是数据类型,只是一个关键字;
6)Null是一个类型,只有一个对象就是null。它是所有引用类型(AnyRef)的子类;
7)Nothing,是所有数据类型的子类,主要用在一个函数没有明确返回值时使用,因为这样可以把抛出的返回值,返回给任何的变量或者函数。
四.定义与使用数组
数组是Scala中常用的一种数据结构,数组是一种存储了相同类型元素的固定大小的顺序集合,Scala定义一个数组的语法格式如下:
# 第1种方式
var arr: Array[String] = new Array[String](num)
# 第2种方式
var arr:Array[String] = Array(元素1,元素2,…)
五.定义与使用函数
函数是Scala的重要组成部分,Scala作为支持函数式编程的语言,可以将函数作为对象.定义函数的语法格式如下:
# def functionName(参数列表):[return type]={}
Scala提供了多种不同的函数调用方式,以下是调用函数的标准格式。
# functionName(参数列表)
如果函数定义在一个类中,那么可以通过“类名.方法名(参数列表)”的方式调用
六.定义与使用列表
列表操作常用方法
Scala中常用的查看列表元素的方法有head、init、last、tail和take()。
1.head:查看列表的第一个元素。
2.tail:查看第一个元素之后的其余元素。
3.last:查看列表的最后一个元素。
4.Init:查看除最后一个元素外的所有元素。
5.take():查看列表前n个元素。
七.定义与使用集合
Scala Set(集合)是没有重复的对象集合,所有的元素都是唯一的
集合操作常用方法
Scala合并两个列表时使用的是:::()或concat()方法,而合并两个集合使用的是++()方法。
八.定义与使用映射
1. 映射( Map ) 是一种可迭代的键值对结构 。
2. 所有的值都可以通过键来获取 ,并且映射中的键都是唯一的 。
3. 集合操作常用方法同样也适合映射。
4. 另外映射还可以通过 keys 方法获取所有的键,通过 values 方法获取所有值,也可以通过 isEmpty 方法判断映射的数据是否为空
九.定义与使用元组
1.元组(Tuple)是一种类似于列表的结构,但与列表不同的是,元组可以包含不同类型的元素。
2.元组的值是通过将单个的值包含在圆括号中构成的
3.目前,Scala支持的元组最大长度为22,即Scala元组最多只能包含22个元素
4.访问元组元素可以通过“元组名称._元素索引”进行,索引从1开始
第3章 Spark 编程基础
RDD简介
RDD 是一个容错的、只读的、可进行并行操作的数据结构,是一个分布在集群各个节点中的存放元素的集合。RDD有3种不同的创建方法。第一种是将程序中已存在的 Sea 集合(如集合、列表、数组)转换成RDD,第二种是对已有RDD 进行转换得到新的RDD,这两种方法都是通过内存中已有的数据创建RDD 的。第三种是直接读取外部存储系统的数据创建 RDD
一.从内存中读取创建RDD
1.parallelize()
parallelizeO方法有两个输人参数,说明如下:
(1)要转化的集合:必须是 Seq集合。Seq 表示序列,指的是一类具有一定长度的、可迭代访问的对象,其中每个数据元素均带有一个从0开始的、固定的索引。
(2)分区数。若不设分区数,则RDD 的分区数默认为该程序分配到的资源的 CPU核心数。
2.makeRDD()
makeRDD0方法有两种使用方式,第一种使用方式与 parallelize0方法一致;第二种方式是通过接收一个 Seq[(T,Seq[String])]参数类型创建 RDD。第二种方式生成的RDD中保存的是T的值,Seq[String]部分的数据会按照 Seqf(T,Seq[String])的顺序存放到各个分区中,一个 Seq[Stringl对应存放至一个分区,并为数据提供位置信息,通过preferredLocations0方法可以根据位置信息查看每一个分区的值。调用 makeRDD0时不可以直接指定 RDD 的分区个数,分区的个数与 Seq[String]参数的个数是保持一致的。
使用 makeRDD0方法创建 RDD,并根据位置信息查看每一个分区的值,结果如图所示。
二.从外部存储系统中读取数据创建RDD
1.从外部存储系统中读取数据创建RDD是指直接读取存放在文件系统中的数据文件创建RDD。从内存中读取数据创建 RDD 的方法常用于测试,从外部存储系统中读取数据创建 RDD 才是用于实践操作的常用方法。
2.从外部存储系统中读取数据创建 RDD 的方法可以有很多种数据来源,可通过SparkContext对象的 textFile0方法读取数据集。textFileO方法支持多种类型的数据集,如目录、文本文件、压缩文件和通配符匹配的文件等,并且允许设定分区个数,分别读取 HDFS文件和Linux本地文件的数据并创建 RDD,具体操作如下。
(1)通过HDFS文件创建 RDD
这种方式较为简单和常用,直接通过 textFile()方法读取 HDFS文件的位置即可。
在HDFS 的/user/toot 目录下有一个文件test.txt,读取该文件创建一个 RDD,代码如下
val test = sc. textile ("/user/root/test.txt")
(2)通过 Linux 本地文件创建 RDD
本地文件的读取也是通过 sc.textFile("路径")的方法实现的,在路径前面加上“file://”表示从Linux 本地文件系统读取。在 IntelliJIDEA 开发环境中可以直接读取本地文件;但在 spark-shell 中,要求在所有节点的相同位置保存该文件才可以读取它,例如,在Linux的/opt 目录下创建一个文件 test.txt,任意输入4行数据并保存,将 test.txt 文件远程传输至所有节点的/opt 目录下,才可以读取文件 test.txt。读取 test.txt 文件,并且统计文件的数据行数。
三.RDD方法归纳
1.使用map()方法转换数据
map()方法是一种基础的RDD转换操作,可以对 RDD 中的每一个数据元素通过某种函数进行转换并返回新的RDD。mapO方法是懒操作,不会立即进行计算。
转换操作是创建RDD的第二种方法,通过转换已有RDD生成新的RDD。因为RDD是一个不可变的集合,所以如果对 RDD 数据进行了某种转换,那么会生成一个新的 RDD。
2.使用 sortBy()方法进行排序
sortBy0方法用于对标准RDD 进行排序,有3个可输人参数,说明如下。
(1)第1个参数是一个函数f:(T)=>K,左边是要被排序对象中的每一个元素,右边返回的值是元素中要进行排序的值。
(2)第2个参数是 ascending,决定排序后 RDD 中的元素是升序的还是降序的,默认是 true,即升序排序,如果需要降序排序则需要将参数的值设置为 false。
(3)第3个参数是numPartitions,决定排序后的RDD 的分区个数,默认排序后的分区个数和排序之前的分区个数相等,即 this.partitions.size。
第一个参数是必须输人的,而后面的两个参数可以不输人。例如,通过一个存放了 3个二元组的列表创建一个 RDD,对元组的第二个值进行降序排序,分区个数设置为1,代码如下
3.使用collect()方法查询数据
collectO方法是一种行动操作,可以将 RDD 中所有元素转换成数组并返回到 Driver 端,适用于返回处理后的少量数据。因为需要从集群各个节点收集数据到本地,经过网络传输,并且加载到 Driver 内存中,所以如果数据量比较大,会给网络传输造成很大的压力。因此,数据量较大时,尽量不使用collectO方法,否则可能导致Driver 端出现内存溢出间题。collectO方法有以下两种操作方式。
(1) collect:直接调用 collect 返回该 RDD 中的所有元素,返回类型是一个 Array[T数组,这是较为常用的一种方式。
(2)collect[U: ClassTag](f: PartialFunction[T, U]):RDD[U]。这种方式需要提供一个标准的偏函数,将元素保存至一个RDD中。首先定义一个函数one,用于将collect方法得到的数组中数值为1的值替换为“one”,将其他值替换为“other”。
4.使用flatMap()方法转换数据
flatMap()方法将函数参数应用于RDD之中的每一个元素,将返回的迭代器(如数组、列表等)中的所有元素构成新的RDD。
使用flatMap()方法时先进行map(映射)再进行flat(扁平化)操作,数据会先经过跟map一样的操作,为每一条输入返回一个迭代器(可迭代的数据类型),然后将所得到的不同级别的迭代器中的元素全部当成同级别的元素,返回一个元素级别全部相同的RDD。这个转换操作通常用来切分单词。
5.使用take()方法查询某几个值
take(N)方法用于获取RDD的前N个元素,返回数据为数组。take()与collect()方法的原理相似,collect()方法用于获取全部数据,take()方法获取指定个数的数据。
6.使用union()方法合并多个RDD
union()方法是一种转换操作,用于将两个RDD合并成一个,不进行去重操作,而且两个RDD中每个元素中的值的个数、数据类型需要保持一致。
7.使用filter()方法进行过滤
filter()方法是一种转换操作,用于过滤RDD中的元素。
filter()方法需要一个参数,这个参数是一个用于过滤的函数,该函数的返回值为Boolean类型。
filter()方法将返回值为true的元素保留,将返回值为false的元素过滤掉,最后返回一个存储符合过滤条件的所有元素的新RDD。
8.使用distinct()方法进行去重
distinct()方法是一种转换操作,用于RDD的数据去重,去除两个完全相同的元素,没有参数。创建一个带有重复数据的RDD,并使用distinct()方法去重。
第4章 Spark编程进阶
1.在集群环境中运行 Spark
直接在开发环境中运行 Spark 程序时通常选择的是本地模式。如果数据的规模比较庞大,更常用的方式还是在 Spark 程序开发测试完成后编译打包为Java 归档(Java Archive, JAR)包,并通过 spark-submit 命令提交到 Spark集群环境中运行。
spark-submit的脚本在 Spark安装目录的bin 目录下,spark-submit 是 Spark 为所有支特
的集群管理器提供的一个提交作业的工具。Spark 在/example 目录下有 Scala、Java、 Pyithon 和R的示例程序,都可以通过 spark-submit运行。
sporik-subomit 提交JAR 包到集群有一定的格式要求,需要设置一些参数,语法如下,
./bin/spark-submit --class <main-class>
--master <master-url>
--deploy-mode <deploy-mode>\
--conf <"key=value">
...# other options
<appli.cat.ion-jar> )
[application-argaments」
如果除了设置运行的脚本名称之外不设置其他参数,那么 Spark 程序默认在本地
运行。
--class:应用程序的入口,指主程序。
--master:指定要连接的集群URL。
-deploy-mode:是否将驱动程序部署在工作节点(cluster)或本地作为外部客户端
(client)。
--conf:设置任意 Spark 配登属性,允许使用"key=value WordCount"的格式设置任意的SparkConf 配置属性。
application-jar:包含应用程序和所有依赖关系的JAR包的路径。
application-arguments:传递给main)方法的参数。
将代码 4-3 所示的程序运行模式更改为打包到集样中运行。程序中无须设置 master 地址、Hadoop 安装包位置。输人、输出路径可通过 spark-submit 指定。
2.spark-submit常用项配置
ndme Name 设置程序名
--jars JARS 添加依赖包
-driver-memory MEM Driver 程序使用的内存大小
-executor-memory MEM Executor使用的内存大小
-total-executor-cores NUM Executor使用的总内核数
--executor-cores NUM 每个Bxecutor使用的内核数
-num-executors NUM 启动的Executor数量
spark.eventLog.dir
保存日志相关信息的路径,可以是“hdfs://” 开头的 HDES 路径,也可以
是“e:// 开头的本地路径,路径均需要提前创建
spark.eventLog.enabled 是否开启日志记录
spark.cores.max
当应用程序运行在 Standalone 集群或粗粒度共享模式 Mesos 集群时,应用
程序向集群(不是每台机器,而是整个集群)请求的最大 CPU内核总数。如果不设置,那么对于 Standalone 集群将使用 spark,deploy. defaultCores 指定的数值,而 Mesos 集群将使用集群中可用的内核。
第5章 Spark SQL——结构化数据文件处理
一.Spark SQL的简介
Spark SQL是Spark用来处理结构化数据的一个模块,它提供了一个编程抽象结构叫做DataFrame的数据模型(即带有Schema信息的RDD),Spark SQL作为分布式SQL查询引擎,让用户可以通过SQL、DataFrames API和Datasets API三种方式实现对结构化数据的处理。
二.Spark SQL主要提供了以下三个功能:
1. Spark SQL 可从各种结构化数据源中读取数据,进行数据分析。
2. Spark SQL 包含行业标准的 JDBC 和 ODBC 连接方式,因此它不局限于在 Spark 程序内使用 SQL 语句进行查询。
3. Spark SQL 可以无缝地将 SQL 查询与 Spark 程序进行结合,它能够将结构化数据作为 Spark 中的分布式数据集( RDD )进行查询。
三.Spark SQL 的核心组成部分包括:
DataFrame: 这是 Spark SQL 提供的一个分布式数据集,它带有 Schema 元信息,使得 Spark SQL 可以进行某些形式的执行优化。DataFrame 是从 RDD 派生而来的,但它带有额外的结构信息,使得 Spark 可以对数据进行更好的优化处理23。
SQL 查询引擎: Spark SQL 内置了一个 SQL 查询引擎,它支持执行 SQL 语句,使得用户可以以 SQL 的方式查询数据。Spark SQL 还支持将 SQL 查询与 Spark 程序无缝混合使用,这大大提高了其灵活性和易用性23。
优化器: Catalyst 是 Spark SQL 的执行优化器,它负责对 SQL 查询进行解析和优化,以提高执行效率。Catalyst 优化器可以处理和优化多种类型的 SQL 语句,包括那些涉及复杂数据处理逻辑的语句3。
插件系统: Spark SQL 有一个插件系统,允许开发者扩展其功能,如添加新的数据源或数据 sink。
四.DataFrame简介
DataFrame可以看作是分布式的Row对象的集合,在二维表数据集的每一列都带有名称和类型,这就是Schema元信息,这使得Spark框架可获取更多数据结构信息,从而对在DataFrame背后的数据源以及作用于DataFrame之上数据变换进行针对性的优化,最终达到提升计算效率。
DataFrame 是 Spark SQL 提供的一个分布式数据集,它是带有 Schema 元信息的 DataSet,可以看作是关系数据库中的一个表。DataFrame 可以从多种源构建,如结构化数据文件、Hive 表、外部数据库或现有的 RDD。它支持 Spark SQL 查询和 DataFrame API,可以方便地进行数据处理和转换。
五.DataFrame的创建
创建DataFrame的两种基本方式:
已存在的RDD调用toDF()方法转换得到DataFrame
通过Spark读取数据源直接创建DataFrame
若使用SparkSession方式创建DataFrame,可以使用spark.read从不同类型的文件中加载数据创建DataFrame。spark.read的具体操作,在创建Dataframe之前,为了支持RDD转换成Dataframe及后续的SQL操作,需要导入import.spark.implicits._包启用隐式转换。若使用SparkSession方式创建Dataframe,可以使用spark.read操作,从不同类型的文件中加载数据创建DataFrame。
六.DataFrame的常用操作
操作DataFrame的常用方法,具体如下表如示。
七.Dataframe两种谱法风格
即DSL风格语法和SQL风格语法,二者在功能上并无区别,仅仅是根据用户习惯自定义选择操作方式。接下来,我们通过两种语法风格,分讲解Dstaframe操作的具体方法。
一.DSL风格操作
DataFrame提供了一个领域特定语言(DSL)以方便操作结构化数
据,下面将针对DSL操作风格,讲解DataFrame
常用操作示例:
1.show():查看DataFrame中的只体内容信息
2.pritSchema0:查看0staFrame的Schema信息
3.select():查看DataFmame中造取部分列的数据
二.SQL风格语法
1)创建一个DataFrame
scala> val df = spark.read.json(“/opt/module/spark/examples/src/main/resources/people.json”)
df: org.apache.spark.sql.DataFrame = [age: bigint, name: string]
2)对DataFrame创建一个临时表
scala> df.createOrReplaceTempView(“people”)
3)通过SQL语句实现查询全表
scala> val sqlDF = spark.sql(“SELECT * FROM people”)
sqlDF: org.apache.spark.sql.DataFrame = [age: bigint, name: string]
4)结果展示
注意:普通临时表是Session范围内的,如果想应用范围内有效,可以使用全局临时表。使用全局临时表时需要全路径访问,如:global_temp.people
八.RDD、DataFrame及Dataset的区别
接下来,我们来比较一下这三者的不同之处:
综上所述,RDD、DataFrame和Dataset在Spark SQL中各自扮演着不同的角色,它们共同构成了Spark SQL强大的数据处理能力。在选择使用哪一个时,我们需要根据自己的数据处理需求和场景来决定。
九.Spark SQL 多数据源交互
1.读取文件
读取 json 文件:
spark.read.json("D:\\data\\output\\json").show()
读取 csv 文件:
spark.read.csv("D:\\data\\output\\csv").toDF("id","name","age").show()
读取 parquet 文件:
spark.read.parquet("D:\\data\\output\\parquet").show()
读取 mysql 表:
val prop = new Properties()
prop.setProperty("user","root")
prop.setProperty("password","root")
spark.read.jdbc(
"jdbc:mysql://localhost:3306/bigdata?characterEncoding=UTF-8","person",prop).show()
2.写入文件
写入 json 文件:
personDF.write.json("D:\\data\\output\\json")
写入 csv 文件:
personDF.write.csv("D:\\data\\output\\csv")
写入 parquet 文件:
personDF.write.parquet("D:\\data\\output\\parquet")
写入 mysql 表:
val prop = new Properties()
prop.setProperty("user","root")
prop.setProperty("password","root")
personDF.write.mode(SaveMode.Overwrite).jdbc(
"jdbc:mysql://localhost:3306/bigdata?characterEncoding=UTF-8","person",prop)
<续>数据抽象
Spark Streaming 的基础抽象是 DStream(Discretized Stream,离散化数据流,连续不断的数据流),代表持续性的数据流和经过各种 Spark 算子操作后的结果数据流。
可以从以下多个角度深入理解 DStream:
1.DStream 本质上就是一系列时间上连续的 RDD:
2.对 DStream 的数据的进行操作也是按照 RDD 为单位来进行的:
3.容错性
底层 RDD 之间存在依赖关系,DStream 直接也有依赖关系,RDD 具有容错性,那么 DStream 也具有容错性。
4.准实时性/近实时性
Spark Streaming 将流式计算分解成多个 Spark Job,对于每一时间段数据的处理都会经过 Spark DAG 图分解以及 Spark 的任务集的调度过程。
对于目前版本的 Spark Streaming 而言,其最小的 Batch Size 的选取在 0.5~5 秒钟之间。
所以 Spark Streaming 能够满足流式准实时计算场景,对实时性要求非常高的如高频实时交易场景则不太适合。