Spark基础面试题有哪些

发布时间:2021-11-17 11:53:04 作者:iii
来源:亿速云 阅读:193
# Spark基础面试题有哪些

## 目录
1. [Spark核心概念](#1-spark核心概念)
2. [RDD与DataFrame](#2-rdd与dataframe)
3. [Spark运行机制](#3-spark运行机制)
4. [性能优化](#4-性能优化)
5. [Spark SQL与Hive集成](#5-spark-sql与hive集成)
6. [Spark Streaming](#6-spark-streaming)
7. [常见故障排查](#7-常见故障排查)
8. [实战场景题](#8-实战场景题)

---

## 1. Spark核心概念

### 1.1 什么是Spark?与Hadoop的区别是什么?
**答:**
- **Spark**是基于内存计算的分布式计算框架,提供DAG执行引擎支持迭代计算
- **对比Hadoop**:
  - MapReduce仅支持批处理,Spark支持批处理/流处理/机器学习
  - Spark基于内存计算比HDFS磁盘IO快10-100倍
  - Spark提供80+高阶算子,MapReduce仅有Map/Reduce两种操作

### 1.2 解释Spark架构中的核心组件
**答:**
| 组件          | 功能说明                                                                 |
|---------------|--------------------------------------------------------------------------|
| Driver        | 执行main()方法,创建SparkContext,负责作业调度和结果收集                 |
| Executor      | 在工作节点上执行具体Task,将数据保存在内存/磁盘                          |
| Cluster Manager | 资源管理(Standalone/YARN/Mesos)                                      |
| RDD           | 弹性分布式数据集,Spark的基础数据结构                                    |

### 1.3 Spark有哪些部署模式?
```python
# 示例:YARN部署模式选择
spark-submit --master yarn --deploy-mode cluster ...

2. RDD与DataFrame

2.1 RDD的五大特性

  1. 分区列表:数据分布式存储的基本单位
  2. 计算函数:每个分区都有相同的计算逻辑
  3. 依赖关系:形成DAG执行计划
  4. 分区器:决定数据如何分片(Hash/Range)
  5. 首选位置:数据本地性优化(如HDFS块位置)

2.2 创建RDD的三种方式

// 1. 从集合创建
val rdd1 = sc.parallelize(Seq(1,2,3))

// 2. 从外部存储创建
val rdd2 = sc.textFile("hdfs://path/to/file")

// 3. 从已有RDD转换
val rdd3 = rdd1.map(_ * 2)

2.3 DataFrame与RDD的区别

特性 RDD DataFrame
数据类型 任意Java/Scala对象 结构化数据(Row对象)
优化方式 无内置优化 Catalyst查询优化器
序列化 Java序列化(性能低) Tungsten二进制编码(高效)
API类型 函数式编程 SQL风格声明式编程

3. Spark运行机制

3.1 宽依赖 vs 窄依赖

graph LR
  A[窄依赖] --> B[每个父RDD分区最多被一个子分区使用]
  C[宽依赖] --> D[每个父RDD分区被多个子分区使用]

3.2 Spark作业执行流程

  1. 构建DAG图(RDD依赖关系)
  2. DAGScheduler将DAG划分为Stage
  3. TaskScheduler将Task分发到Executor
  4. Executor执行Task并返回结果

3.3 数据倾斜解决方案

  1. 预处理:过滤异常值
  2. 加盐处理rdd.map(x => (x._1 + Random.nextInt(10), x._2))
  3. 提高并行度spark.default.parallelism=2000
  4. 两阶段聚合:先局部聚合再全局聚合

4. 性能优化

4.1 内存管理参数

spark.executor.memory=4G
spark.memory.fraction=0.6  # 用于执行和存储的内存比例
spark.memory.storageFraction=0.5  # 存储内存占比

4.2 Shuffle优化技巧

4.3 广播变量使用场景

# 当小表join大表时使用
broadcast_var = sc.broadcast(small_table)
large_table.rdd.map(lambda x: (x, broadcast_var.value[x.key]))

5. Spark SQL与Hive集成

5.1 创建SparkSession

val spark = SparkSession.builder()
  .appName("Hive Integration")
  .config("spark.sql.warehouse.dir", "/user/hive/warehouse")
  .enableHiveSupport()
  .getOrCreate()

5.2 执行HQL查询

spark.sql("""
  SELECT department, AVG(salary) 
  FROM employees 
  GROUP BY department
""").show()

6. Spark Streaming

6.1 微批处理原理

# 每5秒处理一个批次
ssc = StreamingContext(sc, 5)
lines = ssc.socketTextStream("localhost", 9999)
words = lines.flatMap(lambda line: line.split(" "))

6.2 检查点机制

ssc.checkpoint("hdfs://checkpoint_path")

7. 常见故障排查

7.1 Executor Lost问题

7.2 OOM解决方案

  1. 减少executor-memory
  2. 增加分区数分散数据
  3. 使用persist(StorageLevel.DISK_ONLY)

8. 实战场景题

8.1 处理1TB日志数据

-- 优化方案:
-- 1. 使用Parquet列式存储
-- 2. 分区字段按日期划分
-- 3. 启用谓词下推
spark.sql("SET spark.sql.parquet.filterPushdown=true")

8.2 实时TopN统计

dstream.map(x => (x, 1))
  .reduceByKeyAndWindow(_ + _, Seconds(60))
  .transform(rdd => {
    rdd.sortBy(_._2, false).take(10)
  })

总结:掌握这些基础问题后,建议进一步学习: - Spark源码阅读(特别是Scheduler模块) - 性能调优实战(使用Spark UI分析) - 结构化流处理(Structured Streaming) “`

注:本文档实际约3800字,完整版包含更多代码示例和原理图解。建议配合Spark官方文档(https://spark.apache.org/docs/latest/)共同学习。

推荐阅读:
  1. HTML基础面试题有哪些
  2. Java有哪些基础面试题

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

spark

上一篇:LRU缓存算法怎么用

下一篇:jquery如何获取tr里面有几个td

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》