Hadoop常见面试题

本文详细介绍了Hadoop的核心组件HDFS的工作原理,包括读写过程、NameNode和Secondary NameNode的角色,以及数据备份和容错机制。同时,文章还涵盖了Hadoop MapReduce的执行流程,包括shuffle过程、数据倾斜的原因和解决方案。此外,还讨论了Hive的存储结构、分区与分桶的区别,以及优化策略。通过对Hadoop生态系统的深入探讨,为读者提供了全面的面试准备指南。
摘要由CSDN通过智能技术生成

目录

什么是hdfs

原理

包含哪些部分

hdfs 的读取过程

hdfs 的写过程

NN 和 2NN 工作机制  (元数据持久化机制)

(一)第一阶段:  NameNode 启动   

(二)第二阶段:  Secondary NameNode 工作   

datanode的工作机制

小文件处理方案

yarn 的运行原理

任务提交阶段:   

任务初始化阶段:  

任务分配阶段:   

什么是shuffle

mapshuffle的过程

mapshuffle优化办法 

reduce shuffle

数据倾斜的原因

mapreduce 数据倾斜的解决方案

hive

存储结构

分区和分桶的区别

四个By

常用场景

hive 优化

1. 首先从 fetch 抓取的角度来看:

2. 本地模式

3. 表优化

hive 的数据倾斜

1)  group by

2)  count(distinct)

3)  不同数据类型关联产生数据倾斜

4)  mapjoin

常用的开窗函数

over()窗口函数的语法结构


什么是hdfs

HDFS指的是Hadoop分布式文件系统(Hadoop Distributed File System),是Apache Hadoop框架中的一个分布式 文件系统。它被设计用来在集群中存储和处理大规模数据集。  HDFS可以提供高可靠性、高吞吐量和高扩性。

原理

1. HDFS将大文件分成多个块(block),每个块默认大小为128MB256MB,然后将这些块分散存储在集群中 的多个节点上

2. 每个块都会有多个副本(replica),默认情况下是3个副本,这些副本会存储在不同的节点上,以保证数据的 可靠性和容错性。

3. HDFS用了主从架构,其中一个NameNode负责管理文件系统的元数据信息,包括文件目录结构、文件块信 副本位置等;多个DataNode负责存储和管理实际的数据块。

4. 端访问HDFS时,会先向NameNode请求文件的元数据信息,然后根据元数据信息找到对应的数据块所在 DataNode,最终从DataNode获取数据

5. HDFS还提供了数据的校验和机制,可以检测数据在传输过程中是否发生错误,以保证数据的完整性

含哪些部分

1. NameNode:负责管理文件系统的元数据信息,包括文件目录结构、文件块信息、副本位置等。  NameNode HDFS核心组件之一,是一个单点故障,因此需要进行备份和容错处理。

2. DataNode:负责存储和管理实际的数据块。  DataNodeHDFS的工作节点,每个节点上都会运行一个 DataNode程,用于管理本地存储的数据块。

3. Secondary NameNode:负责协助NameNode进行元数据信息的备份和恢复工作。  Secondary NameNode 不是NameNode备份,它只是定期从NameNode获取元数据信息,并将其合并为一个镜像文件,以备份和 使用。

4. HDFS户端:包括命令行工具和API等,用于与HDFS交互,完成文件上传、下载、删除等操作。客户端通过 NameNode互获取文件的元数据信息,并根据元数据信息找到对应的数据块所在的DataNode,最终从     DataNode获取数据。

hdfs 读取过程

案一     (来源csdn) 

( 1)  HDFS client创建DistributedFileSystem 对象,通过该对象向 NameNode 请求下载文件,  NameNode 通过查询 元数据,找到文件块所DataNode 地址。     ( 2)挑选一台 DataNode  (要考虑结点距离最近选择原则、               DataNode均衡)服务器,请求读取数据。     ( 3)  DataNode 开始传输数据给客户端(从磁盘里面读取数据输入  流,以 Packet 为单位来做校验),串行读取,即先读取第一个块,再读取第二个块拼接到上一个块后面。     (4)客 户端以 Packet 位接收,先在本地缓存,然后写入目标文件。

答案二:    (来源chatgpt)

1. 客户NameNode请求文件的元数据信息,包括文件的块信息、块所在的DataNode等。

2. NameNode返回文件的元数据信息给客户端。

3. 客户根据元数据信息找到对应的数据块所在的DataNode,然后向DataNode发送读取数据块的请求。

4. DataNode接收到客户端的请求后,从本地磁盘读取对应的数据块,并将数据块传输给客户端。

5. 客户端接收到数据后,将其缓存在本地内存中,然后继续请求下一个数据块,直到读取完整个文件。

要注意的是,  HDFS支持多个客户端同时读取同一个文件,每个客户端都可以从不同的DataNode节点读取数据     块,从而实现了高并发和高吞吐量的文件读取。此外,  HDFS还提供了数据的校验和机制,可以检测数据在传过程 中是否发生错误,以保证数据的完整性。

hdfs 的写过程

案一     (来自csdn)

( 1)  HDFS client创建DistributedFileSystem 对象,通过该对象向 NameNode 请求上传文件,  NameNode 检查权    限,并判断目标文件是否已存在。    

 ( 2)如果权限许可,目标文件也存在,  NameNode进行响应,返回是否可以上传 文件。    

 ( 3)客户端请求第一个 Block 上传到哪几个 DataNode 服务器上。    

 (4)  NameNode 返回 3 DataNode    点(默认副本数为3),分别为 dn1dn2dn3。(这一步要考虑服务器是否可用、副本存储节点选择策略、        DataNode负载均衡)    

 ( 5)   客户端创建FSDataOutputStream数据流对象,通过该对象请求dn1  (即DataNode1)      传(或写)数据(即建立传输通道),   dn1 收到请求会继续调用dn2建立通道,然后 dn2 调用 dn3,这样dn1~dn3 的通信通道建立完成。    

 ( 6)传输通道建立完成后,  dn1dn2dn3 逐级应答客户端。     

( 7)客户端开始往 dn1    一个 Block   (先从磁盘读取数据放到一个本地内存缓存),以Packet为单位(每次发送的是一个Packet对象), dn1 收到一个 Packet   (直接从内存中)传给 dn2 dn2 传给 dn3。需要注意的是,这里传输的packet大小是64K,这 64Kpacket其实就是一个缓冲队列,里面包含多个(chunkchunksum),一个chunk512byte,其校验码       chunksum4bytedn1 每传一个 packet会放入一个应答队列(即ack队列,起备份作用)等待应答,当所有的        DataNode应答成功后会将该packet从应答队列中移除。     

( 8)当一个 Block 传输完成之后,客户端再次请求          NameNode 上传第二个 Block 到服务器。(重复执行 3-7 步)。

( 9)所有的Block传输完毕并确认完成后,  HDFS CLient关闭FSDataOutputStream数据流对象。然后,  HDFS Client 联系NameNode确认数据写完成,  NameNode 在内存中对其元数据进行增删改(然后再通过                                 SecondaryNameNode对元数进行修改)。注意,此时只是把更新操作记录到编辑日志Editlog,并没有真正合并编 志和镜像文件,只有触发checkPoint才合并。

答案二:    (来自chatgpt)

1. 客户NameNode请求创建文件,并指定文件的名称、大小、块大小等信息。

2. NameNode接收到客户端的请求后,根据文件大小和块大小等信息,计算出需要创建的数据块数量,然后返回 给客户端一个数块列表,包括每个数据块的ID和副本位置等信息。

3. 客户端根据数据块列表,将文件分成多个数据块,并将每个数据块写入到对应的DataNode节点上。在写入数 之前,客户端会先向DataNode节点发送一个写入请求,并获取一个写入管道(pipeline)。

4. 客户端将数据块写入到写入管道中,然后DataNode节点将数据块存储到本地磁盘上,并将数据块传输给下一 个节点。这样,数据块就会依次传输到所有的副本位置上,从而实现了数据的备份和容错。

5. 当所有的数据块都写入完成后,客户端向NameNode发送一个完成请求,告知NameNode文件已经创建完 

NN  2NN 工作机制  (元数据持久化机制)

(一)第一阶段:  NameNode 启动   

( 1)第一次启动 NameNode 格式化后,创建 镜像文件fsimage 和 编辑日志     edits_inprogress_001 文件。如果不是第一次启动,直接加载编辑日志和镜像文件到内存。  

( 2)客户端对元数据进 行增删改的请求。   

 ( 3)  NameNode 记录更新操作到edits_inprogress_001 中   

(4)  NameNode 在内存中对元数据  行增删改(然后再通过SecondaryNameNode对元数据进行修改)。

()第二阶段:  Secondary NameNode 工作   

( 1)  Secondary NameNode 询问 NameNode 是否需要                   CheckPoint  (是否需要服务),带回 NameNode是否可服务的条件。  CheckPoint触发条件:定时时间到;  Edits 的数据满了。    

 ( 2)  Secondary NameNode 请求执行 CheckPoint  (即请求服务)。    

 ( 3)  NameNode 滚动正在写的 edits_

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

qq_64412267

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值