HDFS体系结构与基本概念

来源:互联网 发布:linux服务器硬盘测试 编辑:程序博客网 时间:2024/05/22 23:58
我们通过hadoop shell上传的文件是存放在DataNode的block中,通过linux shell是看不到文件的,只能看到block。
可以一句话描述HDFS:把客户端的大文件存放在很多节点的数据块中。在这里,出现了三个关键词:文件、节点、数据块。HDFS就是围绕着这三个关键词设计的,我们在学习的时候也要紧抓住这三个关键词来学习。

NameNode作用NameNode的作用是管理文件目录结构,是管理数据节点的。名字节点维护两套数据,一套是文件目录与数据块之间的关系,另一套是数据块与节点之间的关系。前一套数据是静态的,是存放在磁盘上的,通过fsimage和edits文件来维护;后一套数据是动态的,不持久化到磁盘的,每当集群启动的时候,会自动建立这些信息。

目录结构既然NameNode维护了这么多的信息,那么这些信息都存放在哪里呢?在hadoop源代码中有个文件叫做core-default.xml,如图4-51所示。

图4-51
打开这个文件,在第149行和第158行,有两个配置信息,一个是dfs.name.dir,另一个是dfs.name.edits.dir。这两个文件表示的是NameNode的核心文件fsimage和edits的存放位置,如图4-52所示。

图4-52
在对应配置的value值有${},这是变量的表示方式,在程序读取文件时,会把变量的值读取出来。那么,第150行的变量hadoop.tmp.dir的值是在我们上一章的配置文件core-site.xml中配置的,值是/usr/local/hadoop/tmp。可以看出,这两个文件的存储位置是在linux文件系统的/usr/local/hadoop/tmp/dfs/name目录下。
我们进入linux文件系统,可以看到如图4-53所示的目录结构。

图4-53

4.1.2. DataNode作用DataNode的作用是HDFS中真正存储数据的。

block如果一个文件非常大,比如100GB,那么怎么存储在DataNode中呢?DataNode在存储数据的时候是按照block为单位读写数据的。block是hdfs读写数据的基本单位。
假设文件大小是100GB,从字节位置0开始,每64MB字节划分为一个block,依此类推,可以划分出很多的block。每个block就是64MB大小。
block本质上是一个逻辑概念,意味着block里面不会真正的存储数据,只是划分文件的。
我们看一下org.apache.hadoop.hdfs.protocol.Block类,这里面的属性有以下几个,如图4-54所示。

图4-54
类中的属性没有一个是可以存储数据的。
为什么一定要划分为64MB大小呢?因为这是在默认配置文件中设置的,我们查看core-default.xml文件,如图4-55所示。

图4-55
上图中的参数ds.block.name指的就是block的大小,值是67 108 864字节,可以换算为64MB。如果我们不希望使用64MB大小,可以在core-site.xml中覆盖该值。注意单位是字节。

副本副本就是备份,目的当时是为了安全。正是因为集群环境的不可靠,所以才使用副本机制来保证数据的安全性。
副本的缺点就是会占用大量的存储空间。副本越多,占用的空间越多。相比数据丢失的风险,存储空间的花费还是值得的。
那么,一个文件有几个副本合适呢?我们查看hdfs-default.xml文件,如图4-551所示。

图4-551
从图4-551中可以看到,默认的副本数量是3。意味着HDFS中的每个数据块都有3份。当然,每一份肯定会尽力分配在不同的DataNode服务器中。试想:如果备份的3份数据都在同一台服务器上,那么这台服务器停机了,是不是所有的数据都丢了啊?

目录结构既然DataNode的block是划分文件并,那么划分后的文件到底存放在哪里哪?我们查看文件core-default.xml,如图4-56所示。

图4-56
参数dfs.data.dir的值就是block存放在linux文件系统中的位置。变量hadoop.tmp.dir的值前面已经介绍了,是/usr/local/hadoop/tmp,那么dfs.data.dir的完整路径是/usr/local/hadoop/tmp/dfs/data。通过linux命令查看,结果如图4-57所示。

图4-57
上图中以“blk_”开头的文件就是存储数据的block。这里的命名是有规律的,除了block文件外,还有后缀是“meta”的文件,这是block的源数据文件,存放一些元数据信息。因此,上图中只有2个block文件。
注意:我们从linux磁盘上传一个完整的文件到hdfs中,这个文件在linux是可以看到的,但是上传到hdfs后,就不会有一个对应的文件存在,而是被划分成很多的block存在的。

SecondaryNameNodeSNN只有一个职责,就是合并NameNode中的edits到fsimage中。

[url=]合并原理[/url]
原创粉丝点击