大数据常见面试问题汇总

一、大数据基础理论类问题

1. Hadoop生态核心组件及工作原理

Hadoop作为大数据基石,面试中常被问及HDFS、MapReduce、YARN三大核心组件。HDFS采用主从架构,NameNode负责元数据管理,DataNode存储实际数据块,通过副本机制(默认3份)保障容错性。MapReduce编程模型将计算拆分为Map阶段(并行处理)和Reduce阶段(聚合结果),典型案例如单词统计:

  1. // Map阶段示例
  2. public class WordCountMapper extends Mapper<LongWritable, Text, Text, IntWritable> {
  3. private final static IntWritable one = new IntWritable(1);
  4. private Text word = new Text();
  5. @Override
  6. public void map(LongWritable key, Text value, Context context)
  7. throws IOException, InterruptedException {
  8. String[] words = value.toString().split("\\s+");
  9. for (String w : words) {
  10. word.set(w);
  11. context.write(word, one);
  12. }
  13. }
  14. }

YARN资源管理通过ResourceManager全局调度,NodeManager节点级监控,实现计算资源动态分配。需注意第二代MapReduce(MRv2)将资源管理从JobTracker分离,解决单点瓶颈问题。

2. 数据仓库与数据湖的区别

数据仓库(如Hive)采用结构化Schema设计,面向OLAP分析场景,通过ETL过程清洗数据后存储。数据湖(如Hudi、Iceberg)支持半结构化/非结构化数据,采用Schema-on-Read模式,保留原始数据灵活性。典型对比维度:
| 特性 | 数据仓库 | 数据湖 |
|——————-|————————————|————————————|
| 数据类型 | 结构化为主 | 多类型兼容 |
| 存储成本 | 较高(预处理) | 较低(原始存储) |
| 分析时效 | 延迟较高(需建模) | 实时性强(支持流式) |
| 适用场景 | 固定报表、BI分析 | 机器学习、探索式分析 |

二、分布式计算与存储优化

1. Spark性能调优策略

Spark调优需从内存管理、并行度、序列化三方面入手。内存配置建议:

  • spark.executor.memory:设置executor总内存(建议占容器80%)
  • spark.memory.fraction:调整存储与执行内存比例(默认0.6)
  • spark.memory.storageFraction:预留存储内存比例(默认0.5)

并行度优化公式:总核心数 = 数据分区数 * 任务并行度,可通过repartition()coalesce()调整分区数。序列化方面,Kryo序列化比Java原生序列化快10倍,需注册类白名单:

  1. val conf = new SparkConf()
  2. .set("spark.serializer", "org.apache.spark.serializer.KryoSerializer")
  3. .registerKryoClasses(Array(classOf[MyCustomClass]))

2. HBase RowKey设计原则

HBase性能高度依赖RowKey设计,需遵循三大原则:

  1. 唯一性:避免重复导致数据覆盖
  2. 散列性:通过哈希前缀(如MD5)打散热点
  3. 可读性:业务字段组合(如时间倒序+设备ID)

示例设计:订单表按时间倒序+用户ID组合RowKey

  1. RowKey = Reverse(Timestamp) + "_" + UserID
  2. // 20230101120000_1001 → 000021100132023_1001

三、实时计算与流处理

1. Flink状态管理与检查点机制

Flink通过状态后端(Memory/Fs/RocksDB)管理算子状态,检查点(Checkpoint)实现容错。关键配置项:

  • state.backend:选择状态后端类型
  • execution.checkpointing.interval:设置检查点间隔(如5min)
  • execution.checkpointing.mode:精确一次(EXACTLY_ONCE)或至少一次(AT_LEAST_ONCE)

端到端精确一次需配合事务性写入(如Kafka+HBase):

  1. KafkaSource<String> source = KafkaSource.<String>builder()
  2. .setBootstrapServers("kafka:9092")
  3. .setTopics("input-topic")
  4. .setDeserializer(new SimpleStringSchema())
  5. .build();
  6. HBaseSink<String> sink = HBaseSink.<String>builder()
  7. .setTableName("output-table")
  8. .setRowKeyBuilder(new StringRowKeyBuilder())
  9. .setSerializer(new StringHBaseSerializer())
  10. .build();
  11. env.fromSource(source, WatermarkStrategy.noWatermarks(), "Kafka Source")
  12. .sinkTo(sink);

2. Kafka消费者组偏移量管理

消费者组偏移量提交有三种模式:

  1. 自动提交(enable.auto.commit=true):定期提交,可能丢失消息
  2. 同步提交(commitSync()):确保提交成功,影响吞吐量
  3. 异步提交(commitAsync()):高吞吐但无重试机制

最佳实践:混合使用异步+同步提交,事务性场景采用commitSync(offsets, groupMetadata)

四、项目经验与场景设计

1. 用户画像系统架构设计

典型架构分为四层:

  1. 数据采集层:埋点日志(Flume)+ 业务数据库(Canal)
  2. 存储计算层:HDFS存储原始数据,Spark计算标签
  3. 服务应用层:HBase存储画像数据,Redis缓存热数据
  4. 应用接口层:REST API提供查询服务

关键优化点:

  • 标签分群采用BitMap减少存储空间
  • 实时更新通过Flink CDC监听数据库变更
  • 并发控制使用HBase的Cell级别锁

2. 日志分析系统性能瓶颈排查

排查流程建议:

  1. 监控指标:检查CPU、内存、磁盘I/O使用率
  2. 日志分析:通过Ganglia/Prometheus查看服务指标
  3. 代码审查:检查是否存在数据倾斜(如groupByKey导致)
  4. 资源调整:增加Executor内存或调整并行度

典型案例:某系统出现长时间GC停顿,通过jstat -gcutil <pid>发现老年代占用90%,解决方案为增加堆外内存并优化序列化方式。

五、进阶问题与解决方案

1. 大数据安全合规实践

需满足GDPR等法规要求,实施措施包括:

  • 数据脱敏:姓名、手机号等字段加密(如AES-128)
  • 访问控制:基于Ranger的细粒度权限管理
  • 审计日志:记录所有数据访问操作
  • 数据加密:HDFS透明加密(Hadoop 3.0+)

2. 跨集群数据同步方案

常见方案对比:
| 方案 | 适用场景 | 延迟 | 吞吐量 |
|——————-|———————————————|——————|——————|
| DistCp | 批量迁移(HDFS→HDFS) | 分钟级 | 高 |
| Sqoop | 关系型数据库导入 | 秒级 | 中等 |
| Flume NG | 日志流式同步 | 毫秒级 | 低 |
| DataX | 异构数据源同步 | 秒级 | 高 |

混合架构示例:通过Kafka连接不同数据中心,Flink作业消费并写入目标集群。

六、面试准备建议

  1. 技术深度:重点准备HDFS读写流程、Spark内存模型等核心原理
  2. 项目细节:量化成果(如”优化后查询耗时从5min降至20s”)
  3. 场景模拟:练习设计实时推荐系统、离线报表等典型场景
  4. 工具实操:熟悉Linux命令(如topiostat)、SQL优化技巧

建议备考资料:《Hadoop权威指南》《Spark内核设计的艺术》、LeetCode大数据专题题库。通过系统化准备,可显著提升面试通过率。