- 博客(45)
- 收藏
- 关注
原创 Java基础
包装类是Java本身提供的类,用于将原始数据类型封装成对象。包装类:可以调用方法。原始数据类型和包装类之间的关系实例:(int类型的值只是Integer包装类中的一个私有化的成员变量)包装类:由于对象的存在,它涉及了对象的创建与管理,所以会产生额外的性能开销;原始数据类型:性能比包装类要快,因为它是直接存储数据值,没有对象的开销;原始数据类型是Java语言的基本数据类型,他们可以直接用于存储数据值,而不是对象引用。包装类:存储的是对象的引用,对象本身存储在堆内存中;包装类:可以用在泛型中,因为它是对象;
2025-08-27 17:25:48
292
原创 数据分析与数据挖掘
数据分析是指用适当的统计分析的方法对收集来的大量数据进行分析,提取有用信息和形成结论而对数据加以详细研究和概括总结的过程。工具:R语言、Python语言、Excel、PPT、Hive、Spark、MySQL、Orcal等等。首先先说数据挖掘的流程就是:数据选取--->模型训练--->模型验证--->模型修正--->使用模型。预测和分类中的五个算法(有监督学习):线性回归、逻辑回归、决策树算法、支持向量机、朴素贝叶斯。可视化展示的原则就是利用合适的图表来清晰的表达出数据中的信息。平均值、中位数、众数。
2025-08-27 14:29:09
586
原创 Hive的核心架构
整体的情况是这样的:我在客户端执行了一条DDL命令,创建了一张数据表,然后MetaStore会保存这张表的元数据信息,并将具体的数据存储在HDFS上面。在SQL解析时会经过一个Driver程序,如果客户端是用的CLI来操作的,那么Driver就位于CLI中,如果客户端是远程写入的SQL,那么Driver就是位于HiveServer2中的。Driver驱动器中有七个部分组成,分别是解析器、语法分析器、逻辑计划生成器、逻辑优化器、物理计划生成器、物理优化器、执行器。例如Map Join优化。
2025-08-26 10:52:04
476
原创 Flume中常见的易错的问题
监控的意思就是各自的source组件是会监控各自的数据来源的,当数据来源中有数据到来时,就会触发组件执行,但是这里需要注意的就是实时监控,实时监控是可以实时的监控到数据来源中的数据改变的并及时的作出处理。但是有些组件的监控方式并不是实时的,而是有可能是里面的数据更改过之后,比如有一个文件的数据都已经写入才会做出处理,那这样的监控就不是实时监控,但是也是监控的一种。原理:他可以实时监控指定目录下的对个文件,一旦该目录中的数据发生了改变,就会实时读取新改变的内容,并且记录每个文件的最新采集位置。
2025-08-25 17:21:47
203
1
原创 MySQL的事务
意向共享锁(IS锁):事务打算对表中的某些行加共享锁(S锁),在加S锁之前,先获取该表的IS锁。意向排他锁(IX锁):事务打算对表中的某些行加排他锁(X锁),在加X锁之前,先获取该表的IX锁。【实例】:事务A想对user表中的id=1的行加S锁,它会先获取user表中的IS锁,然后再对id=1的行加S锁。直至IS锁和行级S锁被释放。当某一个事务获得了某个资源的锁的时候,就是获得了对这个资源的访问权限,其他的事务只有获得了这个权限的时候才能对资源进行操作,否则只能被阻塞或等待,知道资源的锁被释放。
2025-08-22 14:51:25
646
原创 索引下推和谓词下推
在组合索引中,当查询条件不止一个时,并不会匹配到一个字段就回去进行回表查询,而是会按照最左匹配方法来最大长度的匹配字段之后再去进行回表查询。因为这样做匹配到的字段越多,相当于过滤条件就越多,最终获得的结果就越精确。是SQL语句中的where子句需要尽量的往前面提,因为尽早的过滤会使得数据量变得更少,方便后续对数据的处理。
2025-08-21 15:28:57
210
原创 回表索引和覆盖索引
先去普通索引中去查找name为“zhangsan”的数据,可以找到这个数据对应的主键值,此时已经包含了我们要查找的所有字段的数据了,那就不再需要进行回表查询了,只在这个辅助索引上查询就可以了。这一操作就叫做覆盖索引。回表索引的意思就是当查询不是根据主键来查的时候,会先根据非主键索引查询数据,先查询到数据的主键值,然后再回到主键索引上根据该主键值查询出想要的数据。执行过程:先去普通索引中去查找name为“zhangsan”的数据,找到这个数据对应的主键值,然后再去主键索引中根据该主键值查找到对应的数据。
2025-08-21 15:20:15
296
原创 MySQL常见的索引存储结构
因为相比B树来说,每一页中只存储键值,那他所能存储的键值就一定比B树多,因为B树还要存储数据信息,这样就导致了B树的树结构一定是会比B+树高的。那么当数据量十分巨大的情况下,节点数量就非常的多,导致树结构十分的庞大,这样查询效率十分的低下并且读磁盘来读取索引信息的效率也会非常的低。现在,我们要去查找0012的节点,先从根节点出发,找到了‘0010’的节点,其值比0012要小,所有向右子树寻找,找到‘0013’,其值比0012要大,往左子树上面找,最终找到‘0012’节点结束。从而影响树的平均查找效率。
2025-08-21 14:29:23
431
原创 JVM讲解
因为这里涉及一个双亲委派机制,就是应用程序加载器会先层层向上找,先找到他的父类加载器--扩展类加载器(Extention Class Loader),然后扩展类加载器再找他的父类加载器--根加载器(Root Class Loader),然后由根加载器去找它是否有这个类,如果他有就由他来加载这个类,如果没有就向下找扩展类加载器,看扩展类加载器中是否有这个类,如果还没有继续继续向下,最终才是由应用程序类加载器来进行类的加载的。不同的应用程序类加载器即使加载的是相同的类,在JVM虚拟机中也会被视作为不同的类。
2025-08-20 15:23:46
522
原创 原子指标、派生指标和复合指标
比如:某人下单的总金额,那么可以对应的派生指标是最近一天的下单总金额、最近七天下单的总金额、最近三十天的下单总金额。复合指标是在派生指标或原子指标的基础上,又通过更复杂的逻辑运算组合而成的指标。聚合逻辑:SUM()、COUNT()、AVG()等常用的聚合函数。业务过程:例如订单中的下单、支付、退单等具体业务行为。度量值:比如:下单总金额、支付成功的次数、退单数量等。派生指标就是在原子指标的基础上,通过一定的计算逻辑得到的新指标。原子指标的三要素:业务过程、度量值和聚合逻辑。三、复合指标(衍生指标)
2025-08-17 22:18:39
531
原创 Flink的状态管理
开始的优化思路是直接在代码中调用.clear()方法去清除状态,但是有的时候我们的逻辑不希望将状态直接给清除掉,这时就需要配置一个状态的“生存时间”(time-to-live,TTL)。原始状态是自定义的,相当于就是自己开辟一块内存,然后由开发者自己来管理状态信息,自己实现状态的序列化和故障恢复。这两种状态的区别很简单,就是看状态的获取是否要按照Key来获取,不同的Key之间不能获取到同一个状态的。有状态算子任务,在计算的过程中需要依赖一些其他的数据,然后再结合当前的输入数据得到最终的执行结果。
2025-08-15 18:18:48
499
原创 Flink中的处理函数
所以,处理函数是最为灵活的处理方法,可以实现这种自定义的业务逻辑。跟时间相关的操作,目前我们只会用窗口来处理,而在很多应用需求中,要求我们对时间有更精细的控制,需要获取水位线,甚至要“把控时间”、定义什么时候做什么事,这就不是基本的时间窗口能实现的了。但是在Flink的更底层,我们可以不定义任何具体的算子(比如map,fliter,或者window),而只是提炼出一个统一的“处理”(process)操作,它是所有转换算子中的一个概括性的表达,开发者可以自定义处理逻辑,所以这一层的接口就叫做“处理函数”。
2025-08-15 15:47:21
400
原创 Flink中基于时间的合流--双流联结(join)
apply()就是对两个流中匹配的数据进行处理的操作。于是对于一条流中的任意一个数据元素a,就可以开辟这条数据的时间间隔[a.timestamp + lowerBound,a.timestamp + upperBound],然后根据这个时间间隔去另外一条流中找在这个时间间隔内并且有相同key的数据。在定义的时间窗口中,通过两条流中共享的公共键(key)来进行两条流中的数据的匹配。间隔联结的原理就是针对一条流中的每一条数据,开辟出其时间戳前后的一段时间间隔,看这期间是否有来自另外一条流中的数据匹配。
2025-08-15 11:07:45
367
原创 Flink中的水位线
在流入数据量非常大,且同时流入的数据的时间差很小的情况下,可以考虑相隔一段时间才生成水位线,每次更新水位线都是拿这一段时间间隔中最大的事件时间与水位线进行对比,如果大于水位线,则会更新水位线中的时间戳,如果小于等于水位线,则不会再更新水位线。在每来一条数据时,会为其生成一个水位线,水位线中的时间戳就是这条数据的事件时间。当下一条数据来之后,会让其事件时间与水位线进行对比,如果事件时间大于水位线,则生成新的水位线,如果事件时间小于等于水位线,则不必再生成新的水位线。在介绍水位线之前,需要引入时间语义的概念。
2025-08-14 14:15:50
479
原创 数仓建模理论-数据域和主题域
数据域是指面向业务数据,将业务过程进行抽象的数据集合。比如在电商业务中的店铺商品浏览事件、页面点击事件、加购入车事件、下单事件、支付事件、确认收货事件都是电商业务中的业务事件。然后后厨他们看到的肯定是数据域更多一些呀,但是饭店卖饭肯定不能拿出来数据域推销啊,他们得拿主题域来满足食客需求的呀,那这里大厨就得做菜了,把数据域的数据做成不同菜系(主题)的数据。思考的过程是,我的总体业务是怎样的,我要从哪些角度对业务进行分析,那这些分析需求需要什么数据,那把分析需求要用的数据放在一个集合中,这个集合就是主题域。
2025-08-13 17:18:57
457
原创 Flink中的窗口
在实际的写代码的过程中,需要注意两个内容,一个就是窗口分配器(实际使用时的窗口的类型);滑动窗口要看窗口的大小,但是更重要的是看窗口的步长。窗口中两个重要的点:窗口的类型和窗口的处理函数。计算窗口以窗口中的数据的数量为依据,当数据达到指定数量之后窗口截止。通俗来说就是“人齐发车”。按照驱动类型分类可以分为:时间驱动窗口和数量驱动窗口,简称为时间窗口和计数窗口。全局的窗口没有窗口的技术时间,需要靠触发器来对窗口中收集到的数据进行处理。按照窗口分配数据的规则划分分为:滚动窗口、滑动窗口、会话窗口、全局窗口。
2025-08-13 11:58:30
229
原创 Flink运行时的实现细节
JobMaster负责处理单个的作业,在作业提交后,他会将JobGraph转化为一个物理层面的数据流图,然后向资源管理器发送请求获取资源,一旦获取到资源以后,JobMaster就会将这个数据流图发送到TaskManager上去执行。这些都是TaskManager设计时的问题。所以必须要求开启的TaskManager的总的任务槽的数量要比设置的并行度的值要大。那么一个算子的子任务的个数就是这个算子的并行度。算子链就是对并行度相同的且是一对一的算子进行的合并操作,合并之后两个算子就在同一个子任务中执行。
2025-08-12 15:26:21
445
原创 Flink部署
在Yarn上部署的过程是:客户端把应用先提交给Yarn的ResourceManager,ResourceManager会想Yarn的NodeManager申请容器,在这些容器中部署JobManager和TaskManager的实例并启动集群。但是很多情况下我们的作业都是由一个客户端发出来的,这两种方式在作业任务较多时会大量占用客户端的网络带宽(他需要去网络上下载依赖并将二进制数据发送至JobManager),所以会大大加重客户端的资源消耗。Flink的部署模式有三种,分别是会话模式、单作业模式和应用模式。
2025-08-12 11:34:31
321
原创 Flink概述
比如:某一个数据发出时候的时间是23:59(事件时间)分,到达Flink被处理时的时间是第二天的0:01(处理时间)分,那么Flink会将这条数据按照前一天的事件时间来处理,从而保证这一天的数据处理结果是准确的。其实这个特点是要和Spark Streaming对比着看才能体会到,Spark Streaming只有处理时间语义,就是每个数据只会被标记被处理时候的时间,那如果就像是上面的例子一样,这条数据就不会被算作是前一天的数据,而是会被当做是第二天的数据来处理。其次,Flink还是有状态的计算。
2025-08-11 15:56:07
557
原创 Hive中优化问题
不使用分区字段就代表着要操作的数据范围是整个表,这对于分区表的操作是十分危险的,因为整张表的数据量非常的巨大,对整张表的操作可能会占用巨大的资源。------触发小文件合并的阈值,若某个计算任务输出的文件平均大小低于该阈值,就会触发合并-------------------开启合并map reduce任务输出的小文件-------------------------开启合并map only任务输出的小文件--------------------是否开启谓词下推优化--------------
2025-08-10 15:29:04
1103
原创 Hive的并行度的优化
但是在有些情况下,这种估算方式也有不足,因为它是以整个文件大小作为分子进行的估算,合理的应该是进入Reduce端的文件大小来估算,因为整个文件在进入Map端之后可能进行过聚合,那么此时进入Reduce端的数据量就不是整个文件大小。Reduce端并行度的确定逻辑是:若指定mapreduce.job.reduces的值为一个非负整数,则reduce并行度为指定的值。Map端的并行度与Map切片数量相关,并行度等于切片数量。--------------一个切片的最大值---------------
2025-08-10 10:12:55
381
原创 Hive中的数据倾斜问题
map join的实现是两个Map任务,先将小表数据缓存起来,然后第二个map任务会对大表的数据均匀的切分的,所以这个过程中map的计算任务是均匀的,就不会产生数据倾斜。思考:数据倾斜的问题是必然会存在的,就是数据在Shuffle之前时均匀切分的,也就是均匀存在的,经过shuffle之后要使相同的数据发往同一个分区势必会造成数据分布的不均匀。Skew-GroupBy方法就可以解决Map-Side聚合的问题,如果说Map-Side适合的是小表的分组聚合,那么Skew-GroupBy就是适合于大表的分组聚合。
2025-08-09 21:52:48
729
原创 MySQL中个人不会的问题总结
datediff(date1,date2):实现的功能是date1减去date2,但是只限于date1和date2的年月日部分的相减操作,不能计算一天之内的时分秒之间的差值。timestampdiff(hour,date1,date2):实现的功能是date2减去date1,限于小时之间的相减操作,小时部分不足的省去。timestampdiff(minute,date1,date2):实现的是date2与date1之间的分钟总差值,包括小时在内,比如。
2025-08-09 15:40:03
203
原创 Hive的文件格式
Body是存放数据的地方:列式存储的数据是按每列来存储的,但是每列其实也是会分条存储的,不会是一下存放整个一列的数据。在ORC中是用Stripe来存储分条之后的数据信息的。File Footer中的内容包含了Header的长度,各个stripe的信息:stripe的起始位置、索引的长度、数据的长度、Stripe Footer的长度等等,各column的统计信息:最大值、最小值、hasNull等。Postscript中存放着File Footer的长度、文件的压缩参数、文件的版本信息等。
2025-08-08 14:57:48
224
原创 Hive中的窗口函数与窗口范围
先说窗口范围吧,它有两种分类:基于行(row)的窗口范围和基于值(range)的窗口范围。但是不论是基于行的窗口范围还是基于值的窗口范围,他们针对的都不是整个数据表,而是在运行时的各个切片之后的表。sum()、count()、max()、min()、avg()...这些聚合函数都可以作为窗口函数来使用。dense_rank():密集型排序(1,1,2,3,3,3,4)lead()和lag()不允许自定义窗口范围!rank():密集型排序(1,1,3,4,4,6)(2)、跨行取值的函数。
2025-08-07 16:15:46
458
原创 Hive中的UDTF函数(炸裂函数)
UDTF函数很类似,它的全称是User Defined Table-Generating Functions即用户自定义的制表函数,也就是说它可以将一行数据炸裂成一个数据表,因此也叫做炸裂函数。Lateral View可以将UDTF炸裂出来的数据表应用到源表中的每行数据中,将每行源表数据与炸裂出的数据表中的每行进行连接,形成一个虚拟表。函数功能:将一个数组炸裂成一个多行两列的数据表。实现语法:select explode(map("a",1,"b",2,"c",3)) as (key,value);
2025-08-07 13:43:52
347
原创 Hive中的Order By和Sort By的区别
生产环境中,一般不会单独的使用这两个SQL语句,因为生产环境中数据量十分大,对全局排序或者对每个Reduce中的数据进行排序都会耗费非常长的时间。Order By是对全局数据的排序,在这个SQL语句中只有一个Reduce Task,因为只有全局数据都在一个Reduce中才会实现全局排序。Sort By是对每个Reduce中的数据进行排序。他可以保证每个Reduce中的数据有序,但是Reduce之间的数据不能保证有序。
2025-08-07 10:05:49
105
原创 Hive中的Join操作
前提是要进行关联的两个表都是分桶表,分桶字段与关联字段是相同的,并且两个分桶表的分桶数之间是整数倍关系(这些前提都是为了保证两个分桶表的分桶之间是一一对应的关系,可能会出现一个分桶对应多个分桶的情况,但是一定不会有多个分桶对应多个分桶的情况)。之后第二个Map Task去读取分桶数多的分桶表的数据,每个分桶对应的Map Task先去读取对应分桶的缓存数据,然后每读一条另一个分桶表中的数据就去对应缓存中找是否有相对应的字段的数据进行关联。Map Join算法是通过两个Map Task来实现两个表的数据关联。
2025-08-06 17:00:09
929
原创 Hive中的分区表和分桶表
动态分区的出现个人理解是为了满足一类需求就是我有源数据,但是我现在想对这个数据表进行分区,而需要分区的那个字段又有很多的值,如果手动的进行分区会十分麻烦,所以现在就将这个字段作为最后一个字段,让其自动的按其值进行分区。在实际存储分区表时,不同分区的数据是在不同目录中的,目录的名字就是我们所声明的分区字段的名字以及其所对应的值,例如:day=20220401。其相应的语句操作与分区操作差不多的。比如:我们的一级分区是按day(天)字段进行的分区,那我们还想在天的基础上按hour(小时)进行二级分区。
2025-08-05 15:12:02
350
原创 简述一下Hive
为什么说Hive是基于Hadoop的呢?首先Hive映射成的数据表是存储在HDSF中的;其次Hive要将SQL语句在底层解析成MapReduce程序来进行计算;最后Hive的运行程序是在Yarn的管理下执行的。Hive是一个基于Hadoop的数据仓库工具。它能够将结构化的数据文件映射为一张表,并提供类SQL查询的功能。
2025-08-04 16:38:36
109
原创 Spark中的Spark Streaming的介绍
但是对于无界数据流来说,它的数据是源源不断的来的,没有终止。例如:在RDD中封装了一个求一批数据中的最大值的处理逻辑,那对于有界数据流来说,它一定是会有最大值的,但是对于无界数据流来说,它不知道后面新来的数据会不会比前面来的大,所以他就无法获得最终的结果,所以就无法直接使用RDD数据结构来处理无界数据流。从最终效果上来说,它就是要把无界数据流的数据划分成为有界数据流,通过数据采集器(一个新的数据模型--离散化流DStream)采集微批量的数据,将其当做有界数据流来处理。这里所说的流数据就指的是无界流数据。
2025-08-03 11:10:13
220
原创 Spark中SparkSQL的数据源
本质原因就是sparkSQL其实是对RDD的封装,RDD底层读取数据按照的是hadoop的方式,而hadoop底层是按行读取的,所以如果是分行的形式,那他第一行读取到的只是一个“[”,它是解析不出来的,他不能将整个文件按JSON的形式来解析,依然是按照行来解析的,这时就会出现问题。这种情况下默认是不能将多个文件写在同一个csv文件路径下的,要想改变这种方式,就需要添加配置命令“.mode("append")”(除了append这种追加写之外,还有overwrite等等)。(2)、JSON文件。
2025-08-02 20:11:10
359
原创 Spark中的UDF、UDAF函数对象
比如一个案例,要将查询出来的name字段的值之前加上一个字符串“Name:”,这一过程不能用简单的像Java一样用“Name:”+name就可以实现,对于SQL这种半结构化语言来说无法高效的实现。所以就可以把UDF函数类比于简单的SUM()函数就可以。利用的函数是sparkSession.udf().register(),在该方法中需要传递三个参数:参数一是注册的函数的名称;参数三是注册的函数的返回值类型(这里有点麻烦的点是,我们传入的参数三可能是Scala语言的写法,这在用Java开发时不得以而写的)。
2025-08-01 14:57:12
317
原创 Spark中的Spark SQL理解
而Spark SQL做的事情就是对结构化数据处理模块的封装。(在这里可以稍做补充,结构化数据一般指的是table、json数据;半结构数据一般是xml、html数据;非结构化数据一般是视频、图片、语音等数据)前因是Spark RDD,从RDD的局限性中可以看出来RDD主要侧重于数据的处理逻辑。忽略了对数据格式的处理,这就导致RDD在接入数据时对数据格式的处理出现问题。因此需要对数据处理逻辑的封装。Spark SQL的出现除了是因为需要对RDD的处理逻辑的封装之外,还有另外的原因......
2025-07-28 18:36:05
104
原创 Spark的序列化和持久化操作
代码的逻辑准备的内容就是main函数中的内容给,它是在Driver端执行的。在checkpoint实际的执行过程中,为了保障存储的数据的安全性,一般会将要保存数据之前的逻辑执行两遍,将第二遍的执行结果保存,这一过程其实也会造成计算的重复。而出现持久化的操作是因为RDD中的处理数据在向下流转的过程中有时候不保存数据也是不利的。例如下面的操作过程,我只是想在最后一步的RDD中不去做reduceByKey的操作,而是去做groupByKey的操作,前面的过程都一样,如果不进行持久化,就会造成计算的重复。
2025-07-28 16:12:07
329
原创 Spark中RDD的依赖关系
至于为什么需要了解RDD之间的依赖关系,就是数据在向下流转的过程中是可能会出现问题的,那么有了这种依赖关系和血缘关系就可以回溯数据的来源。因为在数据的流转过程中,如果下一级的数据出现了问题时,由于他上一级RDD是不会存储数据的,那么他就需要通过这种依赖关系或者血缘关系来回溯数据了。RDD中的依赖关系也是一样的,就是后面逻辑中的RDD用到了前面关系中的RDD,那么他们之间就存在依赖关系。RDD中的依赖关系其实说的不是RDD对象之间的关系,本质上是不同RDD中的分区数据之间的关系。
2025-07-28 11:22:53
158
原创 groupByKey和reduceByKey算子的区别
reduceByKey算子在Shuffle阶段之前会对数据进行预聚合操作,就是预先将相同分组的数据按照聚合逻辑进行聚合,这样就可以减少Shuffle落盘的数据量。而groupByKey算子在Shuffle之前并不会对数据进行预聚合。所以一般来说,reduceByKey算子的执行效率要比reduceByKey算子的执行效率高。reduceByKey算子既会对数据按照相同的Key进行分组,又会在相同分组中对数据进行聚合。groupByKey算子只会对数据按照相同Key进行分组,不会对数据进行聚合。
2025-07-28 10:00:46
187
原创 部署Spark的几种方式
前面的还是一样的,Spark中的业务代码(Jar)包通过spark-submit.sh来进行上传,然后运行整个Spark程序,在运行时会开启一个JVM进程,这个进程会去将我的Spark程序提交给Yarn中的Resource Manager(在这之前就需要先对Spark进行配置,要让Spark知道Yarn的位置),然后RM会根据程序来去启动所需要的NM,在NM中会对应的去分配Container容器资源,在Container中去执行相关的程序。在生产环境下,我们一般采用的是Yarn + Spark的方式。
2025-07-27 21:48:41
441
原创 Spark中RDD的常见算子
摘要:RDD算子分为转换算子(如map、flatMap、filter)和行动算子两类,前者控制数据流转,后者触发计算。map算子通过函数式编程(lambda)实现单值数据映射,生成的新RDD保持原分区数量和顺序。RDD数据处理具有"区内有序、区间无需"的特点,且数据无需等待其他数据完成当前RDD处理即可流转(RDD不存储数据)。flatMap算子用于一对多数据展开。实际开发中只需掌握常用算子,遇到新算子可随时查询。(149字)
2025-07-25 18:07:40
373
原创 Spark的RDD中作业、阶段、任务之间的数量关系
阶段(Stage):是一个Job中RDD的计算流程,默认就是一个完整的阶段。但是如果在计算流程中有Shuffle,那么流程就会一分为二,分开的每一个阶段就是一个Stage。前一个阶段不执行,后一个阶段就不会执行。任务的数量是每一个阶段的分区数量之和(在源码中其实是每一个阶段中最后一个RDD的分区的数量)阶段的数量与Shuffle依赖(宽依赖)之间的数量关系:1+Shuffle依赖的数量。任务(Task):每一个Executor执行时的计算单元。作业(Job):行动算子执行时,会触发作业的执行。
2025-07-25 10:18:59
158
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅