HDFS 主从结构以及读写策略探究,hdfs主从读写探究


一、HDFS的一些基本概念: 
数据块(block):大文件会被分割成多个block进行存储,block大小默认为64MB。每一个block会在多个datanode上存储多份副本,默认是3份。

namenode:namenode负责管理文件目录、文件和block的对应关系以及block和datanode的对应关系。

datanode:datanode就负责存储了,当然大部分容错机制都是在datanode上实现的。


二、主从结构

HDFS采用的是基于Master/Slave主从架构的分布式文件系统,一个HDFS集群包含一个单独的Master节点和多个Slave节点服务器,这里的一个单独的Master节点的含义是HDFS系统中只存在一个逻辑上的Master组件。一个逻辑的Master节点可以包括两台物理主机,即两台Master服务器、多台Slave服务器。一台Master服务器组成单NameNode集群,两台Master服务器组成双NameNode集群,并且同时被多个客户端访问,所有的这些机器通常都是普通的Linux机器,运行着用户级别(user-level)的服务进程。


HDFS只有一个NameNode,即master。master负责管理文件系统命名空间和client对文件的访问。此外,HDFS有很多DataNode,通常一个机器节点一个DataNode,管理这个节点上的存储。HDFS对外提供一个文件系统名字空间允许用户把数据存为文件的格式

 


NameNode负责保存和管理所有的HDFS元数据,因而用户数据就不需要通过NameNode,也就是说文件数据的读写是直接在DataNode上进行的。HDFS存储的文件都被分割成固定大小的Block,在创建Block的时候,NameNode服务器会给每个Block分配一个唯一不变的Block标识。DataNode服务器把Block以Linux文件的形式保存在本地硬盘上,并且根据指定的Block标识和字节范围来读写块数据。出于可靠性的考虑,每个块都会复制到多个DataNode服务器上。在默认情况下,HDFS使用三个冗余备份,当然用户可以为不同的文件命名空间设定不同的复制因子数。NameNode管理所有的文件系统元数据。这些元数据包括名称空间、访问控制信息、文件和Block的映射信息,以及当前Block的位置信息。NameNode还管理着系统范围内的活动,比如,Block租用管理、孤立Block的回收,以及Block在DataNode服务器之间的迁移。NameNode使信息周期性地和每个DataNode服务器通信,发送指令到各个DataNode服务器并接收DataNode中Block的状态信息。


概括为:

NameNode操作名字空间比如:打开,关闭,重命名文件目录。

 NameNode只负责元数据信息,没有数据流。

 NameNode维护名字空间,任何对文件系统名字空间的改动都记录在NameNode。系统的文件组织结构和Linux非常类似。你可以创建,删除,移动,重命名文件或者目录

文件拆分成若干个block,这些block存放在DataNode节点上。

DataNode负责为文件系统的客户提供读/写操作服务。DataNode同时还为NameNode提供block创建,删除,备份机制


三、HDFS读取文件操作: 

客户端发起读文件请求,向NameNode发送请求(当然还有第二个NameNode),由于NameNode存放着DataNode的信息,比如说数据块的存放信息等,所以NameNode会向客户端返回元数据,这些元数据包含了数据块的信息等。客户端得到元数据后直接去读取数据块,实现了文件的读取。

四、HDFS写文件操作: 

客户端得到文件后将文件进行分块,这些分块的数据信息会写入NameNode,同时复制到SecondaryNameNode ,然NameNode会告诉客户端DataNode的情况,比如该如何写啊,哪个数据块放在哪等等。客户端得到这些信息后就向DataNode开始写数据(以数据块的格式),然后DataNode会以流水线方式复制,因为要保证数据有3份嘛,这些操作完成之后会把DataNode的最新信息反馈到NameNode。再有数据来的时候按照上述过程流式进行。

5、使用HDFS的注意点: 
(1)流式数据访问,就是一次写入,多次读取。不可以修改数 据,只能删除。 
(2)保证数据块尽量大,这样NaeNode的压力会较小。 
(3)由于是磁盘读写,延迟必定会高,做好心理准备,如果你要求实时响应的要求较高,可以使用Spark。毕竟内存中读取数据比从磁盘读取要快很多。(前提是你有个大内存)

相关内容

    暂无相关文章