前面简单介绍了hadoop生态圈,大致了解hadoop是什么、能做什么。带着这些目的我们深入的去学习他。今天一起看一下hadoop的基石—-文件存储。因为hadoop是运行与集群之上,处于分布式环境之中,所以他的文件存储也不同与普通的本地存储,而是分布式存储系统,HDFS(The Hadoop Distributed File System)。

因为数据量越来越大,一台机器管理的磁盘数量是有限的,所有的数据由很多台机器管理。那么对于这么多台机器管理的数据如何进行协调处理呢?这个时候分布式文件管理系统就出现了。分布式文件系统是一种允许文件通过网络在多台主机上分享的 文件的系统,可让多机器上的多用户分享文件和存储空间。现有的分布式文件系统种类很多:CEPH,glusterfs,moosefs,mogilefs ,fastDFS(国人在mogileds基础上改写的),Lustre等等。我们今天要学的HDFS只是分布式文件管理系统的一种,触类旁通,学会了一种其余的都好解除。HDFS的使用场景:适用于一次写入、多次查询的情况,不支持并发写情况,小文件不合适。因为小文件也占用一个块,小文件越多(1000个1k文件)块越 多,NameNode压力越大。

我们借用官方的HDFS结构图:

(解释一下图中的一些词:

Rack 是指机柜的意思,一个block的三个副本通常会保存到两个或者两个以上的机柜中(当然是机柜中的服务器),这样做的目的是做防灾容错,因为发生一个机柜掉电或者一个机柜的交换机挂了的概率还是蛮高的。

数据块(block):HDFS(Hadoop Distributed File System)默认的最基本的存储单位是64M的数据块。HDFS中,如果一个文件小于一个数据块的大小,并不占用整个数据块存储空间。从上图中看,一个文件被分成一个或多个Block,存储在一组Datanode上)

HDFS主要由三个部分组成:namenode,datanode,secondaryNamenode.

这三者的关系简单理解就是:

namenode是主人,颐指气使;

datanode是丫鬟们,为主子服务;

secondarynamenode就是那个天天跟着主人后面的太监为主子发号命令的;

下面我们分别介绍三者。

1 namenode

NameNode的作用是 管理文件目录结构,接受用户的操作请求,是管理数据节点的。名字节点维护两套数据:

一套 是文件 目录与数据块之间的关系

另一套 是 数据块与节点之间的关系 。

前一套 数据是 静态的 ,是存放在磁盘上的, 通过fsimage和edits文件来维护 ;

后一套 数据是 动态的 ,不持久放到到磁盘的,每当集群启动的时候,会自动建立这些信息,所以一般都放在内存中。

内存的数据主要是一些元数据信息,元数据信息就像是一个索引信息,通过索引可以轻松的找到需求的数据的位置包括副本位置;元数据的存在主要是为了便于读取hdfs中的数据。

硬盘中的数据比较多,最新格式化的namenode会生成以下文件目录结构:

VERSION 记载了一些namenode的基础信息,其中有一个namespaceID,这是这个namenode的唯一标示。edits是hdfs的日志文件,这里记录着namenode上的一些读写操作,这是namenode储存的第一个重要的信息,它记录了近期的所有操作记录以及操作状态和操作内容.fsimage是namenode的存在内存中的元数据在硬盘上的镜像文件,但镜像文件并不是与matadata(元数据)同步的,在达到一定条件fsimage会执行更新操作来保持和内存中的元数据信息保持一致,而执行这个镜像同步操作的凭据就是edits。stime,镜像生成或者修改时间.

namenode主要涉及到的就是读和写操作,其中都比较简单(相对),写则会有一个过程,我们先看读:

读文件过程:

1.客户端(Client)用FileSystem的open()函数打开文件。

2.DistributedFileSystem用RPC调用元数据节点,得到文件的数据块信息。

对于每一个数据块,元数据节点返回保存数据块的数据节点的地址。

3.DistributedFileSystem返回FSDataInputStream给客户端,用来读取数据。

4.客户端调用stream的read()函数开始读取数据。

5.DFSInputStream连接保存此文件第一个数据块的最近的数据节点。

6.Data从数据节点读到客户端(client)

7.当此数据块读取完毕时,DFSInputStream关闭和此数据节点的连接,然后连接此文件下一个数据块的最近的数据节点。

8.当客户端读取完毕数据的时候,调用FSDataInputStream的close函数。

在读取数据的过程中,如果客户端在与数据节点通信出现错误,则尝试连接包含此数据块的下一个数据节点。

失败的数据节点将被记录,以后不再连接。

看来看写文件:

1.客户端调用create()来创建文件

2.DistributedFileSystem用RPC调用元数据节点,在文件系统的命名空间中创建一个新的文件。

3.元数据节点首先确定文件原来不存在,并且客户端有创建文件的权限,然后创建新文件。

4.DistributedFileSystem返回DFSOutputStream,客户端用于写数据。

5.客户端开始写入数据,DFSOutputStream将数据分成块,写入data queue。

6.Data queue由Data Streamer读取,并通知元数据节点分配数据节点,用来存储数据块(每块默认复制3块)。分配的数据节点放在一个pipeline里。

7.Data Streamer将数据块写入pipeline中的第一个数据节点。第一个数据节点将数据块发送给第二个数据节点。第二个数据节点将数据发送给第三个数据节点。

8.DFSOutputStream为发出去的数据块保存了ack queue,等待pipeline中的数据节点告知数据已经写入成功。

如果数据节点在写入的过程中失败:

1.关闭pipeline,将ack queue中的数据块放入data queue的开始。

2.当前的数据块在已经写入的数据节点中被元数据节点赋予新的标示,则错误节点重启后能够察觉其数据块是过时的,会被删除。

3.失败的数据节点从pipeline中移除,另外的数据块则写入pipeline中的另外两个数据节点。

4.元数据节点则被通知此数据块是复制块数不足,将来会再创建第三份备份。

5.当客户端结束写入数据,则调用stream的close函数。此操作将所有的数据块写入pipeline中的数据节点,并等待ack queue返回成功。最后通知元数据节点写入完毕。

2 DataNode

Datanode 将 HDFS 数据以文件的形式存储在本地的文件系统中,它并不知道有 关 HDFS 文件的信息。它把每个 HDFS 数据块存储在本地文件系统的一个单独的文件 中。 Datanode 并不在同一个目录创建所有的文件,实际上,它用试探的方法来确定 每个目录的最佳文件数目,并且在适当的时候创建子目录。在同一个目录中创建所 有的本地文件并不是最优的选择,这是因为本地文件系统可能无法高效地在单个目 录中支持大量的文件。

当一个 Datanode 启动时,它会扫描本地文件系统,产生一个这些本地文件对应 的所有 HDFS 数据块的列表,然后作为报告发送到 Namenode ,这个报告就是块状态 报告。

3 Secondary NameNode

SecondaryNameNode不是说NameNode挂了的备用节点

。他的主要功能只是定期合并日志, 防止日志文件变得过大

。合并过后的镜像文件在NameNode上也会保存一份。

secondaryname作为一个附庸,其实它也一直在工作,他的工作就是解决matadata和fsimage之间的不和谐(不一致),这里为神马会使用到secondarynamenode来帮助namenode来管理namenode,原因是因为namenode不断的写,会产生大量的日志,若namenode重启,那么加载这些日志文件就会消耗大量的时间,而采用secondarynamenode处理过edits和faimage后,edits的大小始终保持一个比较小的水平,那么naemnode就算重启也可以快速启动而且保持前面的状态。

我们来看一下secondaryNameNode是如何工作的:

  1. namenode 响应 Secondary namenode 请求,将 edit log 推送给 Secondary namenode , 开始重新写一个新的 edit log
  2. Secondary namenode 收到来自 namenode 的 fsimage 文件和 edit log
  3. Secondary namenode 将 fsimage 加载到内存,应用 edit log , 并生成一 个新的 fsimage 文件
  4. Secondary namenode 将新的 fsimage 推送给 Namenode
  5. Namenode 用新的 fsimage 取代旧的 fsimage , 在 fstime 文件中记下检查 点发生的时

关于hdfs的机制我们先简单介绍这么多,用多少先学多少等到后面接触的时候我们继续深入学习。

hadoop学习(二)----HDFS简介及原理的更多相关文章

  1. HADOOP docker(二):HDFS 高可用原理

        1.环境简述2.QJM HA简述2.1为什么要做HDFS HA?2.2 HDFS HA的方式2.2 HSFS HA的结构2.3 机器要求3.部署HDFS HA3.1 详细配置3.2 部署HDF ...

  2. 【转载】Hadoop分布式文件系统HDFS的工作原理详述

    转载请注明来自36大数据(36dsj.com):36大数据 » Hadoop分布式文件系统HDFS的工作原理详述 转注:读了这篇文章以后,觉得内容比较易懂,所以分享过来支持一下. Hadoop分布式文 ...

  3. hadoop学习(五)----HDFS的java操作

    前面我们基本学习了HDFS的原理,hadoop环境的搭建,下面开始正式的实践,语言以java为主.这一节来看一下HDFS的java操作. 1 环境准备 上一篇说了windows下搭建hadoop环境, ...

  4. Hadoop学习笔记-HDFS命令

    进入 $HADOOP/bin 一.文件操作 文件操作 类似于正常的linux操作前面加上“hdfs dfs -” 前缀也可以写成hadoop而不用hdfs,但终端中显示 Use of this scr ...

  5. Hadoop分布式文件系统HDFS的工作原理

    Hadoop分布式文件系统(HDFS)是一种被设计成适合运行在通用硬件上的分布式文件系统.HDFS是一个高度容错性的系统,适合部署在廉价的机器上.它能提供高吞吐量的数据访问,非常适合大规模数据集上的应 ...

  6. Hadoop学习笔记—HDFS

    目录 搭建安装 三个核心组件 安装 配置环境变量 配置各上述三组件守护进程的相关属性 启停 监控和性能 Hadoop Rack Awareness yarn的NodeManagers监控 命令 hdf ...

  7. Hadoop学习笔记---HDFS

    Hadoop分布式文件系统(HDFS)被设计成适合运行在通用硬件(commodity hardware)上的分布式文件系统.HDFS是一个高度容错性的系统,适合部署在廉价的机器上.HDFS能提供高吞吐 ...

  8. hadoop学习之HDFS原理

    HDFS原理 HDFS包括三个组件: NameNode.DataNode.SecondaryNameNode NameNode的作用是存储元数据(文件名.创建时间.大小.权限.与block块映射关系等 ...

  9. hadoop学习之HDFS

    1.什么是大数据?什么是云计算?什么是hadoop? 大数据现在很火,到底什么是大数据,多大的数据才算大,一般而言对于TB级以上的数据我们成为大数据,对于这些数据它的价值在哪?大数据的价值就是我们大量 ...

随机推荐

  1. C#实体是什么

    实体 一般是指三层结构的数据库访问形式中,用于映射数据表或视图中一条记录的类的实例.例如现有数据表A 内涵 ID int(4) Info(nvarchar 50)两个字段,而有其对应的类 public ...

  2. linuxprobe培训第2节课笔记2019年7月6日

    使用VM虚拟机配置RHEL实验环境. 鉴于在笔记本上装过centos7,这章内容难度对我来说不是很大. 重置root管理员密码(RHCSA考题,第一题,做不出来无法进行下一步考试) e linux16 ...

  3. 自我救赎 → 利用 IDEA 和 Spring Boot 搭建 SSM

    前言 开心一刻 儿子读高中放学回来了,一向不管他学习的我突然来了兴趣,想看看他的学习他的状况,抄起他的数学习题看了起来,当看到 1 x 2 x 3 x 4 x 5 x 6 x 7 x 8 x 9 x ...

  4. CTSC&APIO被教做人记

    DAY 0: 早早起来从衡水出发,在去火车站的路上明白了HZOI总是差点误车的真相……上了绿皮火车之后由于没网没流量就开始看政治书应付学考,然而并不是很能看进去,感觉初中学的比高中学的不知道高到哪里去 ...

  5. 使用R语言预测产品销量

    使用R语言预测产品销量 通过不同的广告投入,预测产品的销量.因为响应变量销量是一个连续的值,所以这个问题是一个回归问题.数据集共有200个观测值,每一组观测值对应一种市场情况. 数据特征 TV:对于一 ...

  6. 【题解】长度为素数的路径个数-C++

    Description 对于正整数n (3≤n<20),可以画出n阶的回形矩阵.下面画出的分别是3阶的,4阶的和7阶的回形矩阵: 对于n阶回形矩阵,从左上角出发,每步可以向右或向下走一格,走2* ...

  7. vs断点命不中?

    用管理员权限打开vs,再打开工程即可

  8. HTTPS协议学习笔记

    在前一段时间准备面试的时候,面试官反复提到了HTTPS这个协议.我只是单纯的知道,HTTPS是安全的应用层协议 是HTTP更安全的版本,通过对称密钥加密.但是具体的其他的,可能我不太了解.今天就专门抽 ...

  9. springboot3(目录结构)

    2.springboot中的目录结构 1.基本信息 - static :保存所有的静态资源,css.js.img - templates :保存所有的模版页面(springboot内嵌tomcat,默 ...

  10. docker实战(二)之redis的使用

    docker中安装redis的步骤比较简单,Linux系统版本centos7.4 1.官方仓库https://hub.docker.com/r/library/redis/tags/中查看redis的 ...