1、HDFS总结

 

 

目录

 

1、hdfs特点

2、HDFS命令

3、block备份

5、HDFS架构

6、HDFS元数据

7、负载均衡

8、HDFS写流程

9、hdfs读流程

10、HDFS高可用与联邦

11. HDFS小文件处理

12、文件快照概念

13.、介绍一下RPC通信的逻辑实现

14.、fsimage和editlogs是做什么用的?

15、Linux中的块大小为4KB, 为什么HDFS中块大小为64MB或128MB?

16.、并发写入HDFS文件可行吗?


 

1、hdfs特点


Hadoop中的分布式文件系统

HDFS高容错(数据库blcok备份)

可扩展,集群上,成本低

适合存储大文件,不适合存储小文件,不适合处理低延时的数据(HBase更好),

一次写入、多次读写,不支持多用户写入及任意修改文件

 

2、HDFS命令


hadoop fs -put localpath hdfspath 上传文件
hadoop fs -get hdfspath localpath 下载文件
hadoop fs -getmerge hdfspath localpath
hadoop fs -rm -r hdfspath 删除
hadoop fs -mv(-cp) hadfspath1 hafspath2 移动
hadoop fs -cat(-text) hdfspath 查看文件详情
hadoop fs -ls hdfspath 查看文件总目录

3、block备份

向HDFS上传文件,是按照128M为单位,切分成一个个block,分散的存储在集群的不同数据节点datanode上

问:1、HDFS中一个44M大小的block块会不会占据128M的空间?

不会,小于128M大小的块不会占据128M空间,此例占据44M

问:2、这样存储有没有问题?

hadoop集群搭建在廉价的商用服务器上,所以服务器有出问题的几率

问:3. datanode什么情况下不会备份?

设置备份数为1时, 就不会备份了.

 

问:4. 如何设置block副本数?

  • hdfs-site.xml文件中 dfs.replication变量,设置replication = 3

设置文件副本数的方法:

方式一:使用命令设置文件副本数;动态生效,不需要重启hadoop集群

hadoop fs -setrep -R 4 /pathHDFS提供了fsck命令,用于检查HDFS上文件和目录的健康状态、获取文件的block信息和位置信息

方式二:修改配置文件hdfs-site.xml,需要重启hadoop集群才能生效
 

5、HDFS架构

HDFS是主从架构 

  • 主叫NameNode,中文称“名称节点”
  • 从叫DataNode,中文称“数据节点

 

HDFS的三个核心组件是什么, 有什么作用?

(1)NameNode. 集群的核心, 是整个文件系统的管理节点. 负责存储HDFS集群的元数据,存在内存中 

(2)DataNode. 存放具体数据块的节点, 主要负责数据的读写, 定期向NameNode发送心跳,超过10分钟节点不可用,6小时上报当前DataNode上的块状态

(3)SecondaryNameNode. 辅助节点, 同步NameNode中的元数据信息, 辅助NameNode对fsimage和editsLog进行合,对HDFS元数据做checkpoint操作,每1分钟检查一次,每1小时创建一个检查点

集群的心跳机制,让集群中各节点形成一个整体;主节点知道从节点的死活

节点的上下线,导致存储的不均衡,可以手动触发负载均衡

 

 

6、HDFS元数据

元数据

  • 关于文件或目录的描述信息,如文件所在路径、文件名称、文件类型等等,这些信息称为文件的元数据metadata

①编辑日志文件 edits log,保存至namenode中

edits log为hdfs-site.xml中属性dfs.namenode.edits.dir的值决定;用于namenode保存edits.log文件

②命名空间镜像文件 fsimage,保存磁盘中

将namenode内存中的元数据落入磁盘生成的文件;

fsimage为hdfs-site.xml中属性dfs.namenode.name.dir的值决定;用于namenode保存fsimage文件
 

每个文件、目录、block占用大概150Byte字节的元数据;所以HDFS适合存储大文件,不适合存储小文件

 

7、负载均衡

  • 1、什么原因会有可能造成不均衡?

    • 机器与机器之间磁盘利用率不平衡是HDFS集群非常容易出现的情况

    • 尤其是在DataNode节点出现故障或在现有的集群上增添新的DataNode的时候

  • 2、为什么需要均衡?

  • 防止热点出现,提升集群存储资源利用率

  • 从存储与计算两方面提高集群性能

8、HDFS写流程

请求上传——检查目录——可以上传——查询Datanode信息——分配datanode——建立数据流——发送数据

1、使用 HDFS 提供的客户端 Client,向远程的 namenode 发起 RPC 请求

2、namenode 会检查要创建的文件是否已经存在,创建者是否有权限进行操作,成功则会 为文件创建一个记录,否则会让客户端抛出异常;

3、当客户端开始写入文件的时候,客户端会将文件切分成多个 packets,并在内部以数据队列“data queue(数据队列)”的形式管理这些 packets,并向 namenode 申请 blocks,获 取用来存储 replicas 的合适的 datanode 列表,列表的大小根据 namenode 中 replication 的设定而定;

4、开始以 pipeline(管道)的形式将 packet 写入所有的 replicas 中。客户端把 packet 以流的 方式写入第一个 datanode,该 datanode 把该 packet 存储之后,再将其传递给在此 pipeline 中的下一个 datanode,直到最后一个 datanode,这种写数据的方式呈流水线的形式。

5、最后一个 datanode 成功存储之后会返回一个 ack packet(确认队列),在 pipeline 里传递 至客户端,在客户端的开发库内部维护着"ack queue",成功收到 datanode 返回的 ack packet 后会从"data queue"移除相应的 packet。

6、如果传输过程中,有某个 datanode 出现了故障,那么当前的 pipeline 会被关闭,出现故 障的 datanode 会从当前的 pipeline 中移除,剩余的 block 会继续剩下的 datanode 中继续 以 pipeline 的形式传输,同时 namenode 会分配一个新的 datanode,保持 replicas 设定的 数量。

7、客户端完成数据的写入后,会对数据流调用 close()方法,关闭数据流;

8、只要写入了 dfs.replication.min(最小写入成功的副本数)的复本数(默认为 1),写操作 就会成功,并且这个块可以在集群中异步复制,直到达到其目标复本数(dfs.replication 的默认值为 3),因为 namenode 已经知道文件由哪些块组成,所以它在返回成功前只需 要等待数据块进行最小量的复制。

 

9、hdfs读流程

1、客户端调用FileSystem 实例的open 方法,获得这个文件对应的输入流InputStream。

2、通过RPC 远程调用NameNode ,获得NameNode 中此文件对应的数据块保存位置,包括这个文件的副本的保存位置( 主要是各DataNode的地址) 。

3、获得输入流之后,客户端调用read 方法读取数据。选择最近的DataNode 建立连接并读取数据。

4、如果客户端和其中一个DataNode 位于同一机器(比如MapReduce 过程中的mapper 和reducer),那么就会直接从本地读取数据。

5、到达数据块末端,关闭与这个DataNode 的连接,然后重新查找下一个数据块。

6、不断执行第2 - 5 步直到数据全部读完。

7、客户端调用close ,关闭输入流DF S InputStream。

 

 

10、HDFS高可用与联邦

HDFS2.x采用了HA(High Availability高可用)架构。(HDFS HA可看作为NN和SN的优化)

在HA集群中,可设置两个NN,一个处于“活跃(Active)”状态,另一个处于“待命(Standby)”状态。由zookeeper确保一主一备

处于Active状态的NN负责响应所有客户端的请求,处于Standby状态的NN作为热备份节点,保证与active的NN的元数据同步

Active节点发生故障时,zookeeper集群会发现此情况,通知Standby节点立即切换到活跃状态对外提供服务,确保集群一直处于可用状态
 

HDFS HA解决了“单点故障”问题,但HDFS在扩展性、整体性能和隔离性方面仍有问题

  • 系统扩展性方面,元数据存储在NN内存中,受限于内存上限(每个文件、目录、block占用约150字节)
  • 整体性能方面,吞吐量受单个NN的影响
  • 隔离性方面,一个程序可能会影响其他程序的运行,如果一个程序消耗过多资源会导致其他程序无法顺利运行

 

HDFS联邦可以解决以上三个问题

  • 扩展性:HDFS联邦中,设计了多个命名空间;每个命名空间有一个NN或一主一备两个NN,使得HDFS的命名服务能够水平扩展,这些NN分别进行各自命名空间namespace和块的管理,相互独立,不需要彼此协调
  • 整体性:每个DN要向集群中所有的NN注册,并周期性的向所有NN发送心跳信息和块信息,报告自己的状态
  • 隔离性:HDFS联邦每个相互独立的NN对应一个独立的命名空间,(数据节点DN时共享的),每一个命名空间管理属于自己的一组块,这些属于同一命名空间的块对应一个“块池”的概念。,每个DN会为所有块池提供块的存储,块池中的各个块实际上是存储在不同DN中的

11. HDFS小文件处理

HDFS不适合存储小文件的原因:

  • NameNode存储着文件系统的元数据,每个文件、目录、块大概有150字节的元数据;

  • 小文件数量多会大量占用namenode的内存; 使namenode读取元数据速度变慢, 启动时间延长; 还因为占用内存过大, 导致gc时间增加等.

解决办法:两个角度,

  • 一是,从数据来源入手, 如每小时抽取一次改为每天抽取一次等方法来积累数据量.
  • 二是,选择合并.HAR文件方案,Sequence Files方案


如果小文件无可避免, 一般就采用合并的方式解决. 可以写一个MR任务读取某个目录下的所有小文件, 并重写为一个大文件.

SequenceFile文件,是一种由header信息和一条条record记录组成的文件。每个record是键值对形式,小文件名作为当前record的键,小文件的内容作为当前record的值;

 

12、文件快照概念


快照比较常见的应用场景是数据备份,以防一些用户错误或灾难恢复

快照snapshots是HDFS文件系统的,只读的、某时间点的拷贝

可以针对某个目录,或者整个文件系统做快照

创建快照时,block块并不会被拷贝。快照文件中只是记录了block列表和文件大小,不会做任何数据拷贝
 

13.、介绍一下RPC通信的逻辑实现

如上图中,Proxy和Impl是对同一个RPC调用接口的实现类,当Proxy中的接口被调用时,通过Client发送消息到 Server ,Server 会按照标准数据格式进行解析,再调用Server侧的 Impl方法进行执行,并返回结果数据。


14.、fsimage和editlogs是做什么用的?


fsimage文件存储的是Hadoop的元数据文件, 如果namenode发生故障, 最近的fsimage文件会被载入到内存中, 用来重构元数据的最近状态, 再从相关点开始向前执行edit logs文件中记录的每个事务.

文件系统客户端执行写操作时, 这些事务会首先记录到日志文件中.

在namenode运行期间, 客户端对hdfs的写操作都保存到edit文件中, 久而久之就会造成edit文件变得很大, 这对namenode的运行没有影响, 但是如果namenode重启, 它会将fsimage中的内容映射到内存中, 然后再一条一条执行edit文件中的操作, 所以日志文件太大会导致重启速度很慢. 所以在namenode运行的时候就要将edit logs和fsimage定期合并.

15、Linux中的块大小为4KB, 为什么HDFS中块大小为64MB或128MB?


块是存储在文件系统中的数据的最小单元. 如果采用4kb的块大小来存放存储在Hadoop中的数据, 就会需要大量的块, 大大增加了寻找块的时间, 降低了读写效率.
并且, 一个map或者一个reduce都是以一个块为单位处理, 如果块很小, mapreduce任务数就会很多, 任务之间的切换开销变大, 效率降低.

16.、并发写入HDFS文件可行吗?


不行, 因为客户端通过namenode接收到在数据块上写入的许可后, 那个块会锁定直到写入操作完成, 所以不能在同一个块上写入.

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
HDFS(Hadoop分布式文件系统)是Hadoop框架中的分布式文件系统,用于存储和管理大规模数据集。在实验1中,我们将学习如何使用HDFS进行一些常见的操作。 首先,我们需要启动HDFS。通过运行`start-dfs.sh`命令来启动HDFS的所有组件,包括NameNode(负责管理文件系统的命名空间)和DataNode(存储实际的数据块)。 接下来,我们要创建并上传文件HDFS。使用`hdfs dfs -mkdir`命令创建一个新的目录,例如`hdfs dfs -mkdir /user/input/`。然后,使用`hdfs dfs -put`命令将本地文件上传到HDFS中的目录中,例如`hdfs dfs -put input.txt /user/input/`。 在HDFS中,我们可以使用`hdfs dfs -ls`命令列出文件和目录的内容。例如,`hdfs dfs -ls /user/input/`将显示该目录下的所有文件和子目录。 如果我们想要从HDFS下载文件到本地文件系统,可以使用`hdfs dfs -get`命令。例如,`hdfs dfs -get /user/input/input.txt`将从HDFS中下载文件到当前工作目录。 除了上传和下载文件,我们还可以使用`hdfs dfs -cat`命令在终端查看文件的内容。例如,`hdfs dfs -cat /user/input/input.txt`将在终端上显示文件的内容。 最后,当我们不再需要某个文件或目录时,可以使用`hdfs dfs -rm`命令从HDFS中删除它们。例如,`hdfs dfs -rm /user/input/input.txt`将删除HDFS中的文件总结来说,这个实验教会我们如何使用HDFS进行文件和目录的创建、上传、下载和删除操作。这些基本操作是我们在使用Hadoop进行大规模数据处理时的基础。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值