一、大数据基础理论类问题
1. Hadoop生态核心组件及工作原理
Hadoop作为大数据基石,面试中常被问及HDFS、MapReduce、YARN三大核心组件。HDFS采用主从架构,NameNode负责元数据管理,DataNode存储实际数据块,通过副本机制(默认3份)保障容错性。MapReduce编程模型将计算拆分为Map阶段(并行处理)和Reduce阶段(聚合结果),典型案例如单词统计:
// Map阶段示例public class WordCountMapper extends Mapper<LongWritable, Text, Text, IntWritable> {private final static IntWritable one = new IntWritable(1);private Text word = new Text();@Overridepublic void map(LongWritable key, Text value, Context context)throws IOException, InterruptedException {String[] words = value.toString().split("\\s+");for (String w : words) {word.set(w);context.write(word, one);}}}
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倍,需注册类白名单:
val conf = new SparkConf().set("spark.serializer", "org.apache.spark.serializer.KryoSerializer").registerKryoClasses(Array(classOf[MyCustomClass]))
2. HBase RowKey设计原则
HBase性能高度依赖RowKey设计,需遵循三大原则:
- 唯一性:避免重复导致数据覆盖
- 散列性:通过哈希前缀(如MD5)打散热点
- 可读性:业务字段组合(如时间倒序+设备ID)
示例设计:订单表按时间倒序+用户ID组合RowKey
RowKey = Reverse(Timestamp) + "_" + UserID// 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):
KafkaSource<String> source = KafkaSource.<String>builder().setBootstrapServers("kafka:9092").setTopics("input-topic").setDeserializer(new SimpleStringSchema()).build();HBaseSink<String> sink = HBaseSink.<String>builder().setTableName("output-table").setRowKeyBuilder(new StringRowKeyBuilder()).setSerializer(new StringHBaseSerializer()).build();env.fromSource(source, WatermarkStrategy.noWatermarks(), "Kafka Source").sinkTo(sink);
2. Kafka消费者组偏移量管理
消费者组偏移量提交有三种模式:
- 自动提交(enable.auto.commit=true):定期提交,可能丢失消息
- 同步提交(commitSync()):确保提交成功,影响吞吐量
- 异步提交(commitAsync()):高吞吐但无重试机制
最佳实践:混合使用异步+同步提交,事务性场景采用commitSync(offsets, groupMetadata)。
四、项目经验与场景设计
1. 用户画像系统架构设计
典型架构分为四层:
- 数据采集层:埋点日志(Flume)+ 业务数据库(Canal)
- 存储计算层:HDFS存储原始数据,Spark计算标签
- 服务应用层:HBase存储画像数据,Redis缓存热数据
- 应用接口层:REST API提供查询服务
关键优化点:
- 标签分群采用BitMap减少存储空间
- 实时更新通过Flink CDC监听数据库变更
- 并发控制使用HBase的Cell级别锁
2. 日志分析系统性能瓶颈排查
排查流程建议:
- 监控指标:检查CPU、内存、磁盘I/O使用率
- 日志分析:通过Ganglia/Prometheus查看服务指标
- 代码审查:检查是否存在数据倾斜(如
groupByKey导致) - 资源调整:增加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作业消费并写入目标集群。
六、面试准备建议
- 技术深度:重点准备HDFS读写流程、Spark内存模型等核心原理
- 项目细节:量化成果(如”优化后查询耗时从5min降至20s”)
- 场景模拟:练习设计实时推荐系统、离线报表等典型场景
- 工具实操:熟悉Linux命令(如
top、iostat)、SQL优化技巧
建议备考资料:《Hadoop权威指南》《Spark内核设计的艺术》、LeetCode大数据专题题库。通过系统化准备,可显著提升面试通过率。