【Hdfs】分布式储存系统

    hdfs是一种分布式应用底层框架,并非单纯用于储存,它是分布式数据储存的基础,具有高容错性、高可靠性、高可扩展性、高获得性、高吞吐率等特征。为超大数据集的应用处理带来了极大的便利,旨在解决文件的存放、安全性、文件调用效率三大问题。为了保证容错性和可用性,hdfs采用多副本方式对数据惊喜冗余储存,这种方式使得数据传输速度更快、数据的错误更容易发现、数据也更可靠。由于hdfs的特殊设计,使得hdfs有自己的局限性,比如不适合低延时数据访问、无法高效储存小文件数据、不支持多用户对数据进行写入及任意修改。下面来看看hdfs的结构:

hdfs结构

    hdfs的结构有两类:master node(name node)、slave node (data node)。
    master节点(name node),管理文件系统空间名称;控制客服端访问文件;执行文件系统操作(如重命名、删除、打开等)。在内存中储存元数据、保存文件、block、datanode之间的映射关系。
    master保存两个核心的数据结构Fsimage+Esitlog。Fsimage用于维护系统树及文件树中所有文件和文件夹的元数据;Esitlog记录了所有针对于文件的创建、删除、重命名等操作。
    master节点还记录了每个文件夹中各个块所在数据节点的位置信息。

    Fsimage文件包含文件系统中所有目录和文件inode的序列化形式。每个inode是一个文件或目录的元数据的内部表示并包含此类信息:文件的复制等级、修改和访问时间、访问权限、块大小以及组成文件的块。对于目录,则存储修改时间、权限和配额元数据。Fsimage文件没有记录块存储在哪个数据节点。而是由名称节点把这些映射保留在内存中,当数据节点加入HDFS集群时,数据节点会把自己所包含的块列表告知给名称节点此后会定期执行这种告知操作,以确保名称节点的块映射是最新的。

master节点:
●在名称节点启动的时候,它会将Fslmage文件中的内容加载到内存中,之后再执行EditLog文件中的各项操作,使得内存中的元数据和实际的同步,存在内存中的元数据支持客户端的读操作。
●一旦在内存中成功建立文件系统元数据的映射,则创建-一个新的FsImage文件和-一个空的EditLog文件。
●名称节点起来之后,HDFS中的更新操作会重新写到EditLog文件中,因为Fslmage文件- - 般都很大(GB级别的很常见),如果所有的更新操作都往Fslmage文件中添加,这样会导致系统运行的十分缓慢,但是,如果往EditLog文件里面写就不会这样,因为EditLog要小很多。每次执行写操作之后,且在向客户端发送成功代码之前,edits文件都需要同步更新。

    slave节点 (data node),管理所储存的数据,按照客户端请求执行在文件系统上的读写,根据namenode的指令,执行如block的创建、删除、备份等操作。(block:用户的数据储存在hdfs中,会被拆分成一个或多个片,并储存在单个数据节点上,那么这些文件片就是block,是hdfs可读写的最小量,默认大小64/128M)保存文件内容、文件储存在磁盘上、维护block id到datanode本地文件的映射关系。
slave节点:
●数据节点是文件系统中真正存储数据的地方。
●客户端(client)或者元数据信息(namenode)可以向数据节点请求写入或者读出数据块。
●其周期性的(1小时)向元数据节点汇报其存储的数据块信息。
●一个 数据块在DataNode以文件存储在磁盘上,包括两个文件,一个是数据本身,一个是元数据(包括数据块的长度,块数据的校验和,以及时间戳)
●DataNode 启动后向NameNode注册,通过后,周期性(1小时)的向NameNode.上报所有的块信息。
●心跳是每3秒一次, 心跳返回结果带有NameNode给该DataNode的命令,如复制块数据到另一-台机器,或删除某个数据块。如果超过10分钟没有收到某个DataNode的心跳,则认为该节点不可用。
●集群运行中可以安全加入和退出一-些机器


HDFS默认一个块128MB,一个文件被分成多个块,以块作为存储单位块的大小远远大于普通文件系统,可以最小化寻址开销HDFS采用抽象的块概念可以带来以下几个明显的好处:
●支持大规模文件存储:文件以块为单位进行存储,-一个大规模文件可以被分拆成若干个文件块,不同的文件块可以被分发到不同的节点上,因此,-个文件的大小不会受到单个节点的存储容量的限制,可以远远大于网络中任意节点的存储容量简化系统设计:首先,大大简化了存储管理,因为文件块大小是固定的,这样就可以很容易计算出一个节点可以存储多少文件块:其次方便了元数据的管理,元数据不需要和文件块一起存, 可以由其他系统负责管理元数据
●适合数据备份:每个文件块都可以冗余存储到多个节点上,大大
提高了系统的容错性和可用性
文件
●HDFS中的文件概念和与单磁盘文件系统相似,数据按照文件存储在集群中,由HDFS统–管理。
●用户可以创建、删除、移动或重命名文件,当文件创建、写入和关闭之后不能修改文件内容。
第二名称节点
名称节点运行期间EditLog不断变大的问题
●在名称节点运行期间,HDFS的所有更新操作都是直接写到EditLog中,久而久之,EditLog文件将 会变得很大
●虽然这对名称节点运行时候是没有什么明显影响的,但是,当名称节点重启的时候,名称节点需要先将FsImage里面的所有内容映像到内存中,然后再一条一条地执行EditLog中的记录,当EditLog 文件非常大的时候,会导致名称节点启动操作非常慢,而在这段时间内HDFS系统处于安全模式,一直无法对外提供写操作,影响了用户的使用。如何解决?答案是: SecondaryNameNode第二名称节点,第二名称节点是HDFS架构中的一个组成部分,它是用来保存名称节点中对HDFS元数据信息的备份,并减少名称节点重启的时间。SecondaryNameNode- 般是单独运行在一台机器上。
错误与数据恢复
HDFS具有较高的容错性,可以兼容廉价的硬件,它把硬件出错看作一种常态,而不是异常,并设计了相应的机制检测数据错误和进行自动恢复,主要包括以下几种情形:名称节点出错、数据节点出错和数据出错。

1.名称节点出错
名称节点保存了所有的元数据信息,其中,最核心的两大数据结构是Fslmage和Editlog,如果这两个文件发生损坏,那么整个HDFS实例将失效。因此,HDFS设置了备份机制,把这些核心文件同步复制到备份服务器SecondaryNameNode上。当名称节点出错时,就可以根据备份服务器SecondaryNameNode中的FsIlmage和Editlog数据进行恢复。

2.数据节点出错
●每个数据节点会定期向名称节点发送“心跳”信息,向名称节点报告自己的状态
●当数据节点发生故障,或者网络发生断网时,名称节点就无法收到来自一些数据节点的心跳信息,这时,这些数据节点就会被标记为“宕机”,节点上面的所有数据都会被标记为“不可读,名称节点不会再给它们发送任何I/O请求
●这时,有可能出现一种情形,即由于- -些数据节点的不可用,会导致一些数据块的副本数量小于冗余因子
●名称节点会定期检查这种情况,- "旦发现某个数据块的副本数量小于冗余因子,就会启动数据冗余复制,为它生成新的副本.HDFS和其它分布式文件系统的最大区别就是可以调整冗余数据的位置

3.数据出错
●网络传输和磁盘错误等因素,都会造成数据错误
●客户端在读取到数据后,会采用md5和sha1对数据块进行校验,以确定读取到正确的数据
●在文件被创建时,客户端就会对每一个文件块进行信息摘录,并把这些信息写入到同一个路径的隐藏文件里面当客户端读取文件的时候,会先读取该信息文件,然后,利用该信息文件对每个读取的数据块进行校验,如果校验出错客户端就会请求到另外-一个数据节点读取该文件块,并且向名称节点报告这个文件块有错误,名称节点会定期检查并且重新复制这个块

hdfs指令操作

    hdfs的操作命令与linux类似,唯一不同的是需要小启动集群:hdfs-dfs.sh。文件操作命令:hdfs dfs -+linux命令。笔者习惯用hdfs dfs,所以这里就只提及了hdfs dfs。

发布了39 篇原创文章 · 获赞 42 · 访问量 4855

猜你喜欢

转载自blog.csdn.net/weixin_41774099/article/details/103218441