Hadoop面试100道收集(带答案)
一、基础概念与架构(20题)
1. Hadoop的核心组件有哪些?
Hadoop生态由三大核心模块构成:HDFS(分布式文件系统)、YARN(资源管理系统)和MapReduce(计算框架)。HDFS负责数据存储,采用主从架构(NameNode+DataNode);YARN管理集群资源,通过ResourceManager和NodeManager实现;MapReduce提供分布式计算能力,分为Map和Reduce两个阶段。
2. HDFS读写流程详解
写入流程:
- 客户端通过DistributedFileSystem创建文件,NameNode返回可用的DataNode列表。
- 数据按128MB分块(默认),通过DFSOutputStream写入第一个DataNode,并由其转发至后续节点(默认3副本)。
- 写入完成后,DataNode向NameNode汇报块位置信息。
读取流程:
- 客户端向NameNode请求文件元数据,获取块列表及对应DataNode地址。
- 按就近原则(网络拓扑)选择DataNode读取数据块。
- 合并所有块数据后返回给客户端。
3. YARN资源调度策略
YARN支持三种调度器:
- FIFO Scheduler:先进先出,适合单用户集群。
- Capacity Scheduler:多队列划分资源,支持层级队列和优先级。
- Fair Scheduler:动态分配资源,保证所有应用公平获得资源。
配置示例:
<property><name>yarn.scheduler.capacity.root.queues</name><value>default,dev</value></property>
二、核心组件与原理(30题)
4. MapReduce的Shuffle过程
Shuffle是Map到Reduce的数据重分配阶段,包含四个步骤:
- Map端:输出键值对写入环形内存缓冲区(默认100MB),溢出到磁盘时按Partitioner分区,并排序、合并。
- 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)防止脑裂。
配置关键参数:
<property><name>dfs.ha.namenodes.ns1</name><value>nn1,nn2</value></property><property><name>dfs.namenode.shared.edits.dir</name><value>qjournal://node1:8485;node2:8485;node3:8485/ns1</value></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管理总内存。
示例配置:
<property><name>yarn.nodemanager.resource.memory-mb</name><value>8192</value></property><property><name>mapreduce.map.memory.mb</name><value>2048</value></property><property><name>mapreduce.map.java.opts</name><value>-Xmx1800m</value></property>
三、性能调优与故障排查(30题)
7. HDFS小文件问题解决方案
小文件(<128MB)会导致NameNode内存压力和读取效率低下,优化方法包括:
- 合并文件:使用
hadoop archive -archiveName files.har -p /input /output生成HAR文件。 - SequenceFile:将小文件序列化为键值对存储。
- CombineFileInputFormat:在MapReduce中合并输入分片。
8. MapReduce倾斜数据处理
数据倾斜会导致部分Reduce任务耗时过长,解决方案:
- 二次排序:自定义
Partitioner和GroupingComparator。 - 加盐处理:在键后添加随机前缀(如
key_1~key_10),分散数据。 - Skew Join:对倾斜键单独处理,例如:
// 示例:加盐处理public class SaltedPartitioner extends Partitioner<Text, IntWritable> {@Overridepublic int getPartition(Text key, IntWritable value, int numPartitions) {String saltedKey = key.toString() + "_" + (Math.abs(key.hashCode()) % 10);return (saltedKey.hashCode() & Integer.MAX_VALUE) % numPartitions;}}
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提供全局路径映射。
配置示例:
<property><name>dfs.nameservices</name><value>ns1,ns2</value></property><property><name>dfs.namenode.rpc-address.ns1</name><value>nn1:8020</value></property>
11. Spark on YARN模式对比
Spark支持两种YARN部署模式:
- Client模式:Driver运行在客户端,适合调试(日志可见)。
- Cluster模式:Driver运行在AM中,适合生产环境(避免客户端断开导致任务失败)。
提交命令示例:
spark-submit --master yarn \--deploy-mode cluster \--class org.apache.spark.examples.SparkPi \--executor-memory 2G \--num-executors 10 \/path/to/spark-examples.jar
12. HBase与Hadoop集成要点
HBase依赖HDFS存储数据,需注意:
- 版本兼容性:HBase 2.x需Hadoop 2.7+。
- 短路径读取:通过
hbase.regionserver.global.memstore.size优化内存。 - HFile格式:使用
HFileOutputFormat直接生成HBase存储文件。
配置示例:
<property><name>hbase.rootdir</name><value>hdfs://ns1/hbase</value></property><property><name>hbase.cluster.distributed</name><value>true</value></property>
五、实战建议与总结
- 模拟面试环境:使用LeetCode或HackerRank的Hadoop专题题库练习。
- 深入源码:阅读
hdfs-site.xml和yarn-site.xml官方文档,理解参数作用。 - 案例分析:针对“数据倾斜”“NameNode宕机”等场景,准备系统化的解决方案。
本文涵盖的100道题目及答案,既包含HDFS、YARN、MapReduce等基础组件,也涉及性能调优、故障排查等进阶内容,适合作为Hadoop开发者面试前的核心复习资料。