您好,登录后才能下订单哦!
密码登录
登录注册
点击 登录注册 即表示同意《亿速云用户服务条款》
# 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 ...
// 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)
特性 | RDD | DataFrame |
---|---|---|
数据类型 | 任意Java/Scala对象 | 结构化数据(Row对象) |
优化方式 | 无内置优化 | Catalyst查询优化器 |
序列化 | Java序列化(性能低) | Tungsten二进制编码(高效) |
API类型 | 函数式编程 | SQL风格声明式编程 |
graph LR
A[窄依赖] --> B[每个父RDD分区最多被一个子分区使用]
C[宽依赖] --> D[每个父RDD分区被多个子分区使用]
rdd.map(x => (x._1 + Random.nextInt(10), x._2))
spark.default.parallelism=2000
spark.executor.memory=4G
spark.memory.fraction=0.6 # 用于执行和存储的内存比例
spark.memory.storageFraction=0.5 # 存储内存占比
reduceByKey
替代groupByKey
spark.sql.shuffle.partitions=200
spark.shuffle.manager=sort
# 当小表join大表时使用
broadcast_var = sc.broadcast(small_table)
large_table.rdd.map(lambda x: (x, broadcast_var.value[x.key]))
val spark = SparkSession.builder()
.appName("Hive Integration")
.config("spark.sql.warehouse.dir", "/user/hive/warehouse")
.enableHiveSupport()
.getOrCreate()
spark.sql("""
SELECT department, AVG(salary)
FROM employees
GROUP BY department
""").show()
# 每5秒处理一个批次
ssc = StreamingContext(sc, 5)
lines = ssc.socketTextStream("localhost", 9999)
words = lines.flatMap(lambda line: line.split(" "))
ssc.checkpoint("hdfs://checkpoint_path")
spark.network.timeout=300s
)executor-memory
persist(StorageLevel.DISK_ONLY)
-- 优化方案:
-- 1. 使用Parquet列式存储
-- 2. 分区字段按日期划分
-- 3. 启用谓词下推
spark.sql("SET spark.sql.parquet.filterPushdown=true")
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/)共同学习。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。