HDFS体系结构与基本概念

HDFS体系结构与基本概念

 

我们通过hadoop shell上传的文件是存放在DataNode的block中,通过linux shell是看不到文件的,只能看到block。

可以一句话描述HDFS:把客户端的大文件存放在很多节点的数据块中。在这里,出现了三个关键词:文件、节点、数据块。HDFS就是围绕着这三个关键词设计的,我们在学习的时候也要紧抓住这三个关键词来学习。

NameNode

作用

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

目录结构

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

clip_image001

图4-51

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

clip_image003

图4-52

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

我们进入linux文件系统,可以看到如图4-53所示的目录结构。

clip_image005

图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所示。

clip_image007

图4-54

类中的属性没有一个是可以存储数据的。

为什么一定要划分为64MB大小呢?因为这是在默认配置文件中设置的,我们查看core-default.xml文件,如图4-55所示。

clip_image009

图4-55

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

副本

副本就是备份,目的当时是为了安全。正是因为集群环境的不可靠,所以才使用副本机制来保证数据的安全性。

副本的缺点就是会占用大量的存储空间。副本越多,占用的空间越多。相比数据丢失的风险,存储空间的花费还是值得的。

那么,一个文件有几个副本合适呢?我们查看hdfs-default.xml文件,如图4-551所示。

clip_image011

图4-551

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

目录结构

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

clip_image013

图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所示。

clip_image015

图4-57

上图中以“blk_”开头的文件就是存储数据的block。这里的命名是有规律的,除了block文件外,还有后缀是“meta”的文件,这是block的源数据文件,存放一些元数据信息。因此,上图中只有2个block文件。

注意:我们从linux磁盘上传一个完整的文件到hdfs中,这个文件在linux是可以看到的,但是上传到hdfs后,就不会有一个对应的文件存在,而是被划分成很多的block存在的。

SecondaryNameNode

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

合并原理

clip_image017

图4-58

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值