** 本专栏的Hadoop复习计划文章内容主要包含以下几个部分:
【简单】学习通习题
【进阶】课本课后练习
【操作】相关章节实验回顾
** 使用教材:大数据技术原理与应用(第3版)林子雨 编著
** 教材课后答案点这里
让我们开始吧!
学习通 - 习题
1. HDFS的命名空间不包含
A.目录
B.块
C.文件
D.字节
我的答案:D
解析:
【什么是命名空间】
1)HDFS 集群
- 1 个 名称节点(NameNode)
- 若干个数据节点(DataNode)
2)名称节点(NameNode)
- 中心服务器
- 职责:管理文件系统的命名空间、客户端对文件的访问
3)命名空间包含:
- 目录
- 文件
- 块
【什么是块】
块是HDFS中的储存单位,一个块大小为64MB,一个文件可以被分割成多个块,便于储存
2. 对HDFS通信协议的理解错误的是
A.客户端与数据节点的交互是通过RPC(Remote Procedure Call)来实现的
B.HDFS通信协议都是构建在IoT协议基础之上的
C.名称节点和数据节点之间则使用数据节点协议进行交互
D.客户端通过一个可配置的端口向名称节点主动发起TCP连接,并使用客户端协议与名称节点进行交互
我的答案:B
解析:
【什么是通信协议】
通信协议是计算机与网络之间进行信息传输时,所必须要遵守的一系列人为设定的规则
【TCP/IP 协议】
TCP/IP协议,也叫作网络通讯协议。它是在网络的使用中的最基本的通信协议
TCP/IP传输协议对互联网中各部分进行通信的标准和方法进行了规定
【HDFS为什么需要通信协议】
HDFS需要通过网络进行集群之间的数据传输,故需要制定相应的通信协议
B.【所有的HDFS通信协议都是构建在TCP/IP协议基础之上】
D.【客户端通过一个可配置的端口向NameNode主动发起TCP连接,并使用客户端协议与NameNode进行交互】
【什么是TCP链接】
TCP 是用于应用程序之间的通信链接
A.【客户端与DataNode之间的通过RPC来实现】
NameNode不会主动发起RPC,而是响应来自客户端和DataNode的RPC请求
C.【NameNode与DataNode之间通过DataNode协议(数据节点协议)交互】
3. 采用多副本冗余存储的优势不包含
A.节约存储空间
B.加快数据传输速度
C.容易检查数据错误
D.保证数据可靠性
我的答案:A
解析:
【什么是多副本冗余存储】
即一个数据块被复制多次,分发到不同的节点上
【为什么采用多副本冗余存储】
为了增加该分布式系统的容错性和可用性
简单举例就是,当一个节点不可用时,还可以从其他节点中调用该数据块的副本,从而保证了该系统整体上不出错
【多副本冗余存储的优点】
- 加快传输速度
- 容易检查数据错误
- 保证数据可靠性
** 注:由于是“冗余”存储,所以占用空间肯定是更大的,故不可能是节省储存空间
4. 分布式文件系统HDFS采用了主从结构模型,由计算机集群中的多个节点构成的,这些节点分为两类,一类存储元数据叫?另一类存储具体数据叫?
A.数据节点,名称节点
B.名称节点,数据节点
C.名称节点,主节点
D.从节点,主节点
我的答案:B
解析:
【什么是元数据】
HDFS中的元数据包含:
- 抽象目录树
- 数据和块的映射关系
- 数据块的储存节点
【HDFS元数据、具体数据的储存位置】
- NameNode储存了所有的元数据
- DataNode负责储存具体数据
5. 下面关于分布式文件系统HDFS的描述正确的是
A.分布式文件系统HDFS是Google Bigtable的一种开源实现
B.分布式文件系统HDFS是一种关系型数据库
C.分布式文件系统HDFS是谷歌分布式文件系统GFS(Google File System)的一种开源实现
D.分布式文件系统HDFS比较适合存储大量零碎的小文件
我的答案:C
解析:
C.【HDFS是GFS的一种开源实现】
B. HDFS只是分布式文件系统,不是数据库
D. HDFS支持大规模文件存储
课本 - 习题
1. 试述分布式文件系统设计的需求
设计需求 | 含义 | HDFS的实现情况 |
透明性 |
|
|
并发控制 | 一个客户端对文件的读写不应该影响其他的客户端对同一个文件的读写 | 任何时候都只允许一个程序写入某个文件 |
文件复制 | 一个文件可以拥有不同位置的多个副本 | 多副本冗余存储 |
硬件、操作系统的异构性 | 可以在不同的操作系统、计算机上实现相同的客户端、服务端程序 | 采用JAVA开发,具有良好的跨平台能力 |
可伸缩性 | 支持节点(Node)的动态加入、动态退出 | 建立在大规模廉价机器上的分布式文件系统集群,具有很好的伸缩性 |
容错 | 保证文件服务在客户端、服务端出现问题的时候整体上仍能正常使用 |
|
安全 | 保证系统的安全性 | 安全性较弱 |
2. 分布式文件系统时如何实现高水平拓展的
【什么是高水平拓展】
- 即支持 DataNode 的动态增添、动态删除
- 具体表现为:增添或者删除时DataNode时,支持热插拔,即无需重新启动集群,NameNode 都会感知到并及时更新metadata(元数据)
【HDFS如何实现高水平拓展】
- 采用 master/slave、NameNode/DataNode 的主从模式,元数据储存在 NameNode(master)
- DataNode 会周期性地向 NameNode 发送心跳信息,报告自己的状态
1)如果 DataNode 减少
- 该 DataNode 不会再给 NameNode 发送心跳信息,NameNode 感知到并标记该 DataNode为宕机,该节点上面的所有数据被标记为“不可读”,NameNode 不会再向它发送任何 I/O 请求
- 标记宕机的 DataNode 的数据块在其他 Node上有副本,因此该 DataNode 的减少,不会导致全局数据丢失
- NameNode 一旦发现该 Node 上的数据块小于冗余因子,会自动启动数据冗余复制,生成新的副本,以满足冗余因子
2)如果 DataNode 增加
- 新增 DataNode 会周期性向 NameNode 发送心跳信息,NameNode 收到该心跳信息,标记该DataNode为非“宕机”状态
- 来自集群外部的写操作请求,从集群内部挑选一台磁盘不太满、CPU不太忙的数据节点,作为第一个副本的存放地
- DataNode 会根据 客户端 或 NameNode 的调度进行数据存储、检索,并且向 NameNode 定期发送自己所存储块的列表
** 参考:HDFS系统如何实现高水平扩展
3. 试述HDFS中的块和普通文件系统的块的区别
【普通文件系统的块】
在普通的文件系统中,比如本地文件系统,在磁盘中保存的数据,是以数据块的形式进行存储的,此时数据块的大小一般只有几千字节
【HDFS中的块】
- HDFS的数据库块大小默认为64M(远大于几千字节)
- 目的:最小化寻址开销(通俗来讲,就是文件分块越大,分成的部分就越少,找的时候就更快)
** 参考:分布式文件系统HDFS
4. 试述HDFS中的NameNode与DataNode的具体功能
【NameNode】
- 角色:中心服务器(Master)
- 功能:管理文件系统的命名空间(储存元数据)、客户端对文件的访问
【DataNode】
- 角色:工作节点(Slave)
- 功能:
- ①(在客户端或NameNode的调取下执行)数据的储存、读取、检索
- ② 向 NameNode 定期发送自身储存的块的列表
5. 在分布式文件系统中,中心节点的设计至关重要,请阐述HDFS是如何减轻中心节点的负担的
- HDFS的文件块为64M,该设计导致 NameNode 需要储存的元数据较少,故能减少元数据占用NameNode内存容量(通俗来讲,就是文件分块越大,分成的部分就越少,登记它们储存在哪里的信息就越少)
- HDFS集群只有一个 NameNode,该节点只记录元数据,这种设计大大简化了分布式文件系统的结构:可以保证数据不会脱离名称节点的控制,数据块亦不会使用 NameNode 进行存储,大大减轻中心服务器的内存占用
** 参考:试述HDFS如何减轻中心节点的负担
6. HDFS只设置唯一一个NameNode,在简化设计的同时也带来了一系列明显的局限性,请阐述局限性具体表现在哪些方面
1)不适合低延迟数据访问
- 通俗来讲,就是你想要很快地查找数据,快到要求毫秒级别就要相应的时候,HDFS就不适用,因为HDFS相对较慢
2)无法高效存储大量小文件
- 因为小文件的块数很多,故 NameNode 要记录的元数据就很多,就加大了 NameNode 的内存开销
3)不支持多用户写入及任意修改文件
- 为了实现并发控制,同一时间只支持一个程序写入某个文件
7. 试述HDFS的冗余数据存储策略
- NameNode:只保存元数据
- DataNode:一个数据块的多个副本会被分布到不同的DataNode上,如下图所示
图片来源:课本配套 PPT 第三章 分布式文件系统 HDFS,侵删
8. 数据复制主要是在数据写入和数据恢复时发生,HDFS数据复制是使用流水线复制的策略,请阐述该策略的细节
假设HDFS副本系数为3,当本地暂时文件积累到一个数据块大小时,client会从 NameNode 获取一个列表用于存放副本。
- client开始向第一个DataNode数据传输,第一个DataNode一小部分一小部分地接收数据,将每一部分写入本地仓库,并同一时间传输该部分到列表中的第二个DataNode节点
- 第二个DataNode也是这样,一小部分一小部分地接收数据,写入本地仓库,并同一时候转发给下一个节点;此时,数据以流水线的方式从前一个DataNode拷贝到下一个DataNode
- 第三个DataNode接收数据并存储到本地
因此,DataNode能流水线地从前一个节点接收数据,并同一时间转发给下一个节点,数据以流水线的方式从前一个DataNode拷贝到下一个DataNode,并以相反的方向 ACK* 前一个Node。
* 注
ACK:确认字符,在数据通信中,接收站发给发送站的一种传输类控制字符。表示发来的数据已确认接收无误。在TCP/IP协议中,如果接收方成功的接收到数据,那么会回复一个ACK数据。通常ACK信号有自己固定的格式,长度大小,由接收方回复给发送方。(来源:ACK百度百科)
** 参考:HDFS副本存放机制和流水线复制
9. 试述HDFS是如何探测错误发生、如何进行恢复的
【HDFS数据错误类型】
- NameNode错误
- DataNode错误
- 数据块错误
1)NameNode 错误
- 核心文件:FsImage、Editlog,如果这两个文件损坏,则整个HDFS实例失效
- 应对机制:将核心文件同步复制到 SecendaryNameNode 上,当 NameNode 出错时,可以根据备份在 SecendaryNameNode 上的 FsImage、Editlog 数据进行恢复
2)DataNode错误
正常运作时,每个 DataNode 会给 NameNode 发送心跳信息,即向 NameNode 报告自己的状态
当 DataNode 发生错误时,
- 该 DataNode 不会再给 NameNode 发送心跳信息,NameNode 感知到并标记该 DataNode为宕机,该节点上面的所有数据被标记为“不可读”,NameNode 不会再向它发送任何 I/O 请求
- 标记宕机的 DataNode 的数据块在其他节点上有副本,因此该 DataNode 的减少,不会导致全局数据丢失
- NameNode 一旦发现该 Node 上的数据块小于冗余因子,会自动启动数据冗余复制,生成新的副本,以满足冗余因子
3)数据块错误
- 客户端在读取到数据后,会采用md5和sha1对数据块进行校验,以确定读取到正确数据
- 在文件被创建时,客户端就会对每一个文件块进行信息摘录,并将这些信息写入到同一个路径的隐藏文件里面
- 当客户端读取文件的时候,会先读取该信息文件,然后利用该信息文件对每个读取的数据块进行校验,如果校验出错,客户端就很请求到另一个 DataNode 读取该文件块,并且向 NameNode 报告这个文件块有错误,NameNode 会定期检查并且重写复制这个文件块
** 参考:HDFS 数据错误与恢复
10. 请阐述HDFS在不发生故障时读取文件的流程
如图所示,读文件的流程主要包括以下6个步骤:
- 打开分布式文件:调用分布式文件 DistributedFileSystem.open( ) 方法
- 寻址请求:从 NameNode 处得到 DataNode 的地址,DistributedFileSystem使用 RPC 方式调用了NameNode,NameNode 返回存有该副本的DataNode 地址,DistributedFileSystem 返回了一个输入流对象(FSDataInputStream),该对象封装了输入流 DFSInputStream
- 连接到DataNode:调用输入流 FSDataInputStream.read( ) 方法从而让DFSInputStream 连接到 DataNodes
- 从 DataNode 中获取数据:通过循环调用 read( ) 方法,从而将数据从 DataNode 传输到客户端
- 读取另外的 DataNode 直到完成:到达块的末端时候,输入流 DFSInputStream 关闭与 DataNode 连接, 寻找下一个 DataNode
- 完成读取,关闭连接:即调用输入流 FSDataInputStream.close( )
** 参考:HDFS-文件读写流程
11. 请阐述HDFS在不发生故障时写文件的流程
如图所示,写文件的流程主要包括以下7个步骤:
- 发送创建文件请求:调用分布式文件系统 DistributedFileSystem.create( )方法
- NameNode 创建文件记录:分布式文件系统 DistributedFileSystem 发送 RPC 请求给 NameNode,NameNode 检查权限后创建一条记录,返回输出流 FSDataOutputStream,封装了输出流 DFSOutputDtream
- 客户端写入数据:输出流 DFSOutputDtream 将数据分成一个个的数据包,并写入内部队列。DataStreamer 根据 DataNode 列表来要求 NameNode 分配适合的新块来存储数据备份。 一组 DataNode 构成管线(管线的 DataNode 之间使用 Socket 流式通信)
- 使用管线传输数据:DataStreamer 将数据包流式传输到管线第一个DataNode,第一个 DataNode 再传到第二个DataNode,直到完成
- 确认队列:DataNode 收到数据后发送确认,管线的 DataNode 所有的确认组成一个确认队列。所有 DataNode 都确认,管线数据包删除
- 关闭:客户端对数据量调用 close( ) 方法。将剩余所有数据写入DataNode管线,联系NameNode并且发送文件写入完成信息之前等待确认
- NameNode确认
** 参考:HDFS-文件读写流程
HDFS - 实验回顾
** 本复习内容来源于实验3
使用HDFS基本命令完成以下操作:
(1)显示根目录下的子目录和文件
hadoop fs -ls /
(2)在HDFS根目录下创建一个名为test的目录
hadoop fs -mkdir /test
(3)在HDFS的test目录下创建一个名为input的目录
hadoop fs -mkdir /test/input
(4)将b.txt上传到test目录下
hadoop fs -put /b.txt /test
(5)将test目录下的b.txt转移到input目录下
hadoop fs -mv /test/b.txt /test/input
(6)将input目录下的b.txt复制到test目录下
hadoop fs -cp /test/input/b.txt /test
(7)删除input目录及input目录下的文件
hadoop fs -rm -r /test/input