HDFS 体系结构与基本概念

4.3. HDFS 体系结构与基本概念
我们通过 hadoop shell 上传的文件是存放在 DataNode block 中,通过 linux shell 是看
不到文件的,只能看到 block
可以一句话描述 HDFS: 把客户端的大文件存放在很多节点的数据块中。在这里,出现
了三个关键词:文件、节点、数据块。 HDFS 就是围绕着这三个关键词设计的,我们在学习
的时候也要紧抓住这三个关键词来学习。
4.3.1. NameNode
4.3.1.1. 作用
NameNode 的作用是管理文件目录结构,是管理数据节点的。名字节点维护两套数据,
一套是文件目录与数据块之间的关系, 一套是数据块与节点之间的关系。 前一套数据是静
态的,是存放在磁盘上的,通过 fsimage edits 文件来维护;后一套数据是动态的,不持
久化到磁盘的,每当集群启动的时候,会自动建立这些信息。
4.3.1.2. 目录结构
既然 NameNode 维护了这么多的信息, 那么这些信息都存放在哪里呢呐?在 hadoop 源代码
中有个文件叫做 core-default.xml

打开这个文件,在第 149 行和第 158 行,有两个配置信息,一个是 dfs.name.dir, 另
一个是 dfs.name.edits.dir。这两个文件表示的是 NameNode 的核心文件 fsimage 和 edits
的存放位置,如图 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.3.2. DataNode
4.3.2.1. 作用
DataNode 的作用 是 HDFS 中真正存储数据的。
4.3.2.2. block
如果一个文件非常大, 比如 100GB, 那么是怎么存储在 DataNode 中哪呢? DataNode 在
存储数据的时候是按照 block 为单位读写数据的。 block 是 hdfs 读写数据的基本单位。
假设文件大小是 100GB,从字节位置 0 开始,每 64MB 字节划分为一个 block, 以依此
类推,可以划分出很多的 block。每个 block 就是 64MB 大小。
block 本质上是一个逻辑概念,意味着 block 里面不会真正的存储数据,只是划分文件
的。
我们看一下 org.apache.hadoop.hdfs.protocol.Block 类,这里面的属性有以下几个,如图
4-54 所示。

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

上图中的参数 ds.block.name 指的就是 block 的大小, 值是 67 108 864 字节, 可以换算为
64MB。如果我们不希望使用 64MB 大小,可以在 core-site.xml 中覆盖该值。注意单位是字
节。
4.3.2.3. 副本
副本就是备份, 目的当时是为了安全。 正是因为集群环境的不可靠, 所以才使用副本机
制来保证数据的安全性。
副本的缺点就是会占用大量的存储空间。 副本越多, 占用的空间越多。 相比数据丢失的
风险,存储空间的花费还是值得的。
那么, 一个文件有几个副本合适哪呢?我们查看 hdfs-default.xml 文件, 如图 4-551 所示。

从图 4-551 中可以看到, 默认的副本数量是 3。 意味着 HDFS 中的每个数据块都有 3 份。
当然, 每一份肯定会尽力分配在不同的 DataNode 服务器中。 试想: 如果备份的 3 份数据都
在同一台服务器上,那么这台服务器停机了,是不是所有的数据都丢了啊。?
4.3.2.4. 目录结构
既然 DataNode 的 block 是划分文件并,那么划分后的文件到底存放在哪里哪?我们查
看文件 core-default.xml,如图 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 所示。

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

SNN 只有一个职责,就是合并 NameNode 中的 edits 到 fsimage 中。
4.3.3.1. 合并原理

4.4. HDFS 的 web 接口
HDFS 对外提供了可供访问的 http server,开放了很多端口,下面介绍常用的几个端口。
 50070 端口,查看 NameNode 状态,如图 4-59 所示。

该端口的定义位于 core-default.xml 中,如图 4-60 所示,读者可以在 core-site.xml 中自
行修改。

如果读者通过该端口看着这个页面,以为着 NameNode 节点是存活的。
 50075 端口,查看 DataNode 的,如图 4-61 所示。

该地址和端口的定义位于 hdfs-default.xml 中, 如图 4-62 所示, 读者可以在 hdfs-site.xml中自行修改。

 

 50090 端口,查看 SecondaryNameNode 的
 50030 端口,查看 JobTracker 状态的,如图 4-63 所示。

该端口定义在 mapred-default.xml 中, 如图 4-64, 读者可以在 mapred-site.xml 中自行修改

 

50060 端口,查看 TaskTracker,如图 4-65 所示。

该端口定义位于 mapred-default.xml,如图 4-66,读者可以在 mapred-site.xml 中自行修改。

 

posted @ 2016-04-17 11:40  Runny_Hao  阅读(203)  评论(0)    收藏  举报