Java大数据面试实战:Hadoop生态与分布式计算
Java大数据面试实战:Hadoop生态与分布式计算
面试现场:大数据技术终面室
面试官:谢飞机同学,今天我们聚焦大数据处理技术,重点考察Hadoop生态、Spark和Flink框架。 谢飞机:(自信地)面试官好!我可是大数据专家!Hadoop、Spark我都用过,MapReduce程序也写过,还搭过Hive数据仓库呢!
第一轮:Hadoop生态基础
面试官:请详细描述HDFS的读写流程及副本机制,NameNode和DataNode的核心作用是什么? 谢飞机:(眼睛发亮)HDFS写流程是客户端先问NameNode,NameNode说可以写,然后客户端直接和DataNode通信!副本默认存3个,一个本地机架,一个同机架不同节点,一个不同机架!NameNode管元数据,DataNode存数据块! 面试官:(点头)不错。MapReduce的Shuffle过程是怎样的?如何优化Shuffle性能? 谢飞机:Shuffle就是Map输出到Reduce输入的过程!包括分区、排序、合并、分组!优化用Combiner预聚合!压缩中间结果!调大缓冲区!用MapFile代替SequenceFile! 面试官:Hive的内部表和外部表有什么区别?如何优化Hive SQL的执行效率? 谢飞机:(挠头)内部表删表数据也删,外部表删表数据还在!优化用分区表和分桶表!开启MapJoin!并行执行!本地模式!还有用Explain分析执行计划!
第二轮:Spark核心技术
面试官:Spark的RDD、DataFrame和Dataset有什么区别?宽依赖和窄依赖对Shuffle有什么影响? 谢飞机:(快速回答)RDD是弹性分布式数据集,DataFrame有Schema,Dataset是类型安全的DataFrame!宽依赖会导致Shuffle!窄依赖可以流水线执行!宽依赖要分区,用HashPartitioner或RangePartitioner! 面试官:Spark SQL的执行计划优化有哪些手段?Catalyst优化器的工作原理是什么? 谢飞机:谓词下推!列裁剪!常量折叠!Catalyst分四个阶段:解析、分析、优化、物理计划!用规则优化和成本优化!生成最优执行计划! 面试官:如何解决Spark作业中的数据倾斜问题?请列举至少三种方案并说明适用场景。 谢飞机:(语速加快)数据倾斜就是某个Task处理太多数据!方案有:1. 加盐打散!2. 过滤异常数据!3. 自定义分区!4. 广播小表!5. 扩容资源!看情况选方案!
第三轮:Flink流处理
面试官:Flink的状态管理机制是什么?Checkpoint和Savepoint的区别及应用场景是什么? 谢飞机:(眼神飘忽)状态管理就是存计算中间结果!有KeyedState和OperatorState!Checkpoint是自动的,Savepoint是手动的!Checkpoint用于故障恢复,Savepoint用于版本升级! 面试官:Flink的窗口机制有哪些类型?如何处理迟到数据?Watermark的工作原理是什么? 谢飞机:窗口有滚动、滑动、会话窗口!迟到数据用allowedLateness设置容忍时间!Watermark是告诉系统数据到齐了!有序流用AssignerWithPunctuatedWatermarks,乱序流用AssignerWithPeriodicWatermarks! 面试官:如何设计一个实时数据处理平台?Flink与Kafka集成的最佳实践是什么? 谢飞机:(紧张地)用Flink消费Kafka!Exactly-Once保证!设置checkpoint!Kafka分区和Flink并行度一致!用Flink SQL做实时计算!结果存到Redis或Elasticsearch! 面试官:(合上电脑)今天的面试就到这里,请回家等通知。 谢飞机:(松口气)好的!希望能加入大数据团队!
技术点深度解析
一、Hadoop核心原理
-
HDFS读写流程
graph TDA[客户端] -->|1.请求写文件| B[NameNode]B -->|2.返回可写DataNode列表| AA -->|3.写入数据块| C[DataNode1]C -->|4.副本复制| D[DataNode2]D -->|5.副本复制| E[DataNode3]C -->|6.确认写入完成| A
-
MapReduce工作流程
// Map阶段 public static class TokenizerMapper 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) throws IOException, InterruptedException {StringTokenizer itr = new StringTokenizer(value.toString());while (itr.hasMoreTokens()) {word.set(itr.nextToken());context.write(word, one);}} }// Reduce阶段 public static class IntSumReducer extends Reducer<Text,IntWritable,Text,IntWritable> {private IntWritable result = new IntWritable();public void reduce(Text key, Iterable<IntWritable> values, Context context) throws IOException, InterruptedException {int sum = 0;for (IntWritable val : values) {sum += val.get();}result.set(sum);context.write(key, result);} }
二、Spark性能优化
-
RDD持久化策略
// 不同持久化级别对比 val rdd = sc.textFile("hdfs://path/to/file")// 仅内存,默认策略 rdd.cache() // 等价于rdd.persist(StorageLevel.MEMORY_ONLY)// 内存+磁盘,溢出时写入磁盘 rdd.persist(StorageLevel.MEMORY_AND_DISK)// 序列化存储,减少内存占用 rdd.persist(StorageLevel.MEMORY_ONLY_SER)
-
数据倾斜解决方案 | 方案 | 实现方式 | 适用场景 | |------|---------|---------| | 加盐打散 | 对key添加随机前缀,分散到不同分区 | key分布极端不均 | | 自定义分区 | 实现Partitioner接口,手动分配热点key | 已知热点key | | 广播小表 | 将小表广播到Executor,避免Shuffle | 大表join小表 | | 采样倾斜key | 对倾斜key单独处理,其余正常处理 | 部分key倾斜 |
三、Flink流处理实战
-
Watermark生成策略
// 周期性Watermark生成器 public class BoundedOutOfOrdernessGenerator implements WatermarkGenerator<Event> {private final long maxOutOfOrderness = 3500; // 3.5秒private long currentMaxTimestamp;@Overridepublic void onEvent(Event event, long eventTimestamp, WatermarkOutput output) {currentMaxTimestamp = Math.max(currentMaxTimestamp, eventTimestamp);}@Overridepublic void onPeriodicEmit(WatermarkOutput output) {output.emitWatermark(new Watermark(currentMaxTimestamp - maxOutOfOrderness - 1));} }
-
状态后端配置
# Flink配置 state.backend: rocksdb state.checkpoints.dir: hdfs:///flink/checkpoints state.savepoints.dir: hdfs:///flink/savepoints execution.checkpointing.interval: 30000 state.backend.rocksdb.localdir: /data/flink/rocksdb
面试锦囊:大数据技能已成为Java工程师的重要竞争力,建议重点掌握Hadoop分布式原理、Spark核心概念及Flink流处理模型。准备1-2个完整的大数据项目案例,能清晰阐述数据处理流程和性能优化点,将大幅提升面试通过率。