spark技术基础知识

1. Spark的宽窄依赖划分

Q: Spark中如何划分宽依赖和窄依赖?

  • A:
    • 窄依赖:父RDD的每个分区最多被一个子RDD的分区依赖(如mapfilter),不会触发shuffle。
    • 宽依赖:父RDD的每个分区可能被多个子RDD的分区依赖(如groupByKeyreduceByKey),会触发shuffle。

Q: 宽依赖和窄依赖对性能的影响是什么?

  • A:
    • 窄依赖:计算效率高,数据不需要跨节点传输。
    • 宽依赖:涉及shuffle操作,数据需要跨节点传输,可能导致性能瓶颈。

2. Spark的Stage划分

Q: Spark中Stage是如何划分的?

  • A:
    • 从DAG的最后一个RDD开始逆向遍历,遇到宽依赖就断开,划分为一个新的Stage;遇到窄依赖则将RDD加入当前Stage。

Q: Stage的类型有哪些?

  • A:
    • ShuffleMapStage:负责shuffle数据的写入。
    • ResultStage:负责最终结果的输出。

Q: Stage划分的优化手段有哪些?

  • A:
    • 减少宽依赖的数量。
    • 使用coalescerepartition优化分区数量。
    • 避免不必要的shuffle操作。

3. Spark的作业提交流程

Q: Spark作业的提交流程是怎样的?

  • A:
    1. 用户通过spark-submit提交应用。
    2. Driver程序启动,调用用户定义的main()方法。
    3. Driver与集群管理器通信,申请资源启动Executor。
    4. Executor启动后,Driver将任务分发到Executor执行。
    5. Executor执行任务并将结果返回给Driver。
    6. 任务完成后,Driver释放资源。

Q: Driver和Executor的作用分别是什么?

  • A:
    • Driver:负责作业调度和任务分配。
    • Executor:负责执行具体的任务并存储数据。

4. Transformation和Action的区别

Q: Transformation和Action的区别是什么?

  • A:
    • Transformation :惰性操作,返回一个新的RDD(如mapfilter)。
    • Action :触发实际计算,返回结果或写入外部存储(如countsaveAsTextFile)。

Q: 为什么Transformation是惰性的?

  • A:
    • 惰性操作允许Spark优化执行计划,减少不必要的计算。

5. foreach和foreachPartition的区别

Q: foreachforeachPartition的区别是什么?

  • A:
    • foreach:对RDD的每个元素执行操作。
    • foreachPartition:对每个分区的数据迭代器执行操作,适合批量处理。

Q: 什么场景下使用foreachPartition

  • A:
    • 当需要与外部系统(如数据库)交互时,使用foreachPartition可以减少连接开销。

6. Spark的Shuffle流程

Q: Spark的Shuffle流程是怎样的?

  • A:
    • Shuffle Write:Map Task将数据按分区写入磁盘。
    • Shuffle Read:Reduce Task从各个节点拉取数据并进行聚合。

Q: Shuffle过程中可能遇到的问题有哪些?

  • A:
    • 数据倾斜。
    • 网络传输瓶颈。
    • 磁盘I/O性能问题。

7. Spark Shuffle参数调优

Q: 常见的Shuffle调优参数有哪些?

  • A:
    • spark.shuffle.file.buffer:控制Shuffle Write的缓冲区大小。
    • spark.reducer.maxSizeInFlight:控制Shuffle Read的缓冲区大小。
    • spark.shuffle.io.maxRetries:控制Shuffle Read失败重试次数。

Q: 如何优化Shuffle性能?

  • A:
    • 增加缓冲区大小。
    • 减少数据倾斜。
    • 使用高效的序列化方式(如Kryo)。

8. Spark与Hadoop的对比

Q: 为什么Spark比Hadoop更适合迭代处理?

  • A:
    • Spark使用内存计算,减少了磁盘I/O开销。
    • RDD的缓存机制(cachepersist)可以复用中间结果。

Q: Spark和Hadoop的主要区别是什么?

  • A:
    • 计算模型:Spark基于内存计算,Hadoop基于磁盘计算。
    • API:Spark提供了更高级的API(如RDD、DataFrame)。
    • 性能:Spark在迭代计算和交互式查询中性能更优。

9. Spark的内存管理

Q: Spark的内存分为哪几部分?

  • A:
    • Execution Memory:用于任务执行(如Shuffle、Join)。
    • Storage Memory:用于缓存RDD和数据。
    • User Memory:用于用户代码和数据结构。

Q: 如何优化Spark的内存使用?

  • A:
    • 调整spark.memory.fractionspark.memory.storageFraction
    • 使用高效的序列化方式。
    • 避免缓存不必要的数据。

10. Spark的容错机制

Q: Spark如何实现容错?

  • A:
    • 通过RDD的血缘关系(Lineage)重新计算丢失的分区。
    • 使用Checkpoint机制将RDD持久化到可靠存储。

Q: Checkpoint和Cache的区别是什么?

  • A:
    • Cache:将数据缓存到内存或磁盘,速度快但不可靠。
    • Checkpoint:将数据持久化到可靠存储(如HDFS),速度慢但可靠。

11. Spark SQL与DataFrame

Q: Spark SQL和DataFrame的关系是什么?

  • A:
    • DataFrame是Spark SQL的核心抽象,类似于关系型数据库中的表。
    • Spark SQL提供了SQL接口来操作DataFrame。

Q: DataFrame和RDD的区别是什么?

  • A:
    • DataFrame:具有schema信息,支持SQL查询和优化。
    • RDD:低层次抽象,灵活性更高但需要手动优化。

12. Spark Streaming

Q: Spark Streaming的工作原理是什么?

  • A:
    • 将实时数据流划分为小批次(micro-batches),每个批次作为一个RDD处理。

Q: Structured Streaming和Spark Streaming的区别是什么?

  • A:
    • Spark Streaming:基于RDD的微批处理。
    • Structured Streaming:基于DataFrame的流处理,支持事件时间和窗口操作。

13. Spark的性能调优

Q: 常见的Spark性能调优手段有哪些?

  • A:
    • 增加并行度。
    • 减少Shuffle操作。
    • 使用广播变量减少数据传输。
    • 调整内存和CPU资源分配。

Q: 如何诊断Spark作业的性能瓶颈?

  • A:
    • 使用Spark UI查看任务执行时间和Shuffle数据量。
    • 使用日志分析工具(如ELK)排查错误和延迟。

14. Spark与Flink的对比

Q: Spark和Flink的主要区别是什么?

  • A:
    • 计算模型:Spark基于微批处理,Flink基于流处理。
    • 延迟:Flink的延迟更低,适合实时性要求高的场景。
    • API:Spark的API更丰富,Flink的流处理API更强大。
相关推荐
黑客老李13 分钟前
一次使用十六进制溢出绕过 WAF实现XSS的经历
java·运维·服务器·前端·sql·学习·xss
爱北的琳儿26 分钟前
CentOS7清理大文件(/dev/vda1几乎接近于满状态)
运维·服务器
圆️️32 分钟前
12c及以后 ADG主备切换
服务器·网络·数据库
一个高效工作的家伙43 分钟前
安装mariadb+galera搭建数据库集群
运维·服务器·数据库
web147862107235 小时前
SQL Server详细使用教程(包含启动SQL server服务、建立数据库、建表的详细操作) 非常适合初学者
服务器·数据库·oracle
m0_7482411210 小时前
集成开发环境GoLand安装配置结合内网穿透实现ssh远程访问服务器
运维·服务器·ssh
Golinie11 小时前
【C++高并发服务器WebServer】-17:阻塞/非阻塞和同步/异步、五种IO模型、Web服务器
服务器·c++·异步·webserver
流星白龙11 小时前
【Linux】30.Linux 多线程(4)
linux·运维·服务器