大数据常见面试问题汇总

一、技术基础类问题

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对比)

  1. // MapReduce实现(Java)
  2. public class WordCountMapper extends Mapper<Object, Text, Text, IntWritable> {
  3. private final static IntWritable one = new IntWritable(1);
  4. private Text word = new Text();
  5. public void map(Object key, Text value, Context context) {
  6. String[] words = value.toString().split(" ");
  7. for (String w : words) {
  8. word.set(w);
  9. context.write(word, one);
  10. }
  11. }
  12. }
  13. // Spark实现(Scala)
  14. val lines = sc.textFile("input.txt")
  15. val words = lines.flatMap(_.split(" "))
  16. val wordCounts = words.map(x => (x, 1)).reduceByKey(_ + _)
  17. wordCounts.saveAsTextFile("output")

二、项目经验类问题

1. 数据倾斜解决方案

数据倾斜指部分Key的数据量远超其他Key,导致任务执行时间过长。常见原因包括Join操作中某Key关联数据过多、Group By时某Key分组过大。

解决方案

  • 两阶段聚合:先对倾斜Key进行局部聚合(如加随机前缀),再全局聚合;
  • Salting技术:为倾斜Key添加随机后缀,分散到多个Reducer;
  • 广播Join:将小表广播到所有节点,避免大表Join倾斜;
  • 调整并行度:通过set num.executorsset executor.cores增加任务槽位。

案例:在用户行为分析项目中,发现某用户ID的点击日志占总量80%,通过Salting技术将该ID拆分为user123_1user123_2等,最终任务耗时从2小时降至20分钟。

2. 实时计算框架选型

实时计算需考虑延迟、吞吐量、一致性等指标。常见框架包括Storm(低延迟,但无状态管理)、Flink(支持有状态计算和Exactly-Once语义)、Spark Streaming(微批处理,延迟较高)。

选型建议

  • 低延迟需求(如金融风控):选Flink或Storm;
  • 高吞吐需求(如日志分析):选Spark Streaming或Flink;
  • 复杂状态管理(如会话分析):选Flink(支持Window和ProcessFunction)。

代码示例(Flink窗口统计)

  1. DataStream<Event> events = env.addSource(new KafkaSource<>());
  2. events.keyBy(Event::getUserId)
  3. .window(TumblingEventTimeWindows.of(Time.minutes(5)))
  4. .aggregate(new CountAggregate())
  5. .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.memoryspark.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技术曲线)。面试前可针对目标公司业务(如电商推荐系统、金融风控)准备定制化案例。