spark
文章平均质量分 79
一 铭
公众号:大数据架构师修行之路
展开
-
SparkSQL实现原理-UDF实现原理分析
本文介绍Dataset的UDF的实现原理。UDF是User-Defined Functions的简写。用户可以根据自己的需要编写函数,并用于Spark SQL中。但也要注意,Spark不会优化UDF中的代码,若大量使用UDF可能让数据处理的性能受到影响,所以应该优先选择使用spark的api或sql语句来处理数据。原创 2023-03-12 17:26:20 · 1159 阅读 · 0 评论 -
SparkSQL实现原理-SparkSQL如何支持Hive?
本文介绍了SparkSQL如何支持Hive的访问。原创 2023-03-12 17:14:12 · 864 阅读 · 0 评论 -
SparkSQL实现原理-DataSet缓存的实现
本文介绍了SparkSQL中Dataset缓存的具体实现原理。可见,对于Dataset的缓存只是生成了一个逻辑计划,当执行action算子实际计算数据才会计算并缓存数据。原创 2022-09-02 07:22:44 · 770 阅读 · 0 评论 -
Spark SQL实现原理-逻辑计划分析的实现
从《Spark SQL实现原理-逻辑计划的创建》一文我们知道,通过创建和操作Dataset会创建一个逻辑计划树。但在创建逻辑计划树时有些属性的类型等信息,此时并不知道,把这些属性称为未解析的(Unresolved)。逻辑计划的分析这一步就是要处理这些未解析的属性,并使用合法性检查规则对表达式的合法性进行检查。实现层面,Spark SQL使用Catalyst逻辑计划分析规则和一个Catalog对象跟踪所有数据源中的表来解析这些属性。逻辑计划分析流程逻辑计划的分析是在QueryExecution中完成,其原创 2021-06-28 19:10:24 · 469 阅读 · 3 评论 -
SparkSQL实现原理-逻辑计划的创建
逻辑计划的创建无论通过任何方式来创建Dataset,都会在创建Dataset时生成一个QueryExecution对象和创建Dataset的逻辑计划。完成Dataset的创建后,可以对Dataset进行各种操作,SparkSQL不会立即执行这些操作,而是会根据这些操作添加对应的逻辑计划节点,从而形成逻辑计划操作树。本文介绍Dataset逻辑计划创建的实现原理。查看逻辑计划先通过一个实战的例子来查看一下创建Dataset的逻辑计划。下面的代码通过一个对象数组来创建Dataset:import spa原创 2021-06-26 09:30:48 · 376 阅读 · 0 评论 -
SparkSQL实现原理-执行计划处理的实现概要
SparkSQL执行计划处理的实现概要执行计划和对应的处理类不同阶段的处理是由不同的类来负责的,下图是各个阶段和处理类的对应关系图:(1)逻辑计划的生成:创建Dataset时会创建QueryExecution对象(2)逻辑计划的分析:通过Analyzer对象来完成(3)逻辑计划的优化:通过Optimizer来完成(4)物理计划的生成:通过Planner来完成(5)物理计划的优化:通过QueryExecution#prepareForExecution来优化物理计划(6)执行代码的生成:通过原创 2021-06-26 09:18:34 · 393 阅读 · 0 评论 -
SparkSQL实现原理-执行的总体流程
Spark SQL执行的总体流程我们知道SparkSQL最终会把API和SQL语句转换成Spark Core的RDD代码来执行。那么这个转换过程是怎样的呢?本文介绍可执行代码生成的总体流程。总体流程可执行代码的生成过程(也是使用Catalyst对表达式进行创建、优化、转换的过程)主要经历以下几个阶段:(1) 起始逻辑计划的生成(2) 使用Catalyst来分析逻辑计划,并解析引用(3) 优化逻辑计划(4) 生成一个或多个物理计划(5) 优化物理执行计划(6) 生成可执行代码在物理规划阶段原创 2021-06-25 08:21:34 · 614 阅读 · 1 评论 -
Spark Structured Streaming实战--对同一流数据进行多种计算
对同一流数据进行多种计算有时我们可能需要针对同一个流的数据源来进行多种计算,比如:使用同一流数据来计算多个指标,并把计算结果保存到不同的地方。此时,就需要对同一个来源的流使用不同的计算逻辑,并把结果写出到不同的存储系统中。Spark Strucutured Streaming提供了针对同一个数据源流进行不同逻辑计算并对结果进行不同的sink的方式。这就是在Spark Strucutured Streaming的writestream中提供的foreach和foreachBatch接口。Foreach原创 2021-01-27 21:33:58 · 1348 阅读 · 0 评论 -
Spark Structured Streaming实战--使用滑动窗口(Sliding windows)
滑动窗口比翻滚窗口要复杂一些,滑动窗口的窗口之间有重叠的区域,这个区域会被计算两次。那么,为什么要这么设计呢?滑动窗口通常用于流量控制,资源保护等场景,它可以让控制更加平滑。介绍顾名思义,该窗口非固定,而是滑动的。在滑动窗口中,元组被分组在一个窗口中,该窗口根据指定的间隔在数据流中滑动。滑动窗口可以包含重叠的数据,一个数据可以属于多个滑动窗口。可以认为窗口每次的滑动就是产生了一个新的窗口。就需要开始该窗口的计算。当然若前一个窗口还没有计算还会继续计算,所以就会产生一些重叠的区域。关于滑动窗口的详细的原原创 2021-01-25 20:06:06 · 1070 阅读 · 0 评论 -
Spark Structured Streaming实战--滚动窗口(tumbling windows)的使用
翻滚窗口(tumbling windows)实战Spark Structured Streaming有两种窗口,在 1.2《窗口的基本原理》一节中已经进行了介绍。本文介绍翻滚窗口的实战。简介tumbling windows的计算逻辑很简单,就是把时间划分成一个个的固定的时间段(时间窗口),这些时间窗口彼此之间没有交集。每个时间段的开始时刻时,就从新开始计算,本时间段结束时,该时间窗口的结果就不会再改变了,接下来从新开始下一个 时间窗口的计算。基本使用在实际中,翻滚窗口有很多使用场景,比如:根据用户原创 2021-01-21 20:45:13 · 980 阅读 · 0 评论 -
Structured Streaming窗口的基本原理
Structured Streaming窗口的基本原理通过结构化流(structured streaming)来进行滑动窗口上的聚合操作和分组聚合操作非常相似。在进行分组聚合操作时,在用户指定的分组列中为每个唯一值维护汇总值(例如计数)。在基于窗口的聚合的情况下,行事件时间所属的每个窗口都会维护聚合值。 让我们通过一个例子来了解这一点。滚动窗口(tumbling windows)滚动窗口将时间划分为不重叠的连续时间段。比如定义:window($"timestamp", "5 minutes")就原创 2021-01-14 16:20:31 · 853 阅读 · 0 评论 -
Spark Structured Streaming概述
Spark Structured Streaming概述结构化流(Structured Streaming)是基于Spark SQL引擎的流处理引擎,它具有可扩展和容错性。可以使用类似批数据处理的表达方式来处理流式数据。Spark SQL引擎会增量和连续的运行处理代码,并当流数据持续到达时更新最后结果。在Structured Streaming中可以使用Scala、Java、Python或R中的Dataset/DataFrame API来处理流聚合、事件时间窗口、流到批处理连接等。这些代码的执行都在相同原创 2021-01-07 21:44:57 · 625 阅读 · 0 评论 -
Spark任务调度概述
Spark任务调度概述本文讲述了Spark任务调度的实现框架,概要分析了Spark从Job提交到Task创建并提交给Worker的整个过程。并对Spark任务调度相关的概念进行了介绍。任务调度总体流程从设计层面来说,Spark把任务的执行过程划分成多个阶段,每个阶段由一个处理对象来进行处理,并把处理完成的结果传递个下一个处理对象进行处理。这个过程如下图1所示:原创 2021-01-06 06:32:47 · 385 阅读 · 0 评论 -
Spark sql实战--如何比较两个dataframe是否相等
说明Spark并没有提供比较两个dataframe是否相等的函数,所以,需要通过现有的函数来完成任务。但不同方式的性能有很大不同。这里提供4种方式来比较两个Dataframe是否相等,可以根据不同的场景来选择使用。实现方案对于小的dataframe,可以直接collect回来,然后比较。(1)先检查表结构是否相等;(2)确保df1,df2,df3没有重复行 ,使用intersect,并查看其count数是否和df的count数相等使用subtract函数可以通过subtract函数原创 2021-01-05 14:16:24 · 4765 阅读 · 0 评论 -
如何遍历处理dataframe的每一行?
有时我们会对dataframe的每一行进行遍历处理,有两种方式可以采用:使用map函数def customFunction(row): return (row.name, row.age, row.city)sample2 = sample.rdd.map(customFunction)自定义一个处理函数,并通过rdd的map函数来处理dataframe的每一行数据。使用collect()函数若数据量比较小,可以把数据收集到driver本地,然后再用常规的方法来遍历数据。for row原创 2021-01-04 20:51:50 · 9846 阅读 · 1 评论 -
Spark内存数据存储(MemoryStore)的实现原理
在Spark中根据存储级别可以把块数据保存到磁盘或内存中,同时还可以选择按序列化或非序列化的形式保存。MemoryStore类实现了一个简单的基于块数据的内存数据库,用来管理需要写入到内存中的块数据。可以按序列化或非序列化的形式存放块数据,存放这两种块数据的数据结构是不同的,但都必须实现MemoryEntry这个接口。也就是说:MemoryStore管理的是以MemoryEntry为父接口的内存对象。MemoryStore如何管理这些MemoryEntry对象呢?在当前版本,MemoryStore通过一原创 2021-01-04 07:32:07 · 688 阅读 · 0 评论 -
Spark2原理分析--BlockManager存储管理框架概述
BlockManager存储管理框架概述我们知道Spark的RDD有多种存储级别,每种存储级别会决定RDD存储的位置(内存还是磁盘)和存储的形式(是否序列化)和存储的行为(是否需要副本)。那么,但RDD需要存储的时候,Spark是如何实现的呢?Spark构建了一套自己的数据存储管理体系。通过这套存储体系Spark实现了内存,磁盘的数据存储,同时可以把数据保存在本地,或通过数据传输服务保存到远端。需要获取数据时,也可从内存或磁盘中获取,同时可以从本地或远端获取数据。这套存储体系是通过BlockMange原创 2021-01-02 09:42:47 · 328 阅读 · 1 评论 -
Spark原理分析--统一内存管理的实现
本文从源码角度分析spark统一内存管理的实现原理。统一内存管理对象的创建统一内存管理对象在SparkEnv中进行创建和管理,这样内存管理就在Driver和Executor端中都可以使用。在SparkEnv的create函数中,创建内存管理对象的实现代码如下: val useLegacyMemoryManager = conf.getBoolean("spark.memory.useLegacyMode", false) val memoryManager: MemoryManager =原创 2021-01-02 09:35:50 · 273 阅读 · 0 评论 -
Spark2原理分析--统一内存管理概述
Spark统一内存管理概述本文介绍Spark统一内存管理的基本概念和基本原理。通过本文可以了解Spark统一内存管理的内存管理方式,基本理解内存管理的实现方式。堆外内存和堆内内存堆外内存(off-heap memory)为了进一步优化内存的使用以及提高 Shuffle 时排序的效率,Spark 引入了堆外(Off-heap)内存,使之可以直接在工作节点的操作系统内存中开辟空间,存储经过序列化的二进制数据。堆外内存可以被精确地申请和释放,而且序列化的数据占用的空间可以被精确计算,所以相比堆内内存来说原创 2021-01-02 09:33:48 · 267 阅读 · 0 评论 -
如何解决Spark的ExecutorLost错误
ExecutorLost错误说明:运行Task的Executor宕掉了。产生该错误的原因可能是多方面的。本文分析该错误产生的原因,并提出一些解决办法。原因分析导致该问题的原因可以从两方面来分析:(1)由于运行在Executor中的Task导致的。(2)也可能是与运行的Task无关的原因导致的,比如:人为的把Executor杀掉。进一步分析产生的原因:该问题一般是由于executor端运行的应用的使用内存超出了限制。或则是由于executor端的内存过小,或则是由于数据量过大而导致的。若是由于内存原创 2020-10-12 15:18:23 · 4738 阅读 · 0 评论 -
spark rdd实战—分区器(Partitioner)的理解和使用
概述在《spark2原理分析-RDD的Partitioner原理分析》一文中,我们了解了分区器的基本概念,本文通过实际的例子来进一步理解分区器的概念,并学习如何使用分区器。分区器的使用场景分区器在类型为(k,v)的RDD时使用。但不要频繁的修改分区器,频繁使用分区器可能会导致更多的shuffle操作。HashPartitioner分区器的使用准备类型为(k,v)的RDD我们通过parallelize生成(k,v)对的RDD数据,在spark-shell中代码如下:scala> val原创 2020-06-12 12:26:36 · 1442 阅读 · 0 评论 -
如何在spark-shell中调试运行scala文件
概述本文讲述如何通过spark-shell来调试scala代码文件,这样不需要IDE就可以对scala文件进行调试,在代码量较小的情况下比较适用。方法1:使用:load 命令有时候为了在spark-shell中调试一段代码,可以在spark-shell中使用:load 命令。如下:test.scala文件内容val df3 = Seq((100,"xiaoming",30)).toDF("id", "name","age")在spark-shell中加载该文件scala> :l原创 2020-06-11 08:51:42 · 7130 阅读 · 0 评论 -
spark sql实战—拆分数据
拆分的数据有时在进行数据时我们需要把一列数据分割成多列数据,把一个字段值,分割成多个值。本节介绍如何通过spark sql提供的函数来进行数据的分割。1. 数据拆分概述数据拆分操作在进行数据处理时,通常我们需要对数据进行拆分。比如:把一列拆分成多行,多列,把一行拆分成多行,多列等。在spark-sql中提供了多个函数用来进行数据拆分。数据拆分的函数splitexplodepostexplodesubstring2. 数据的拆分2.1 通过explode系列函数进行拆分把一个数原创 2020-05-23 14:44:40 · 10677 阅读 · 0 评论 -
spark sql实战(pyspark)—如何把多个udf作用于同一列数据
概述本文介绍如何把多个udf函数使用到dataframe/dataset的同一列上。使用思路有时候我们需要在同一列上进行多个函数操作,形成一个函数链。也就是把上一个函数的输出作为下一个函数的输入,把最后的结果作为处理结果。有多种方式可以实现该功能,这介绍一种函数链的方式,基本思路如下:把需要对列进行处理的函数放到一个链表中分别通过函数链上的每个函数来对列数据进行处理把上一个函数的处...原创 2019-12-23 08:27:04 · 1071 阅读 · 0 评论 -
spark sql实战—加载csv文件到动态分区表
概述本文讲述如何通过spark sql把一个dataframe加载到spark的动态分区表中。场景介绍把csv和parquet文件加载到spark的动态分区表中,有很多中方案,这里介绍如何通过spark的dataframe把数据文件加载到动态分区表中。注意:为了保证性能,指定分区的字段的字典数据的唯一值最好不要超过几万。这是spark-2.3的partitionBy算子的源码的注释中写到的...原创 2019-12-23 08:26:05 · 807 阅读 · 0 评论 -
spark2原理分析-shuffleWriter:SortShuffleWriter实现分析
概述本文分析shuffleWriter的实现类:SortShuffleWriter的详细实现。ShuffleWriter抽象类/** * Obtained inside a map task to write out records to the shuffle system. */private[spark] abstract class ShuffleWriter[K, V] {...原创 2019-11-15 19:30:03 · 336 阅读 · 0 评论 -
spark2原理分析-shuffleWriter之BypassMergeShuffleWriter实现分析
概述本文分析shuffleWriter的实现类:BypassMergeSortShuffleWriter的详细实现原理。BypassMergeSortShuffleWriter介绍BypassMergeSortShuffleWriter的启用条件shuffl过程中进行write时,会根据不同的情况选择不同的shuffleWriter实现类。从前面的几篇文章《spark2原理分析—shuff...原创 2019-11-15 19:23:45 · 401 阅读 · 0 评论 -
spark2 Dataset实现原理分析-Dataframe原理介绍和Dataset的对比
概述本文讲述Spark Dataframe的原理要点。Dataframe原理要点Spark SQL引入了一个名为DataFrame的表格函数数据抽象。设计它的目的在于:简化Spark应用程序的开发。这样就可以在Spark基础架构上处理大量结构化表格数据。DataFrame是一种数据抽象或特定于域的语言(domain-specific language ),用于处理结构化和半结构化数...原创 2019-06-15 14:05:42 · 1206 阅读 · 0 评论 -
spark2实战-使用Spark SQL的Join
概述join操作在进行数据处理时非常常见,而spark支持多种join类型。本文对spark中多种Join类型进行说明,并对不同join的使用场景进行了介绍和举例说明。使用join操作的注意事项在两个数据集比较的列有唯一值,使用默认join(inner join)会有较好的性能,但要注意:两个数据集中不匹配的key值的数据行将会被丢掉,另外,当比较的列有重复值时,会进行排列组合操作,此时可...原创 2019-07-11 21:28:20 · 1328 阅读 · 0 评论 -
spark2原理分析-广播变量(Broadcast Variables)的实现原理
概述本文介绍spark中Broadcast Variables的实现原理。基本概念在spark中广播变量属于共享变量的一种,spark对共享变量的介绍如下:通常,当在远程集群节点上执行传递给Spark操作(例如map或reduce)的函数时,它将在函数中使用的所有变量的单独副本上工作。这些变量将复制到每台计算机,而且远程机器上的变量的更新不会同步给驱动程序(driver)端。这种情况下,...原创 2019-08-19 08:03:09 · 2923 阅读 · 1 评论 -
spark2原理分析-BlockManager总体架构设计
概述本文介绍spark的存储体系,通过本文的学习可以对spark的BlockManager体系有一个总体的把握。BlockManger的总体架构BlockManager运行在spark的每个节点上(包括driver和executors),它提供了一个保存和获取本地或远端数据块到内存、磁盘、或off-heap中的统一接口。从该架构图可见,在spark的每个任务执行器中都有一个blockma...原创 2019-08-17 21:05:07 · 311 阅读 · 0 评论 -
spark2原理分析-BlockManagerMaster实现原理
概述本文讲说明spark中BlockManager的基本原理。BlockManager的基本概念BlockManager运行在spark的每个节点上(包括driver和executors),它提供了一个保存和获取本地或远端数据块到内存、磁盘、或off-heap中的统一接口。BlockManage的实现分析数据块管理的总体架构spark数据块管理的总体架构如下图所示:从该架构图可见,...原创 2019-08-17 21:07:19 · 861 阅读 · 0 评论 -
spark2原理分析-Task调度对象实现接口(Schedulable)原理分析
概述本文分析任务调度器TaskScheduler中的调度实体的实现合约的原理。TaskScheduler中的调度对象在TaskScheduler中调度对象是实现了合约(即:接口)Schedulable的类的对象。Schedulable是是可调度实体的合约,可以在这里查看该接口的实现代码。在spark2中有两个类实现了调度实体接口:Schedulable。也就是说有两种调度实体:Poo...原创 2018-11-30 11:44:03 · 320 阅读 · 0 评论 -
通过例子学习spark rdd--Action函数
action函数foreachforeachPartitioncollectsubtractreducetreeReducefoldaggregateaggregateByKeycountcountByValuezipWithIndextakefirsttakeOrderedtopmaxisEmptysaveAsTextFilekeyBykeysaction原创 2017-11-26 15:14:52 · 1246 阅读 · 0 评论 -
Spark2 Dataset实现原理分析-Dataset实现原理概要
概述本文讲述spark sql中的dataset的组成部分,并对其创建过程进行分析。Dataset要点我们可以总结出dataset的一些要点,如下:和关系型数据表一样,Dataset是强类型的。数据集的行的集合,被称为Dataframe。和RDD一样,Dataset的操作分为两类:转换(transformations)和行动(action)。和RDD一样,Dataset是lazy的...原创 2019-06-07 22:03:34 · 893 阅读 · 0 评论 -
spark2原理分析-shuffle框架之ShuffleReader实现分析
概述本文讲述shuffleReader的具体实现。从这篇文章中,我们已经知道shuffleReader是一个抽象类,该抽象类只有一个read函数,用来在shuffle阶段从本地或远程获取数据。该抽象类的实现类是:BlockStoreShuffleReader。本文主要讲述该实现类的具体实现。shuffle reader实现要点shuffle过程可以从两个地方来读取数据块,一个是本地的bl...原创 2019-05-25 21:34:31 · 675 阅读 · 0 评论 -
spark2原理分析—shuffle框架的实现概要分析
概述本文分析spark2的shuffle过程的实现。shuffle过程介绍shuffle总体流程spark2的shuffle过程可以分为shuffle write和shuffle read。shuffle write把map阶段计算完成的数据写入到本地。而shuffle read是从不同的计算节点获取shuffle write的就按出来的数据,这样就会发生网络的数据传输和磁盘的i/o。为...原创 2019-05-19 20:41:21 · 1779 阅读 · 0 评论 -
Spark2原理分析—部署模式介绍
概述本文介绍了Spark的几种部署模式和架构。Spark架构概览Spark使用:主/从(master/slave)架构模式。和一般的主从模式的分布式系统不同(例如:zookeeper等),Spark还可以通过yarn或mesos来分配和管理资源。Spark可以单机运行,单机运行时所有角色都运行在同一个jvm进程中,这种模式可以用来进行调试,或测试。当然,常用的还是集群模式,根据使用的资源管...原创 2018-10-10 22:22:43 · 660 阅读 · 0 评论 -
spark2原理分析-RDD的Transformations原理分析
概述本文介绍RDD的Transformations函数的原理和作用。还会介绍transformations函数的分类,和不同类型的转换产生的效果。RDD的Transformations操作transformations简介在RDD中定义了两类函数:action和transformations。transformations通过在一些RDD中执行一些数据操作来产生一个或更多新的RDD。这些t...原创 2018-10-16 18:04:52 · 593 阅读 · 0 评论 -
spark2原理分析-RDD的checkepointing原理分析
概述本文介绍RDD的checkpoint的作用和原理,并对checkpointing的实现进行分析。RDD checkpoint的基本概念RDD可能经过任意多个transformations操作,导致RDD血缘(lineage)任意的增长,Spark提供了一种将整个RDD进行持久化保存的方法。这样,当节点发生故障而无法运行时,Spark不需要从头开始重新计算丢失的RDD片段,而是使用一种类似...原创 2018-10-19 10:03:09 · 413 阅读 · 0 评论