B站学习打卡——大数据面试需要注意的问题4

本文探讨了Spark中关键的算子选择及序列化策略,对比了map与mapPartition、foreach与foreachPartition等算子的区别,并讨论了groupByKey与reduceByKey的选择依据。此外,还介绍了如何通过序列化提升Spark性能。

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

学习目标:

P34-42


学习内容:

1、算子的合理选择

2、序列化方式的合理选择

一、算子的合理选择

Spark中的RDD:RDD是可伸缩的数据集,解决了MR的每一步骤需要落实而造成的开销很大的问题。RDD 是一个基于分区的、只读的数据记录集抽象。RDD 只可以通过对持久存储或其他 RDD 进行确定性运算得来,这种运算被称为变换常用的变换算子包括:map,filter 和 join。

用法基本相似,只不过是action和transformationaction的区别,写数据库一定要使用xxxpartition。

map VS map partition(分区)

foreach VS foreeach partition :常用于将数据写入到数据库中。

groupByKey VS  reduceByKey: groupByKey是将每个元素的出现打印出来(元素,1,1,1,1) 需要使用map对出现次数求和。而reduceByKey直接就是(元素,总次数)前者的shuffle的数据量要多,因此在进行wordcount这类工作是应该优先考虑reduceByKey。

groupByKey所有的Key的数据都经过了shuffle,而reduceByKey是在map端做一个本地的聚合,然后将聚合后的数据进行shuffle。

collect:执行结果的数据都放在一个数组里,但是在数据量不清晰的情况下,所有数据都需要返回Driver里,但是Driver的内存是固定的,因此collect在我们无法确定Driver能存下多少数据量的情况下,这个算子要慎用。   

coalesce VS repartition:coalesce(Int,Shuffle:Boolean  = false),当我们不对shuffle定义,默认下为不进行Shuffle过程的,这事对分区的大小做调整,只能缩小,不能放大,并且一旦我们设置的值超过原来大小,则输出原来的值,而定义True,则可以进行更改啦。会导致数据倾斜。repartition将分区由少变多。

cache没有切断血缘关系,一般用于以后还会用到当前数据的相关数据。cache调用的是persist(),persist调用的是persist(MEMORY_ONLY)。

2、合理的序列化整合Spark使用为性能提速

序列化(Java)、序列化(Kyro)


学习时间:4h

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值