一、Hadoop基础理论(20题)
1. Hadoop的核心组件有哪些?
Hadoop生态包含三大核心组件:
- HDFS(分布式文件系统):提供高吞吐量的数据存储能力,采用主从架构(NameNode+DataNode)。
- YARN(资源管理系统):负责集群资源调度,分离计算与资源管理功能。
- MapReduce(计算框架):通过分而治之实现大规模数据并行处理。
典型应用场景:日志分析、ETL处理、推荐系统。
2. HDFS的读写流程是怎样的?
写入流程:
- 客户端通过DistributedFileSystem向NameNode申请元数据空间。
- NameNode返回可写入的DataNode列表(按机架感知策略排序)。
- 客户端以流水线方式将数据块(默认128MB)写入DataNode,每完成一个块生成校验文件(.meta)。
- 所有副本写入完成后,客户端向NameNode提交写入完成通知。
读取流程:
- 客户端请求NameNode获取文件块位置信息。
- NameNode返回最近的DataNode列表(优先同机架节点)。
- 客户端并行读取多个DataNode的数据块,合并后返回结果。
3. MapReduce的Shuffle过程详解
Shuffle分为Map端和Reduce端:
-
Map端:
- 每个Map任务输出
对到环形内存缓冲区(默认100MB)。 - 缓冲区达到阈值(80%)时触发Spill操作,由Partitioner确定分区,Combiner进行局部聚合。
- Spill文件按分区排序后写入磁盘,多个Spill文件合并为最终输出文件。
- 每个Map任务输出
-
Reduce端:
- 通过HTTP从所有Map节点拉取对应分区的数据。
- 合并后的数据按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)方案:
- 主NameNode(Active)将编辑日志(EditLog)写入共享存储(JournalNodes集群)。
- 备NameNode(Standby)从JournalNodes同步日志,保持内存状态一致。
- ZooKeeper监控主备状态,故障时通过
fencing机制确保只有一个Active节点。
6. 处理DataNode磁盘空间不足
解决方案:
- 动态扩容:添加新磁盘后执行
hdfs balancer平衡数据分布。 - 调整存储策略:
dfs.datanode.fsdataset.volume.choosing.policy切换为可用空间优先。 - 清理过期文件:通过
hdfs dfs -expunge清空回收站。
三、MapReduce编程与优化(25题)
7. 自定义Partitioner的示例
public class CustomPartitioner extends Partitioner<Text, IntWritable> {@Overridepublic int getPartition(Text key, IntWritable value, int numPartitions) {String word = key.toString();if (word.startsWith("A")) return 0;else if (word.startsWith("B")) return 1;else return (word.hashCode() & Integer.MAX_VALUE) % numPartitions;}}// 在Driver中设置: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输入输出记录数。
自定义计数器示例:// Mapper中context.getCounter("ErrorCounter", "InvalidRecord").increment(1);// 命令行查看:hadoop job -counter <job-id>
四、YARN资源管理与调度(20题)
10. YARN的调度器类型对比
| 调度器 | 特点 | 适用场景 |
|———————|———————————————————————————————————|————————————|
| FIFO | 先进先出,不支持多租户 | 单用户集群 |
| Capacity | 按队列分配资源,每个队列有固定容量 | 多部门共享集群 |
| Fair | 动态分配资源,所有作业平均获取资源 | 交互式作业优先 |
11. 容器(Container)资源申请格式
<configuration><property><name>yarn.scheduler.capacity.maximum-am-resource-percent</name><value>0.3</value> <!-- 允许AM使用的最大资源比例 --></property><property><name>yarn.nodemanager.resource.memory-mb</name><value>8192</value> <!-- 单节点总内存 --></property></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%
排查步骤:
- 检查Reduce阶段日志:
yarn logs -applicationId <app_id>。 - 确认是否有数据倾斜:通过Web UI查看Reduce输入记录数差异。
- 调整超时参数:
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数据量”。