Spark
文章平均质量分 88
大数据中Spark框架学习文章汇总
电光闪烁
一个大数据开发工程师的学习之路
展开
-
Spark文章汇总
Spark(1):Spark概述Spark(2):Spark快速上手Spark(3):Spark运行环境Spark(4):Spark运行架构Spark(5):RDD概述Spark(6):RDD的创建和并行度Spark(7):RDD转换算子Spark(8):RDD行动算子Spark(9):RDD的序列化Spark(10):RDD依赖关系Spark(11):RDD持久化Spark(12):RDD文件读取与保存Spark(13):RDD之广播变量和累加器原创 2022-11-06 13:08:54 · 833 阅读 · 0 评论 -
Spark(40):Streaming DataFrame 和 Streaming DataSet 中的触发器
流式查询的触发器定义了流式数据处理的时间, 流式查询根据触发器的不同, 可以是根据固定的批处理间隔进行微批处理查询, 也可以是连续的查询。没有显示的设定触发器表示使用尽可能块的处理每个批次的数据如果无数据可用则处于阻塞状态等待数据流入Fixed interval micro-batches 固定周期的微批处理查询会在微批处理模式下执行其中微批处理将以用户指定的间隔执行. 1.如果以前的微批处理在间隔内完成则引擎会等待间隔结束然后开启下一个微批次2.原创 2023-08-11 16:32:58 · 605 阅读 · 0 评论 -
Spark(39):Streaming DataFrame 和 Streaming DataSet 输出
不同的查询支持不同的输出模式。原创 2023-08-11 16:05:31 · 2463 阅读 · 0 评论 -
Spark(38):Streaming DataFrame 和 Streaming DataSet 转换
在数据分析系统中, Structured Streaming 可以持续的按照 event-time 聚合数据, 然而在此过程中并不能保证数据按照时间的先后依次到达。例如: 当前接收的某一条数据的 event-time 可能远远早于之前已经处理过的 event-time。在发生这种情况时, 往往需要结合业务需求对延迟数据进行过滤。现在考虑如果事件延迟到达会有哪些影响。假如, 一个单词在 12:04(event-time) 产生, 在 12:11 到达应用。原创 2023-08-11 14:11:45 · 543 阅读 · 0 评论 -
Spark(37):Streaming DataFrame 和 Streaming DataSet 创建
使用 Structured Streaming 最重要的就是对 Streaming DataFrame 和 Streaming DataSet 进行各种操作。从 Spark2。0 开始, DataFrame 和 DataSet 可以表示静态有界的表, 也可以表示流式无界表。与静态 Datasets/DataFrames 类似,我们可以使用公共入口点 SparkSession 从流数据源创建流式 Datasets/DataFrames,并对它们应用与静态 Datasets/DataFrames 相同的操作。原创 2023-07-28 14:39:13 · 969 阅读 · 0 评论 -
Spark(36):Structured Streaming 编程模型
来自设备的每个时间都是表中的一行, event-time 是行中的一列。查询一旦启动, Spark 会持续不断的在 socket 连接中检测新的数据, 如果其中有了新的数据, Spark 会运行一个增量(incremental)查询, 这个查询会把前面的运行的 count 与新的数据组合在一起去计算更新后的 count。此外, 该模型也可以自然的处理晚于 event-time 的数据, 因为spark 一直在更新结果表, 所以它可以完全控制更新旧的聚合数据,或清除旧的聚合以限制中间状态数据的大小。原创 2023-07-25 11:26:47 · 377 阅读 · 0 评论 -
Spark(35):Structured Streaming 概述
从 spark2.0 开始, spark 引入了一套新的流式计算模型: Structured Streaming。该组件进一步降低了处理数据的延迟时间, 它实现了“有且仅有一次(Exectly Once)” 语义, 可以保证数据被精准消费。Structured Streaming 基于 Spark SQl 引擎, 是一个具有弹性和容错的流式处理引擎。使用 Structure Streaming 处理流式计算的方式和使用批处理计算静态数据(表中的数据)的方式是一样的。原创 2023-07-21 15:03:01 · 304 阅读 · 0 评论 -
Spark(34):Spark之数据倾斜和解决方案
Spark 中的数据倾斜问题主要指 shuffle 过程中出现的数据倾斜问题,是由于不同的 key 对应的数据量不同导致的不同 task 所处理的数据量不同的问题。例如,reduce 点一共要处理 100 万条数据,第一个和第二个 task 分别被分配到了 1 万条数据,计算 5 分钟内完成,第三个 task 分配到了 98 万数据,此时第三个 task 可能需要 10 个小时完成,这使得整个 Spark 作业需要 10 个小时才能运行完成,这就是数据倾斜所带来的后果。原创 2023-07-21 11:49:38 · 2506 阅读 · 0 评论 -
Spark(33):Spark性能调优之JVM调优
根据 Spark 统一内存管理机制,堆内存被划分为了两块,Storage 和 Execution。如果 task 在运行过程中创建大量对象或者创建的对象较大,会占用大量的内存,这回导致频繁的垃圾回收,但是垃圾回收会导致工作现场全部停止,也就是说,垃圾回收一旦执行,Spark 的 Executor 进程就会停止工作,无法提供相应,此时,由于没有响应,无法建立网络连接,会导致网络连接超时。以上参数配置完成后,会避免掉某些 JVM OOM 的异常问题,同时,可以提升整体 Spark 作业的性能。原创 2023-07-20 16:13:28 · 306 阅读 · 0 评论 -
Spark(32):Spark性能调优之Shuffle调优
对于那些包含了特别耗时的 shuffle 操作的作业,建议增加重试最大次数(比如 60 次),以避免由于 JVM 的 full gc 或者网络不稳定等因素导致的数据拉取失败。在 Spark 任务运行过程中,如果 shuffle 的 map 端处理的数据量比较大,但是 map 端缓冲的大小是固定的,可能会出现 map 端缓冲数据频繁 spill 溢写到磁盘文件中的情况,使得性能非常低下,通过调节 map 端缓冲的大小,可以避免频繁的磁盘 IO 操作,进而提升 Spark 任务的整体性能。原创 2023-07-19 16:08:22 · 1099 阅读 · 0 评论 -
Spark(31):Spark性能调优之算子调优
Spark SQL 这一步的并行度和 task 数量肯定是没有办法去改变了,但是,对于 Spark SQL 查询出来的 RDD,立即使用 repartition 算子,去重新进行分区,这样可以重新分区为多个partition,从 repartition 之后的 RDD 操作,由于不再设计 Spark SQL,因此 stage 的并行度就会等于你手动设置的值,这样就避免了 Spark SQL 所在的 stage 只能用少量的 task 去处理大量数据并执行复杂的算法逻辑。那么具体应该如何实现上面的解决思路?原创 2023-07-19 15:44:46 · 590 阅读 · 0 评论 -
Spark(30):Spark性能调优之常规性能调优
通常来说,task 可能不会被分配到它处理的数据所在的节点,因为这些节点可用的资源可能已经用尽,此时,Spark 会等待一段时间,默认 3s,如果等待指定时间后仍然无法在指定节点运行,那么会自动降级,尝试将 task 分配到比较差的本地化级别所对应的节点上,比如将 task 分配到离它要计算的数据比较近的一个节点,然后进行计算,如果当前级别仍然不行,那么继续降级。默认情况下,task 中的算子中如果使用了外部的变量,每个 task 都会获取一份变量的复本,这就造成了内存的极大消耗。原创 2023-07-18 18:00:44 · 1126 阅读 · 0 评论 -
Spark(29):Spark内存管理
Executor 内运行的并发任务共享 JVM 堆内内存,这些任务在缓存 RDD 数据和广播(Broadcast)数据时占用的内存被规划为存储(Storage)内存,而这些任务在执行 Shuffle 时占用的内存被规划为执行(Execution)内存,剩余的部分不做特殊规划,那些 Spark 内部的对象实例,或者用户定义的 Spark 应用程序中的对象实例,均占用剩余的空间。由于新的内存管理机制的出现,这种方式目前已经很少有开发者使用,出于兼容旧版本的应用程序的目的,Spark 仍然保留了它的实现。原创 2023-07-18 15:16:53 · 913 阅读 · 0 评论 -
Spark(28):Spark Shuffle解析
如下图中有3个Reducer,从 Task 开始那边各自把自己进行 Hash 计算(分区器: hash/numreduce 取模),分类出 3 个不同的类别,每个 Task 都分成 3 种类别的数据,想把不同的数据汇聚然后计算出最终的结果,所以 Reducer 会在每个 Task 中把属于自己类别的数据收集过来,汇聚成一个同类别的大集合,每 1 个 Task 输出 3 份本地文件,这里有 4 个 Mapper Tasks,所以总共输出了 4 个 Tasks x 3 个分类文件 = 12 个本地小文件。原创 2023-07-17 17:21:48 · 461 阅读 · 0 评论 -
Spark(27):Spark任务调度机制
目录0. 相关文章链接1. Spark任务调度概述2. Spark Stage级调度3. Spark Task级调度3.1. 调度策略3.1.1. FIFO调度策略3.1.2. FAIR调度策略3.2. 本地化调度3.3. 失败重试与黑名单机制 Spark文章汇总 在生产环境下,Spark 集群的部署方式一般为 YARN-Cluster 模式,之后的内核分析内容中我们默认集群的部署方式为 YARN-Cluster 模式。在上一章中我们讲解了 Spark YARN-Cluster 模式下的任务原创 2023-07-17 16:29:19 · 952 阅读 · 0 评论 -
Spark(26):Spark通讯架构
Spark 早期版本中采用 Akka 作为内部通信部件。Spark1.3 中引入 Netty 通信框架,为了解决 Shuffle 的大数据传输问题使用Spark1.6 中 Akka 和 Netty 可以配置使用。Netty 完全实现了 Akka 在 Spark 中的功能。Spark2 系列中, Spark 抛弃 Akka,使用 Netty。Spark2.x 版本使用 Netty 通讯框架作为内部通讯组件。原创 2023-07-17 15:48:43 · 686 阅读 · 0 评论 -
Spark(25):Spark部署模式对比
实际上,除了上述这些通用的集群管理器外,Spark 内部也提供了方便用户测试和学习的本地集群部署模式和 Windows 环境。由于在实际工厂环境下使用的绝大多数的集群管理器是 Hadoop YARN,因此我们关注的重点是 Hadoop YARN 模式下的 Spark 集群部署。在 Standalone Cluster 模式下,任务提交后,Master 会找到一个 Worker 启动 Driver。在 Standalone Client 模式下,Driver 在任务提交的本地机器上运行。原创 2023-07-15 17:36:29 · 518 阅读 · 0 评论 -
Spark(24):Spark内核概述
上图为 Spark 通用运行流程图,体现了基本的 Spark 应用程序在部署中的基本提交流程。这个流程是按照如下的核心步骤进行工作的:任务提交后,都会先启动 Driver 程序;随后 Driver 向集群管理器注册应用程序;之后集群管理器根据此任务的配置文件分配 Executor 并启动;原创 2023-07-15 17:21:06 · 600 阅读 · 0 评论 -
Spark(23):SparkStreaming之DStream转换
DStream 上的操作与 RDD 的类似,分为 Transformations(转换)和 Output Operations(输出)两种,此外转换操作中还有一些比较特殊的原语,如:updateStateByKey()、transform()以及各种 Window 相关的原语。原创 2023-07-13 18:03:51 · 515 阅读 · 0 评论 -
Spark(22):SparkStreaming之DStream创建
需要继承 Receiver,并实现 onStart、 onStop 方法来自定义数据源采集。原创 2023-07-13 15:25:00 · 463 阅读 · 0 评论 -
Spark(21):SparkStreaming之DStream入门
Discretized Stream 是 Spark Streaming 的基础抽象,代表持续性的数据流和经过各种 Spark 原语操作后的结果数据流。在内部实现上,DStream 是一系列连续的 RDD 来表示。使用 netcat 工具向 9999 端口不断的发送数据,通过 SparkStreaming 读取端口数据并统计不同单词出现的次数。其他Spark相关系列文章链接由此进 ->原创 2023-07-12 15:38:03 · 298 阅读 · 0 评论 -
Spark(20):SparkStreaming之概述
所以简单来将,DStream 就是对 RDD 在实时数据处理场景的一种封装。Spark 1.5 以前版本,用户如果要限制 Receiver 的数据接收速率,可以通过设置静态配制参数“spark.streaming.receiver.maxRate”的值来实现,此举虽然可以通过限制接收速率,来适配当前的处理能力,防止内存溢出,但也会引入其它问题。Spark Streaming 支持的数据输入源很多,例如:Kafka、 Flume、Twitter、ZeroMQ 和简单的 TCP 套接字等等。原创 2023-07-12 15:22:53 · 300 阅读 · 0 评论 -
Spark(19):SparkSQL中数据的加载和保存
此外,如果你尝试使用 HiveQL 中的 CREATE TABLE (并非 CREATE EXTERNAL TABLE)语句来创建表,这些表会被放在你默认的文件系统中的 /user/hive/warehouse 目录中(如果你的 classpath 中有配好的 hdfs-site.xml,默认的文件系统就是 HDFS,否则就是本地文件系统)。这里的通用指的是使用相同的API,根据不同的参数读取和保存不同格式的数据, SparkSQL 默认读取和保存的文件格式为 parquet。原创 2023-07-10 09:26:51 · 963 阅读 · 0 评论 -
Spark(18):SparkSQL之用户自定义函数
步骤一:创建 DataFrame步骤二:注册 UDF步骤三:创建临时表步骤四:应用 UDF强类型的 Dataset 和弱类型的 DataFrame 都提供了相关的聚合函数, 如 count(), countDistinct(),avg(),max(),min()。除此之外,用户可以设定自己的自定义聚合函数。通过继承 UserDefinedAggregateFunction 来实现用户自定义弱类型聚合函数。原创 2023-07-07 16:00:29 · 645 阅读 · 0 评论 -
Spark(17):RDD、DataFrame、DataSet三者的关系
如果同样的数据都给到这三个数据结构,他们分别计算之后,都会给出相同的结果。不同是的他们的执行效率和执行方式。在后期的 Spark 版本中, DataSet 有可能会逐步取代 RDD和 DataFrame 成为唯一的 API 接口。在 SparkSQL 中 Spark 为我们提供了两个新的抽象,分别是 DataFrame 和 DataSet。他们和 RDD 有什么区别呢?DataFrame 其实是 DataSet 的特例,所以它们之间是可以互相转换的。其他Spark相关系列文章链接由此进 ->原创 2023-07-07 11:17:45 · 307 阅读 · 0 评论 -
Spark(16):SparkSQL之DataSet
DataSet 是具有强类型的数据集合,需要提供对应的类型信息。原创 2023-07-07 11:11:33 · 440 阅读 · 0 评论 -
Spark(15):SparkSQL之DataFrame
这里的 spark 不是 Scala 中的包名,而是创建的 sparkSession 对象的变量名称,所以必须先创建 SparkSession 对象再导入。这里的 spark 对象不能使用 var 声明,因为 Scala 只支持val 修饰的对象的引入。如果是数字,默认作为 Int 处理;但是从文件中读取的数字,不能确定是什么类型,所以用 bigint 接收,可以和Long 类型转换,但是和 Int 不能进行转换。注意:普通临时表是 Session 范围内的,如果想应用范围内有效,可以使用全局临时表。原创 2023-07-06 17:29:00 · 953 阅读 · 0 评论 -
Spark(14):SparkSQL之概述
但是,随着 Spark 的发展,对于野心勃勃的 Spark 团队来说,Shark 对于 Hive 的太多依赖(如采用 Hive 的语法解析器、查询优化器等等),制约了 Spark 的 One Stack Rule Them All 的既定方针,制约了 Spark 各个组件的相互集成,所以提出了 SparkSQL 项目。而 Spark SQL 的查询优化器正是这样做的。从 API 易用性的角度上看,DataFrame API 提供的是一套高层的关系操作,比函数式的 RDD API 要更加友好,门槛更低。原创 2023-07-06 16:40:42 · 444 阅读 · 0 评论 -
Spark(13):RDD之广播变量和累加器
/ 自定义累加器// 1. 继承 AccumulatorV2,并设定泛型// 2. 重写累加器的抽象方法// 累加器是否为初始状态// 复制累加器// 重置累加器// 向累加器中增加数据 (In)// 查询 map 中是否存在相同的单词// 如果有相同的单词,那么单词的数量加 1// 如果没有相同的单词,那么在 map 中增加这个单词// 合并累加器// 两个 Map 的合并innerMap// 返回累加器的结果 (Out)注:其他Spark相关系列文章链接由此进 ->原创 2023-07-06 14:37:38 · 292 阅读 · 0 评论 -
Spark(12):RDD文件读取与保存
object 对象文件对象文件是将对象序列化后保存的文件,采用 Java 的序列化机制。可以通过objectFile[T: ClassTag](path)函数接收一个路径,读取对象文件,返回对应的 RDD,也可以通过调用 saveAsObjectFile()实现对对象文件的输出。因为是序列化所以要指定类型。SequenceFile 文件是 Hadoop 用来存储二进制形式的 key-value 对而设计的一种平面文件(Flat。其他Spark相关系列文章链接由此进 ->原创 2023-07-04 18:12:43 · 463 阅读 · 0 评论 -
Spark(11):RDD持久化
缓存有可能丢失,或者存储于内存的数据由于内存不足而被删除,RDD 的缓存容错机制保证了即使缓存丢失也能保证计算的正确执行。通过基于 RDD 的一系列转换,丢失的数据会被重算,由于 RDD 的各个 Partition 是相对独立的,因此只需要计算丢失的部分即可,并不需要重算全部Partition。所谓的检查点其实就是通过将 RDD 中间结果写入磁盘由于血缘依赖过长会造成容错成本过高,这样就不如在中间阶段做检查点容错,如果检查点之后有节点出现问题,可以从检查点开始重做血缘,减少了开销。原创 2023-07-04 17:49:05 · 220 阅读 · 0 评论 -
Spark(10):RDD依赖关系
RDD 的 Lineage 会记录 RDD 的元数据信息和转换行为,当该 RDD 的部分分区数据丢失时,它可以根据这些信息来重新运算和恢复丢失的数据分区。宽依赖表示同一个父(上游)RDD 的 Partition 被多个子(下游)RDD 的 Partition 依赖,会引起 Shuffle,总结:宽依赖我们形象的比喻为多生。窄依赖表示每一个父(上游)RDD 的 Partition 最多被子(下游)RDD 的一个 Partition 使用,窄依赖我们形象的比喻为独生子女。原创 2023-07-04 17:36:21 · 216 阅读 · 0 评论 -
Spark(9):RDD的序列化
在Spark中,如果有类进行序列化,该类需要继承Serializable,如下图所示:在Spark中,Serializable比较重,所以可以使用更优的Kryo框架,但是注意的是即使使用 Kryo 序列化,也要继承 Serializable 接口(如果Spark包中的类均已注册,但如果是自定义的类,还需要手动注册),如下图示所示:注:其他Spark相关系列文章链接由此进 ->Spark文章汇总。原创 2023-07-04 14:56:07 · 499 阅读 · 0 评论 -
Spark(8):RDD行动算子
其他Spark相关系列文章链接由此进 ->原创 2023-03-14 17:00:13 · 364 阅读 · 1 评论 -
Spark(7):RDD转换算子
reduceByKey 和 groupByKey 都存在 shuffle 的操作,但是 reduceByKey可以在 shuffle 前对分区内相同 key 的数据进行预聚合(combine)功能,这样会减少落盘的数据量,而 groupByKey 只是进行分组,不存在数据量减少的问题, reduceByKey 性能比较高。GroupByKey 只能分组,不能聚合,所以在分组聚合的场合下,推荐使用 reduceByKey,如果仅仅是分组而不需要聚合。其他Spark相关系列文章链接由此进 ->原创 2023-03-09 08:45:00 · 259 阅读 · 0 评论 -
Spark(6):RDD的创建和并行度
默认情况下, Spark 可以将一个作业切分多个任务后,发送给 Executor 节点并行计算,而能够并行计算的任务数量我们称之为并行度。这个数量可以在构建 RDD 时指定。记住,这里的并行执行的任务数量,并不是指的切分任务的数量,不要混淆了。由外部存储系统的数据集创建 RDD 包括:本地的文件系统,所有 Hadoop 支持的数据集,比如 HDFS、 HBase 等。使用 new 的方式直接构造 RDD,一般由 Spark 框架自身使用。主要是通过一个 RDD 运算完后,再产生新的 RDD。原创 2023-03-08 15:21:23 · 884 阅读 · 0 评论 -
Spark(5):RDD概述
RDD(Resilient Distributed Dataset)叫做弹性分布式数据集,是 Spark 中最基本的数据处理模型。代码中是一个抽象类,它代表一个弹性的、不可变、可分区、里面的元素可并行计算的集合。弹性:存储的弹性:内存与磁盘的自动切换;容错的弹性:数据丢失可以自动恢复;计算的弹性:计算出错重试机制;分片的弹性:可根据需要重新分片;分布式:数据存储在大数据集群不同节点上数据集:RDD 封装了计算逻辑,并不保存数据数据抽象:RDD 是一个抽象类,需要子类具体实现。原创 2023-03-08 14:57:12 · 397 阅读 · 0 评论 -
Spark(4):Spark运行架构
所谓的提交流程,其实就是我们开发人员根据需求写的应用程序通过 Spark 客户端提交给 Spark 运行环境执行计算的流程。在不同的部署环境中,这个提交过程基本相同,但是又有细微的区别,我们这里不进行详细的比较,但是因为国内工作中,将 Spark 引用部署到Yarn 环境中会更多一些,所以本课程中的提交流程是基于 Yarn 环境的。Spark 应用程序提交到 Yarn 环境中执行的时候,一般会有两种部署执行的方式:Client 和Cluster。两种模式主要区别在于:Driver 程序的运行节点位置。原创 2022-11-11 20:43:41 · 350 阅读 · 0 评论 -
Spark(3):Spark运行环境
自己学习时,每次都需要启动虚拟机,启动集群,这是一个比较繁琐的过程,并且会占大量的系统资源,导致系统执行变慢,不仅仅影响学习效果,也影响学习进度,Spark 非常暖心地提供了可以在 windows 系统下启动本地集群的方式,这样,在不使用虚拟机的情况下,也能学习 Spark 的基本使用。所谓的 Local 模式,就是不需要其他任何节点资源就可以在本地执行 Spark 代码的环境,一般用于教学,调试,演示等,在 IDEA 中运行代码的环境我们称之为开发环境,不太一样。原创 2022-11-09 21:48:59 · 2287 阅读 · 0 评论 -
Spark(2):Spark快速上手
Spark 由 Scala 语言开发的,所以一般情况下开发所使用的语言也为 Scala,当前使用的Spark 版本为 3.0.0,默认采用的 Scala 编译版本为 2.12,所以后续开发时。出现这个问题的原因,并不是程序的错误,而是 windows 系统用到了 hadoop 相关的服务,解决办法是通过配置关联到 windows 的系统依赖就可以了。修改 Maven 项目中的 POM 文件,增加 Spark 框架的依赖关系。本博文是基于Spark3.0 版本,使用时请注意对应版本。原创 2022-11-06 13:38:14 · 363 阅读 · 0 评论