Hadoop面试100道精选题解:助你通关技术面试

Hadoop面试100道收集(带答案)

一、基础概念与架构(20题)

1. Hadoop的核心组件有哪些?

Hadoop生态由三大核心模块构成:HDFS(分布式文件系统)YARN(资源管理系统)MapReduce(计算框架)。HDFS负责数据存储,采用主从架构(NameNode+DataNode);YARN管理集群资源,通过ResourceManager和NodeManager实现;MapReduce提供分布式计算能力,分为Map和Reduce两个阶段。

2. HDFS读写流程详解

写入流程

  1. 客户端通过DistributedFileSystem创建文件,NameNode返回可用的DataNode列表。
  2. 数据按128MB分块(默认),通过DFSOutputStream写入第一个DataNode,并由其转发至后续节点(默认3副本)。
  3. 写入完成后,DataNode向NameNode汇报块位置信息。

读取流程

  1. 客户端向NameNode请求文件元数据,获取块列表及对应DataNode地址。
  2. 按就近原则(网络拓扑)选择DataNode读取数据块。
  3. 合并所有块数据后返回给客户端。

3. YARN资源调度策略

YARN支持三种调度器:

  • FIFO Scheduler:先进先出,适合单用户集群。
  • Capacity Scheduler:多队列划分资源,支持层级队列和优先级。
  • Fair Scheduler:动态分配资源,保证所有应用公平获得资源。

配置示例

  1. <property>
  2. <name>yarn.scheduler.capacity.root.queues</name>
  3. <value>default,dev</value>
  4. </property>

二、核心组件与原理(30题)

4. MapReduce的Shuffle过程

Shuffle是Map到Reduce的数据重分配阶段,包含四个步骤:

  1. Map端:输出键值对写入环形内存缓冲区(默认100MB),溢出到磁盘时按Partitioner分区,并排序、合并。
  2. Reduce端:通过HTTP从所有Map节点拉取属于自己分区的数据,合并后排序,输入给Reduce函数。

优化点

  • 调整io.sort.mb增大缓冲区。
  • 使用Combiner减少数据传输量。

5. HDFS高可用(HA)实现

HA通过QJM(Quorum Journal Manager)NFS共享存储实现NameNode元数据同步:

  • Active-Standby架构:Active NameNode处理请求,Standby通过JournalNode同步编辑日志(EditLog)。
  • 自动故障转移:ZooKeeper监控NameNode状态,触发fence机制(如sshfence)防止脑裂。

配置关键参数

  1. <property>
  2. <name>dfs.ha.namenodes.ns1</name>
  3. <value>nn1,nn2</value>
  4. </property>
  5. <property>
  6. <name>dfs.namenode.shared.edits.dir</name>
  7. <value>qjournal://node1:8485;node2:8485;node3:8485/ns1</value>
  8. </property>

6. YARN内存管理机制

YARN将内存分为堆内存(Heap Memory)堆外内存(Off-Heap Memory)

  • mapreduce.map.memory.mb:Map任务总内存(含堆外)。
  • mapreduce.map.java.opts:Map任务JVM堆内存(需小于总内存)。
  • yarn.nodemanager.resource.memory-mb:NodeManager管理总内存。

示例配置

  1. <property>
  2. <name>yarn.nodemanager.resource.memory-mb</name>
  3. <value>8192</value>
  4. </property>
  5. <property>
  6. <name>mapreduce.map.memory.mb</name>
  7. <value>2048</value>
  8. </property>
  9. <property>
  10. <name>mapreduce.map.java.opts</name>
  11. <value>-Xmx1800m</value>
  12. </property>

三、性能调优与故障排查(30题)

7. HDFS小文件问题解决方案

小文件(<128MB)会导致NameNode内存压力和读取效率低下,优化方法包括:

  • 合并文件:使用hadoop archive -archiveName files.har -p /input /output生成HAR文件。
  • SequenceFile:将小文件序列化为键值对存储。
  • CombineFileInputFormat:在MapReduce中合并输入分片。

8. MapReduce倾斜数据处理

数据倾斜会导致部分Reduce任务耗时过长,解决方案:

  • 二次排序:自定义PartitionerGroupingComparator
  • 加盐处理:在键后添加随机前缀(如key_1~key_10),分散数据。
  • Skew Join:对倾斜键单独处理,例如:
    1. // 示例:加盐处理
    2. public class SaltedPartitioner extends Partitioner<Text, IntWritable> {
    3. @Override
    4. public int getPartition(Text key, IntWritable value, int numPartitions) {
    5. String saltedKey = key.toString() + "_" + (Math.abs(key.hashCode()) % 10);
    6. return (saltedKey.hashCode() & Integer.MAX_VALUE) % numPartitions;
    7. }
    8. }

9. YARN资源利用率优化

提升资源利用率的关键参数:

  • yarn.scheduler.capacity.maximum-am-resource-percent:控制AM占用资源上限(默认0.1)。
  • yarn.nodemanager.vmem-check-enabled:禁用虚拟内存检查(避免因内存换页导致任务失败)。
  • 动态资源分配:启用yarn.resourcemanager.scheduler.monitor.enable=true

四、高级特性与生态扩展(20题)

10. HDFS Federation设计

Federation通过多个NameSpace(Namespace)解决单NameNode的扩展性问题:

  • 多NameNode:每个NameNode管理独立命名空间和块池(Block Pool)。
  • 统一视图:通过ViewFs提供全局路径映射。

配置示例

  1. <property>
  2. <name>dfs.nameservices</name>
  3. <value>ns1,ns2</value>
  4. </property>
  5. <property>
  6. <name>dfs.namenode.rpc-address.ns1</name>
  7. <value>nn1:8020</value>
  8. </property>

11. Spark on YARN模式对比

Spark支持两种YARN部署模式:

  • Client模式:Driver运行在客户端,适合调试(日志可见)。
  • Cluster模式:Driver运行在AM中,适合生产环境(避免客户端断开导致任务失败)。

提交命令示例

  1. spark-submit --master yarn \
  2. --deploy-mode cluster \
  3. --class org.apache.spark.examples.SparkPi \
  4. --executor-memory 2G \
  5. --num-executors 10 \
  6. /path/to/spark-examples.jar

12. HBase与Hadoop集成要点

HBase依赖HDFS存储数据,需注意:

  • 版本兼容性:HBase 2.x需Hadoop 2.7+。
  • 短路径读取:通过hbase.regionserver.global.memstore.size优化内存。
  • HFile格式:使用HFileOutputFormat直接生成HBase存储文件。

配置示例

  1. <property>
  2. <name>hbase.rootdir</name>
  3. <value>hdfs://ns1/hbase</value>
  4. </property>
  5. <property>
  6. <name>hbase.cluster.distributed</name>
  7. <value>true</value>
  8. </property>

五、实战建议与总结

  1. 模拟面试环境:使用LeetCode或HackerRank的Hadoop专题题库练习。
  2. 深入源码:阅读hdfs-site.xmlyarn-site.xml官方文档,理解参数作用。
  3. 案例分析:针对“数据倾斜”“NameNode宕机”等场景,准备系统化的解决方案。

本文涵盖的100道题目及答案,既包含HDFS、YARN、MapReduce等基础组件,也涉及性能调优、故障排查等进阶内容,适合作为Hadoop开发者面试前的核心复习资料。