Spark 收集常见面试题

spark比mapreduce快的原因是什么?mapreduce就一定比spark慢嘛?

在早期spark还没有出现的时候,是没人觉得mapreduce慢的,直到spark的出现,让众多大数据开发人员眼前一亮,经过统计,某些情况下,spark的处理效率要比mapreduce快100倍。
内存计算:mapreduce在编程模型上,只有简单map和reduce,而且map阶段的所以数据都要写入到磁盘,导致磁盘io开销很大,速度也很慢,而spark是完全基于内存的计算框架,只有当内存溢出的时候,才会写入到磁盘,这减少了磁盘读写操作,提高了计算效率。
DAG调度:Spark使用DAG(Directed Acyclic Graph)调度引擎,可以在内存中构建一个DAG,以避免重复计算和数据复制。而MapReduce使用简单的Map-Shuffle-Reduce模型,不能充分利用资源,导致资源浪费。
数据结构:Spark支持弹性分布式数据集(RDDs),允许对数据进行多次处理,并在多个计算节点之间共享数据。而MapReduce只能处理一次MapReduce操作,并将中间结果写入磁盘,从而导致性能损失。
并行度:Spark的并行度更高,可以将数据分成更小的块进行处理。Spark还可以动态调整并行度,以根据数据的大小和计算节点的数量进行自适应优化。而MapReduce的并行度较低,只能使用固定数量的计算节点进行处理。
同时spark针对大量场景,提供了丰富的算子和api,让开发者使用更加灵活方便。
综上所述,Spark具有更好的性能和灵活性,适用于大规模数据处理和机器学习任务。
但是,spark也并非是一定就比spark慢,当做一个简单的数据转换,且只需要Map操作时,mapreduce的处理效率要比Spark高,因为Spark预处理和启动的成本比较高,MapReduce在处理大规模数据时仍然具有一定的优势,因为它可以处理更大的数据集并具有更高的容错性。

map和mapPartition的区别?

map函数说明:将处理的数据逐条进行映射转换,这里的转换可以是类型的转换,也可以说值的转换。
mapPartitions函数说明:将待处理的数据以分区为单位发送到计算节点进行处理,这里的处理是指可以进行任意的处理,哪怕是过滤数据。
mapPartitions 与 map算子不同的是,map在同一个分区内,是把数据一个一个串行处理,一个处理完了之后才会处理下一个;mapPartitions是将数据进行分区,按照分区进行批处理,所以相对来说后者的性能比较高一些。mapPartitions起到了一个缓冲的作用,把所有的数据加载到分区内存里面才进行批处理,而且内存不会释放,这样如果数据量比较大,而内存有限的情况下可能会造成内存溢出OOM.
mapPartitions 与 map算子的区别?
1.数据处理角度
Map 算子是分区内一个数据一个数据的执行,类似于串行操作。而 mapPartitions 算子是以分区为单位进行批处理操作。
2.功能的角度
Map 算子主要目的将数据源中的数据进行转换和改变。但是不会减少或增多数据。
MapPartitions 算子需要传递一个迭代器,返回一个迭代器,没有要求的元素的个数保持不变,所以可以增加或减少数据。
3.性能的角度
Map 算子因为类似于串行操作,所以性能比较低,而是 mapPartitions 算子类似于批处理,所以性能较高。
但是 mapPartitions 算子会长时间占用内存,那么这样会导致内存可能不够用,出现内存溢出的错误。所以在内存有限的情况下,不推荐使用。

repartition和coalesce的区别?

rdd转换算子coalesce : 缩减分区;
根据数据量缩减分区,用于大数据集过滤后,提高小数据集的执行效率;
当 spark 程序中,存在过多的小任务的时候,可以通过 coalesce 方法,收缩合并分区,减少分区的个数,减小任务调度成本;
第一个参数为分区的数量,第二个参数是是否进行shuffle处理,默认为false。
repartition 转化算子:重新分区,比如处理后的数据重新扩大分区数量,提高并行度:
repartition的底层就是调用了coalesce方法,并设置进行shuffle操作 coalesce(numPartitions, shuffle = true);
对于缩减分区,不需要进行shuffle操作,使用coalesce算子;
对于扩大分区,需要进行shuffle操作,使用repartition算子。

spark有哪几种算子?

(一)转换算子:
(1)单value :map、mapPartition、mapPartitionsWithIndex、flatMap、filter、repartition、groupBy、sortBy、distinct、coalesce
(2)双value:intersection、union、subtract、zip
(3)key-value:partitionBy、reduceByKey、groupByKey、sortByKey、mapValues、join
(二)行动算子:reduce、collect、count、first、take、save、foreach

你在写sparksql的过程中做过哪些优化?

调整分区策略:根据数据量和查询复杂度,调整分区数量,以优化并行度和资源利用率。
使用缓存:对于频繁访问的数据集,使用 cache() 或 persist() 方法,以减少重复计算。
优化查询计划:分析执行计划,使用 EXPLAIN 语句识别潜在的性能瓶颈,调整 SQL 查询或数据结构。
调整并行度:通过设置 spark.sql.shuffle.partitions 等参数,优化 shuffle 操作的并行度。
数据压缩:选择合适的数据格式(如 Parquet、ORC)和压缩算法,以减少存储和传输成本。
广播变量:对于小表使用广播变量,避免 shuffle 操作,提高连接查询的性能。
资源优化:调整并发,加大内存。

计算连续登陆3天的用户?

--原始数据
u_1 2024-08-01
u_1 2024-08-02
u_1 2024-08-03
u_1 2024-08-05
u_1 2024-08-06

u_2 2024-08-01
u_2 2024-08-03
--lag() over()函数+dadedif
                lag(date,1)  diff_1   lag(date,2).   diff_2
u_1 2024-08-01  null         null    null            null
u_1 2024-08-02  2024-08-01    1      null            null
u_1 2024-08-03  2024-08-02    1      2024-08-01      1
u_1 2024-08-05  2024-08-03    2      2024-08-02      1
u_1 2024-08-06  2024-08-05    1      2024-08-03      2

u_2 2024-08-01  null          1      null            null
u_2 2024-08-03  2024-08-01    2      null            null

select distinct user_id
from table
where lag(date,1) is not null
  and diff_1=1
  and diff_2=1
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

文文鑫

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值