一、技术基础类问题
1. Hadoop生态核心组件及作用
Hadoop作为大数据存储与计算框架的基石,其核心组件包括HDFS(分布式文件系统)、YARN(资源管理系统)和MapReduce(计算模型)。HDFS通过主从架构实现高容错性,NameNode负责元数据管理,DataNode存储实际数据块;YARN通过ResourceManager和NodeManager实现资源动态分配,支持多计算框架共存;MapReduce则通过Map阶段分散处理、Reduce阶段聚合结果的模式,解决大规模数据并行计算问题。
面试延伸问题:
- HDFS读写流程:客户端通过DistributedFileSystem向NameNode请求文件块位置,直接与DataNode建立数据流管道(Pipeline)传输,写操作采用流水线复制(默认3副本);
- YARN调度策略:FIFO(先进先出)、Capacity Scheduler(容量调度,支持多队列资源隔离)、Fair Scheduler(公平调度,动态分配资源)。
建议:结合实际场景描述组件协作,例如“在日志分析项目中,HDFS存储原始日志,MapReduce清洗数据,YARN动态分配集群资源”。
2. Spark与Hadoop MapReduce对比
Spark通过内存计算和DAG(有向无环图)执行引擎,避免了MapReduce的磁盘I/O开销,适用于迭代计算(如机器学习)和交互式查询(如Spark SQL)。其核心抽象RDD(弹性分布式数据集)支持容错和并行操作,而MapReduce的中间结果需落盘,延迟较高。
关键差异点:
- 执行模型:Spark基于内存迭代,MapReduce基于磁盘阶段划分;
- 适用场景:Spark适合低延迟场景,MapReduce适合批量处理;
- 生态扩展:Spark集成Streaming(实时流)、MLlib(机器学习)、GraphX(图计算),功能更丰富。
代码示例(WordCount对比):
// MapReduce实现(Java)public class WordCountMapper extends Mapper<Object, Text, Text, IntWritable> {private final static IntWritable one = new IntWritable(1);private Text word = new Text();public void map(Object key, Text value, Context context) {String[] words = value.toString().split(" ");for (String w : words) {word.set(w);context.write(word, one);}}}// Spark实现(Scala)val lines = sc.textFile("input.txt")val words = lines.flatMap(_.split(" "))val wordCounts = words.map(x => (x, 1)).reduceByKey(_ + _)wordCounts.saveAsTextFile("output")
二、项目经验类问题
1. 数据倾斜解决方案
数据倾斜指部分Key的数据量远超其他Key,导致任务执行时间过长。常见原因包括Join操作中某Key关联数据过多、Group By时某Key分组过大。
解决方案:
- 两阶段聚合:先对倾斜Key进行局部聚合(如加随机前缀),再全局聚合;
- Salting技术:为倾斜Key添加随机后缀,分散到多个Reducer;
- 广播Join:将小表广播到所有节点,避免大表Join倾斜;
- 调整并行度:通过
set num.executors和set executor.cores增加任务槽位。
案例:在用户行为分析项目中,发现某用户ID的点击日志占总量80%,通过Salting技术将该ID拆分为user123_1、user123_2等,最终任务耗时从2小时降至20分钟。
2. 实时计算框架选型
实时计算需考虑延迟、吞吐量、一致性等指标。常见框架包括Storm(低延迟,但无状态管理)、Flink(支持有状态计算和Exactly-Once语义)、Spark Streaming(微批处理,延迟较高)。
选型建议:
- 低延迟需求(如金融风控):选Flink或Storm;
- 高吞吐需求(如日志分析):选Spark Streaming或Flink;
- 复杂状态管理(如会话分析):选Flink(支持Window和ProcessFunction)。
代码示例(Flink窗口统计):
DataStream<Event> events = env.addSource(new KafkaSource<>());events.keyBy(Event::getUserId).window(TumblingEventTimeWindows.of(Time.minutes(5))).aggregate(new CountAggregate()).print();
三、性能优化类问题
1. HDFS读写优化
- 小文件合并:使用Hadoop Archive(HAR)或CombineFileInputFormat减少NameNode内存压力;
- 块大小调整:默认128MB,大文件可增至256MB以减少寻址时间;
- 副本数配置:根据数据重要性设置
dfs.replication(默认3),冷数据可降至2。
监控工具:通过HDFS Web UI查看DataNode存储利用率,使用hdfs fsck检查文件完整性。
2. Spark内存管理
Spark执行内存(Execution Memory)和存储内存(Storage Memory)通过统一内存管理(Unified Memory Management)动态分配。参数spark.memory.fraction(默认0.6)控制执行内存占比,spark.memory.storageFraction(默认0.5)控制存储内存优先级。
调优建议:
- 增加
spark.executor.memory和spark.driver.memory; - 启用动态分配:
spark.dynamicAllocation.enabled=true; - 使用Kryo序列化:
spark.serializer=org.apache.spark.serializer.KryoSerializer。
四、职业发展类问题
1. 技术趋势与学习路径
- 趋势:湖仓一体(如Delta Lake)、AI与大数据融合(如TensorFlow on Spark)、隐私计算(如联邦学习);
- 学习建议:
- 基础层:深入Hadoop/Spark源码,掌握分布式原理;
- 应用层:学习Flink实时处理、Kafka流式架构;
- 拓展层:了解云原生大数据(如Kubernetes调度)、Serverless计算。
2. 软技能考察点
- 沟通能力:能否用非技术语言解释技术方案(如“数据倾斜如何影响业务”);
- 问题解决能力:描述处理过的复杂故障(如集群节点频繁宕机);
- 团队协作:分享在跨部门项目中的角色与贡献。
总结:大数据面试需兼顾技术深度与实战经验,建议通过开源项目(如Apache Beam)积累代码能力,同时关注行业动态(如Gartner技术曲线)。面试前可针对目标公司业务(如电商推荐系统、金融风控)准备定制化案例。