sample 算子_Spark----RDD及算子

Apache Spark是一个为大规模数据处理设计的快速通用计算引擎,以其内存计算速度和多语言支持著称。RDD(Resilient Distributed Dataset)是Spark的核心概念,具有分布式、容错性和转换算子等特点。本文介绍了RDD的特性、Spark的任务执行原理以及常见的Transformation和Action算子,如filter、map、reduceByKey、count等,并探讨了缓存与持久化策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Spark概念:

Apache Spark是专门为大规模数据处理而设计的快速通用的计算引擎。Spark是加州大学伯克利分校的AMP实验室所开源的类Hadoop MapReduce的通用并行计算框架,Spark拥有Hadoop MapReduce所具有的所有优点,但不同于MapReduce的是Job中间输出结果可以保存在内存中,从而不需要读写HDFS,因此Spark能更好的的适用于数据挖掘与机器学习等需要迭代的MApReduce的算法。

Spark特点:

(1)速度快。Spark是基于内存的分布式计算框架,高效DAG执行引擎

(2)支持java,Scala,Python,R,Sql等语言进行开发。

(3)通用:上层模块都是SparkCore的延伸。

(4)运行模式包含:

local:可以在本地eclipse、IDEA中写Spark代码,在本地运行,多用于测试

Yarn:Hadoop生态圈中的资源调度框架,Spark也可以基于Yarn运行

Standalone:Spark中自带的资源调度框架,支持分布式搭建。

Mesos:资源调度框架

Spark技术栈:

HDFS、Hadoop、Hive、MapReduce,Storm

SparkCore(处理批数据)、SparkSql(使用SQL处理分布式数据)、Sparkstreaming(处理流式数据)

弹性分布式数据集----RDD(Resilient Distributed Dataset):

a7f12d5e3a2f5f0dd95a5f36dec6bafd.png

textFile方法底层封装的是MR读取文件的方式,读取文件前先split,默认split大小是一个block大小,这里split也同时对应一个partition。

RDD五大特性:

(1)RDD是由多个partition组成

(2)算子(函数)是作用在partition上

(3)RDD之间有依赖关系

(4)分区器是作用在K,V格式的RDD上

(5)Partition对外提供最佳的计算位置,利于数据处理的本地化,体现了大数据中“计算向数据移动“的理念。

*******K、V格式的RDD*******

如果RDD里面存储的数据都是二元组对象,那么这个RDD我们就称之为K,V格式的RDD

*******RDD的分布式体现*******

RDD是由Partition组成,partition是分布在不同节点上的

*******RDD的弹性体现(容错)*******

1.partition分布在多个节点上,并且大小没有限制

2.RDD之间有依赖关系,可以基于一个RDD重新计算出来新的RDD

Saprk任务执行原理:

337ee753fbfaa2ac9be18ce9fe4c5039.png

Driver和Worker是启动在节点上的进程,是运行在JVM中的进程

1.Driver与集群节点之间有频繁的通信

2.Driver负责任务(tasks)的分发和结果的回收,任务的调度。如果task的计算结果非常大就不能回收了,否则会造成OOM。

3.Worker是Standalone资源调度框架里面资源管理的从节点,也是JVM进程

4..Master是Standalone资源调度框架里面资源管理的从节点,也是JVM进程

Spark算子:

Transformation类算子

也叫转换算子,是懒执行(也叫延迟执行),需要Action算子触发,包含:

filter:过滤符合条件的记录数,true保留,false过滤掉

map:将一个RDD中的每个数据项,通过map中的函数映射变成一个新的元素

特点:输入一条,输出一条数据

flatMap:先map后flat。与map类似,每个输入项可以映射为0到多个输出项

sample:随机抽样算子,根据传进去的小数按比例进行放回,或者无放回的抽样

reduceByKey:将相同的Key根据相应的逻辑进行处理

sortByKey/sortBy:作用在K、V格式的RDD上,对key进行升序或者降序

Action行动算子:

Transformation类算子是延迟执行的,是由Action类算子触发执行的。一个application应用程序中有几个Action类算子,就有几个job执行。

count:返回数据集中的元素数,会在计算结果完成后回收到Driver端

take:返回一个包含数据集前n个元素的集合

first:first=take(1),返回数据集中的第一个元素

foreach:循环遍历数据集中的每一个元素,运行相应的逻辑

collect:将计算结果回收到Driver端

持久化算子:

是Spark快速计算的一个重要原因,简单来说,它就是将RDD中的一些数据在内存中进行持久化,这样下次调用这些数据就不需要再去磁盘中读取,大大减少了IO的读取,并且基于内存,读取速度非常快。

273bca417a45d5d68cad2a1e654b292e.png

cache:默认将数据存储在内存中

cache()=persist()=persist(StorageLevel.MEMORY_ONLY)

persist:

可以手动指定持久化级别。

常用级别:

MEMORY_ONLY

MEMORY_ONLY_SER

MEMORY_AND_DISK

MEMORY_AND_DISK_SER

尽量少用DISK_ONLY和“_2”级别

checkpoint:

(1)cache和persist都是懒执行,持久化的单位是partition

(2)对一个RDD进行cache或者persist时,可以赋值给一个变量/也可以不赋值给一个变量,下个job中使用这个变量就是使用的持久化的数据。

(3)如果使用第二种方式,对RDD持久化之后,后面不能紧跟action算子。例如:lines.persist().count()

(4)持久化的数据是由spark自动存储,当Spark Application停止后,这个数据就会自动清除。

Spark(Scala编程语言创建的大规模数据处理框架)的核心数据结构是弹性分布式数据集(RDD,Resilient Distributed Dataset)。在Spark中,RDD算子(Operators)是一系列可以应用于RDD的函数,它们负责执行任务并生成新的RDD,实现了数据的高效并行处理。以下是几种主要类型的RDD算子: 1. **基础算子**: - `map`: 应用一个函数到每个元素上,返回一个新的RDD- `filter`: 选择满足特定条件的元素,返回一个新的RDD- `flatMap`: 对每个元素应用一个函数,然后展开结果,相当于`map`之后再`flatten`。 - `reduceByKey` 和 `aggregateByKey`: 分组数据并进行累积操作,如求和、平均等。 2. **转换算子**: - `groupByKey` 和 `cogroup`: 将数据分组并返回键及其对应的列表。 - `join` 和 `leftOuterJoin`, `rightOuterJoin`, `fullOuterJoin`: 按照键进行连接,可以选择不同类型的数据匹配。 - `union`, `subtract`, `intersection`: 结合、排除和取交两个RDD。 3. **动作算子**: - `count`: 计算RDD中元素的数量。 - `collect` 和 `take`: 将整个RDD收集到内存,用于查看数据。 - `saveAsTextFile` 或 `write` (如Parquet, JSON): 将结果保存到磁盘或特定格式的文件中。 4. **分区算子**: - `repartition`: 改变RDD的分区数,提高后续操作的性能。 - `coalesce`: 合并部分分区,减少网络通信。 5. **特殊算子**: - `sortByKey` 和 `top/k`: 根据键值排序,或返回前k个元素。 - `sample`: 随机抽样数据。 这些算子都是无状态的,即不会记住之前的操作,适合大规模并行处理。每个算子都在分布式环境中执行,充分利用集群资源。Spark的API设计鼓励用户采用懒惰计算(lazy evaluation),只有当结果被需要时才会真正触发计算,这种延迟执行有助于优化性能和资源利用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值