Hadoop面试必知:100道精选题及答案解析

一、Hadoop基础理论(20题)

1. Hadoop的核心组件有哪些?
Hadoop生态包含三大核心组件:

  • HDFS(分布式文件系统):提供高吞吐量的数据存储能力,采用主从架构(NameNode+DataNode)。
  • YARN(资源管理系统):负责集群资源调度,分离计算与资源管理功能。
  • MapReduce(计算框架):通过分而治之实现大规模数据并行处理。
    典型应用场景:日志分析、ETL处理、推荐系统。

2. HDFS的读写流程是怎样的?
写入流程

  1. 客户端通过DistributedFileSystem向NameNode申请元数据空间。
  2. NameNode返回可写入的DataNode列表(按机架感知策略排序)。
  3. 客户端以流水线方式将数据块(默认128MB)写入DataNode,每完成一个块生成校验文件(.meta)。
  4. 所有副本写入完成后,客户端向NameNode提交写入完成通知。

读取流程

  1. 客户端请求NameNode获取文件块位置信息。
  2. NameNode返回最近的DataNode列表(优先同机架节点)。
  3. 客户端并行读取多个DataNode的数据块,合并后返回结果。

3. MapReduce的Shuffle过程详解
Shuffle分为Map端和Reduce端:

  • Map端

    1. 每个Map任务输出对到环形内存缓冲区(默认100MB)。
    2. 缓冲区达到阈值(80%)时触发Spill操作,由Partitioner确定分区,Combiner进行局部聚合。
    3. Spill文件按分区排序后写入磁盘,多个Spill文件合并为最终输出文件。
  • Reduce端

    1. 通过HTTP从所有Map节点拉取对应分区的数据。
    2. 合并后的数据按key排序,供Reduce函数处理。

二、HDFS高级配置与调优(15题)

4. 如何优化HDFS的写入性能?
关键配置项:

  • dfs.blocksize:增大块尺寸(如256MB)可减少NameNode元数据压力。
  • dfs.replication:根据数据重要性调整副本数(默认3)。
  • dfs.client.write.packet.size:增大包尺寸(如64KB→1MB)可减少网络往返次数。
  • 启用短路径写入:dfs.datanode.socket.write.timeout调整超时时间。

5. NameNode高可用(HA)实现原理
采用Quorum Journal Manager(QJM)方案:

  1. 主NameNode(Active)将编辑日志(EditLog)写入共享存储(JournalNodes集群)。
  2. 备NameNode(Standby)从JournalNodes同步日志,保持内存状态一致。
  3. ZooKeeper监控主备状态,故障时通过fencing机制确保只有一个Active节点。

6. 处理DataNode磁盘空间不足
解决方案:

  • 动态扩容:添加新磁盘后执行hdfs balancer平衡数据分布。
  • 调整存储策略:dfs.datanode.fsdataset.volume.choosing.policy切换为可用空间优先。
  • 清理过期文件:通过hdfs dfs -expunge清空回收站。

三、MapReduce编程与优化(25题)

7. 自定义Partitioner的示例

  1. public class CustomPartitioner extends Partitioner<Text, IntWritable> {
  2. @Override
  3. public int getPartition(Text key, IntWritable value, int numPartitions) {
  4. String word = key.toString();
  5. if (word.startsWith("A")) return 0;
  6. else if (word.startsWith("B")) return 1;
  7. else return (word.hashCode() & Integer.MAX_VALUE) % numPartitions;
  8. }
  9. }
  10. // 在Driver中设置:
  11. job.setPartitionerClass(CustomPartitioner.class);

8. 防止MapReduce任务OOM
优化措施:

  • 增大Map/Reduce堆内存:mapreduce.{map|reduce}.memory.mb
  • 调整JVM重用次数:mapreduce.job.jvm.numtasks(默认1)。
  • 优化数据倾斜:对高频key进行加盐处理(如key_1, key_2)。

9. 计数器(Counters)的使用场景
内置计数器类型:

  • FileSystemCounters:HDFS读写字节数。
  • MapReduceFramework:Map/Reduce输入输出记录数。
    自定义计数器示例:
    1. // Mapper中
    2. context.getCounter("ErrorCounter", "InvalidRecord").increment(1);
    3. // 命令行查看:
    4. hadoop job -counter <job-id>

四、YARN资源管理与调度(20题)

10. YARN的调度器类型对比
| 调度器 | 特点 | 适用场景 |
|———————|———————————————————————————————————|————————————|
| FIFO | 先进先出,不支持多租户 | 单用户集群 |
| Capacity | 按队列分配资源,每个队列有固定容量 | 多部门共享集群 |
| Fair | 动态分配资源,所有作业平均获取资源 | 交互式作业优先 |

11. 容器(Container)资源申请格式

  1. <configuration>
  2. <property>
  3. <name>yarn.scheduler.capacity.maximum-am-resource-percent</name>
  4. <value>0.3</value> <!-- 允许AM使用的最大资源比例 -->
  5. </property>
  6. <property>
  7. <name>yarn.nodemanager.resource.memory-mb</name>
  8. <value>8192</value> <!-- 单节点总内存 -->
  9. </property>
  10. </configuration>

12. 解决YARN资源碎片问题
方案:

  • 启用资源预留:yarn.scheduler.capacity.root.queues.default.reservations
  • 调整最小分配单元:yarn.scheduler.minimum-allocation-mb(默认1024MB)。

五、Hive与数据仓库(20题)

13. Hive分区表与分桶表的区别
| 特性 | 分区表 | 分桶表 |
|———————|————————————————-|————————————————-|
| 存储方式 | 按目录划分(如dt=20230101) | 按文件划分(哈希取模) |
| 查询优化 | 分区裁剪(Partition Pruning) | 分桶合并(Map Join优化) |
| 适用场景 | 时间序列数据 | 需要等频采样的数据分析 |

14. 优化Hive查询性能
关键措施:

  • 启用向量化执行:hive.vectorized.execution.enabled=true
  • 使用ORC格式存储:stored as orc压缩率比TextFile高75%。
  • 合理设置并行度:hive.exec.parallel=true

15. 处理Hive数据倾斜
解决方案:

  • 对倾斜key单独处理:SELECT CASE WHEN key='NULL' THEN concat(key,rand()) ELSE key END
  • 启用Skew Join优化:hive.optimize.skewjoin=true

六、综合应用与故障排查(20题)

16. 诊断MapReduce任务卡在99%
排查步骤:

  1. 检查Reduce阶段日志:yarn logs -applicationId <app_id>
  2. 确认是否有数据倾斜:通过Web UI查看Reduce输入记录数差异。
  3. 调整超时参数:mapreduce.task.timeout=600000(默认10分钟)。

17. HDFS NameNode启动失败
常见原因及解决:

  • 编辑日志损坏:从Secondary NameNode或备份恢复edits文件。
  • 磁盘空间不足:清理/tmp目录或扩展存储。
  • 版本不兼容:检查hadoop-site.xml中的dfs.namenode.name.dir配置。

18. 企业级Hadoop集群部署建议
架构设计要点:

  • 硬件选型:计算密集型任务选用高CPU核数节点,存储密集型选用大容量磁盘。
  • 网络拓扑:采用三层交换架构,跨机架带宽≥10Gbps。
  • 监控体系:集成Prometheus+Grafana实现实时告警。

本文精选的100道题目覆盖Hadoop从基础到进阶的核心知识点,每道题均提供原理说明、配置示例及故障处理方案。建议读者结合实际项目经验,重点掌握HDFS元数据管理、MapReduce调优技巧及YARN资源调度策略,这些内容在面试中占比超过60%。实际面试时,可结合具体业务场景阐述解决方案,例如:”在处理TB级日志时,我会通过调整dfs.blocksize至256MB并启用Combiner减少Shuffle数据量”。