ZAKER汽车|HDFS设计思想和相关概念( 二 )


二是因为namenode把元信息存储在内存中 , 一个节点的内存是有限的 。 一个block元信息的内存消耗大约是150byte 。 而存储1亿个block和1亿个小文件都会消耗掉namenode20GB内存 , 哪个适合?当然是1亿个block(大文件)更省内存 。
3)不适合并发写入、文件随机修改
HDFS上的文件只能有一个写者 , 也仅仅支持append操作 , 不支持多用户对同一文件的写操作 , 以及在文件任意位置进行修改 。
二、HDFS设计思想
现在想象一下这种情况:有四个文件0.5TB的file1 , 1.2TB的file2 , 50GB的file3 , 100GB的file4;有7个服务器 , 每个服务器上有10个1TB的硬盘 。
在存储方式上 , 我们可以将这四个文件存储在同一个服务器上(当然大于1TB的文件需要切分) , 我们需要使用一个文件来记录这种存储的映射关系吧 。 用户是可以通过这种映射关系来找到节点硬盘相应的文件的 。 那么缺点也就暴露了出来:
第一、负载不均衡 。 因为文件大小不一致 , 势必会导致有的节点磁盘的利用率高 , 有的节点磁盘利用率低 。
第二、网络瓶颈问题 。 一个过大的文件存储在一个节点磁盘上 , 当有并行处理时 , 每个线程都需要从这个节点磁盘上读取这个文件的内容 , 那么就会出现网络瓶颈 , 不利于分布式的数据处理 。
我们来看看HDFS的设计思想:以下图为例 , 来进行解释 。
ZAKER汽车|HDFS设计思想和相关概念
文章图片
点击添加图片描述(最多60个字)编辑
HDFS将50G的文件file3切成多个Block(存储块) , 每一个Block的大小都是固定的 , 比如128MB , 它把这多个数据块以多副本的行式存储在各个节点上 , 再使用一个文件把哪个块存储在哪些节点上的映射关系存储起来 。 有了这样的映射关系 , 用户读取文件的时候就会很容易读取到 。 每个节点上都有这样的Block数据 , 它会分开网络瓶颈 , 利于分布式计算 , 解决了上面的第二个问题 。 因为每个块的大小是一样的 , 所以很容易实现负载均衡 , 解决了上面的第一个问题 。
三、HDFS相关概念
1、块(Block)概念
在我们熟知的Windows、Linux等系统上 , 文件系统会将磁盘空间划分为每512字节一组 , 我们称之为"磁盘块" , 它是文件系统读写操作的最小单位 。 而文件系统的数据块(Block)一般是磁盘块的整数倍 , 即每次读写的数据量必须是磁盘块的整数倍 。
在传统的文件系统中 , 为了提高磁盘的读写效率 , 一般以数据块为单位 , 而不是以字节为单位 , 比如机械硬盘包含了磁头和转动部件 , 在读取数据时有一个寻道的过程 , 通国转动盘片和移动磁头的位置 , 来找到数据在机械硬盘中的存储位置 , 然后才能进行读写 。 在I/O开销中 , 机械硬盘的寻址时间时最耗时的部分 , 一旦找到第一条记录 , 剩下的顺序读取效率是非常高的 , 因此以块为单位读写数据 , 可以把磁盘寻道时间分摊到大量数据中 。
HDFS同样引入了块(Block)的概念 , 块是HDFS系统当中的最小存储单位 , 在hadoop2.0中默认大小为128MB 。 在HDFS上的文件会被拆分成多个块 , 每个块作为独立的单元进行存储 。 多个块存放在不同的DataNode上 , 整个过程中HDFS系统会保证一个块存储在一个数据节点上 。 但值得注意的是如果某文件大小或者文件的最后一个块没有到达128M , 则不会占据整个块空间 。
当然块大小可以在配置文件中hdfs-default.xml中进行修改(此值可以修改)
HDFS中的NameNode会记录文件的各个块都存放在哪个dataNode上 , 这些信息一般也称为元信息(MetaInfo) 。 元信息的存储位置一般由dfs.namenode.name.dir来指定 。
而datanode是真实存储文件块的节点 , 块在datanode的位置一般由dfs.datanode.data.dir来指定 。