hadoop问答
1. hadoop组件有哪些?分别有什么功能
| 组件 | 功能 |
|---|---|
| HDFS | 分布式文件存储系统,提供高容错性海量存储 |
| MapReduce | 分布式计算框架,并行处理大数据集 |
| YARN | 资源调度系统,管理集群资源并分配任务 |
| Hive | 主要用于处理结构化和半结构化数据 |
| Common | 通用工具库,支持其他模块 |
2. 分布式存储的组件是什么 ?有哪些进程? 进程的作用是什么?
分布式存储组件是 HDFS,其包含的进程及作用如下:
| 进程 | 作用 |
|---|---|
| NameNode | 管理元数据(文件名、块位置、权限),响应客户端请求 |
| DataNode | 存储实际数据块,定期向NN发送心跳和块报告 |
| SecondaryNameNode | 定期合并FsImage和Edits日志(非热备,缓解NN压力) |
3. 资源调度使用什么组件? 该组件有哪些进程?每个进程的作用是什么?
资源调度使用的组件是 YARN,相关进程及作用如下:
| 进程 | 作用 |
|---|---|
| ResourceManager | 负责全局资源的调度和分配 |
| NodeManager | 管理单个节点上的资源和容器 |
| ApplicationMaster | 为特定应用程序协调资源,并与 NodeManager 进行通信 |
4. 分布式计算分为几个步骤? shuffle有几个步骤?
分布式计算主要包含 Map 和 Reduce 两个步骤。
典型的 MapReduce 分布式计算过程大致可以分成 4 个主要阶段:
| 阶段 | 主要作用 |
|---|---|
| 1️⃣ Input | 从 HDFS(或其他存储)读取输入数据,切分成 Split,分配给不同的 Map Task |
| 2️⃣ Map | 每个 Map Task 处理 Split,生成 <key, value> 对,中间结果按 key 排序、分区、缓冲 |
| 3️⃣ Shuffle | 核心阶段,从 Map Task 把数据传输到 Reduce Task,包括分区、排序、拷贝、合并 |
| 4️⃣ Reduce | Reduce Task 聚合同一个 key 的所有 value,执行用户逻辑,输出结果写回 HDFS |
Shuffle 作为连接 Map 和 Reduce 的阶段,具体步骤如下:
- Map 端输出并分区:Map 任务完成后,输出结果会按照键进行分区。
- 排序与合并:对分区内的数据进行排序,并可能进行合并操作。
- 网络传输:将排序好的数据通过网络传输到对应的 Reduce 任务。
- Reduce 端合并与排序:Reduce 任务接收数据后,再次进行合并和排序。
5. hdfs文件系统的读取数据流程是什么?
- 客户端向 NameNode 发送文件读取请求。
- NameNode 返回文件数据块的位置信息。
- 客户端直接与 DataNode 建立连接读取数据。
- DataNode 将数据块传输给客户端。
- 若读取多个数据块,客户端会并行读取以提高效率
6. hdfs文件系统的写文件流程是什么?
- 客户端向 NameNode 发起文件创建请求。
- NameNode 检查文件是否存在以及客户端权限,若通过检查则创建文件记录(响应上传请求)。
- 客户端将数据分成数据块,以流式方式写入第一个 DataNode。
- DataNode 按照流水线方式将数据块复制到其他副本节点。
- 完成写入后,DataNode 向客户端确认,客户端再向 NameNode 确认(数据同步)。
7. hdfs文件系统 namenode的更新流程是什么?
- 所有对文件系统元数据的修改操作都会记录到编辑日志(EditLog)中。
- 内存中的命名空间(Namespace)会被实时更新。
- SecondaryNameNode 定期从 NameNode 获取编辑日志和命名空间镜像。
- SecondaryNameNode 将编辑日志合并到命名空间镜像中,生成新的检查点。
- NameNode 在启动时会使用最新的检查点恢复元数据。
8. 整个mapreduce阶段经历几次排序?分别在哪些阶段?
在整个 MapReduce 阶段中,核心的排序大致发生 3 次,主要在以下阶段:
| 阶段 | 排序目的 | 主要发生在哪 |
|---|---|---|
| Map输出排序 | 对 Map 输出按 key 排序 | Map Task 内存缓冲区写磁盘时 |
| Shuffle 归并排序 | 把多个 Map 输出文件归并成有序流 | Reduce Task 拉取后本地归并 |
| Reduce输入排序 | 按 key 进行最终分组(可有自定义二次排序) | Reduce Task 输入流 |
9. hive中内部表和外部表有什么区别? 分区表和分桶表有什么区别?
内部表与外部表的区别:
- 内部表(Managed Table):Hive 管理数据的存储位置,删除表时会同时删除数据。
- 外部表(External Table):数据由用户指定存储位置,删除表时仅删除元数据,数据不会被删除。
分区表与分桶表的区别:
- 分区表(Partitioned Table):按照指定字段(如日期、地区)将数据存储在不同的目录中。
- 分桶表(Bucketed Table):通过哈希函数将数据分到不同的文件(桶)中,常用于提高查询效率
10. 数据倾斜是什么? 如何规避和处理?
数据倾斜指的是在分布式计算中,部分任务处理的数据量远大于其他任务,导致整体性能下降的现象。
规避和处理方法有:
- 对 key 进行预处理,如添加随机前缀。
- 采用 Combiner 减少数据传输量。
- 增大 Reduce 任务数量。
- 利用 Hive 的 skewjoin 优化。
- 过滤异常 key 或对其进行单独处理。
11. 如何使用hdfs文件系统上传或下载数据? 关闭hdfs文件系统安全模式
- 上传数据:使用命令
hdfs dfs -put <本地路径> <HDFS路径>。 - 下载数据:使用命令
hdfs dfs -get <HDFS路径> <本地路径>。 - 关闭安全模式:先使用命令
hdfs dfsadmin -safemode get查看安全模式状态,再使用hdfs dfsadmin -safemode leave关闭安全模式。
12. order by 和sort by 的区别和使用场景?
- Order By:对查询结果进行全局排序,会将所有数据发送到一个 Reduce 任务中,在处理大量数据时效率较低。
- Sort By:仅保证每个 Reduce 任务内部数据有序,最终结果可能不是全局有序的,但处理效率更高。
使用场景:当需要严格全局有序时使用 Order By,对全局顺序要求不高时使用 Sort By。
13. cluster by 和distribute by 的区别和使用场景?
- Cluster By:相当于 Distribute By 和 Sort By 的组合,既按照指定字段进行数据分发,又对分发后的数据进行排序。
- Distribute By:仅控制数据在不同 Reduce 任务之间的分发,不保证排序。
使用场景:Cluster By 用于需要数据分发和排序的场景,Distribute By 用于只需要控制数据分发的场景。





