Big Data>HDFS讲义(1)

本文详细介绍了Hadoop的HDFS(Hadoop Distributed File System),讲解了其基本概念、文件系统组成、HDFS的分块存储机制、副本存放策略、NameNode和DataNode的功能以及HDFS的文件读写流程。HDFS通过块抽象存储文件,以实现高可靠性和高吞吐量的数据存储,特别适合大数据存储和分析场景。
摘要由CSDN通过智能技术生成

  • Hadoop组成
    Hadoop HDFS:一个高可靠、高吞吐量的分布式文件系统,对海量数据的存储。
    Hadoop MapReduce:一个分布式的资源调度和离线并行计算框架。
    Hadoop Yarn:基于HDFS,用于作业调度和集群资源管理的框架。
    Hadoop Common:Hadoop工具包,支持其他模块的工具模块(Configuration、RPC、序列化机制、日志操作)
    在这里插入图片描述

1、 Hadoop的文件系统介绍

  • HDFS 基本介绍
    HDFS 是 Hadoop Distribute File System 的简称,意为:Hadoop 分布式文件系统。是 Hadoop 核心组件之一,作为最底层的分布式存储服务而存在。
    分布式文件系统解决的问题就是大数据存储。它们是横跨在多台计算机上的存储系统。分布式文件系统在大数据时代有着广泛的应用前景,它们为存储和处理超大规模数据提供所需的扩展能力
    在这里插入图片描述
    HDFS使用Master和Slave结构对集群进行管理。一般一个 HDFS 集群只有一个 Namenode 和一定数目的Datanode 组成。Namenode 是 HDFS 集群主节点,Datanode 是 HDFS 集群从节点,两种角色各司其职,共同协调完成分布式的文件存储服务
  • 总结
    理解: 将多个节点的容量汇总到一起拼接成一个大的文件系统,在一个节点上传数据,在其他的节点上都能够访问使用

在这里插入图片描述

hadoop 的组成部分

NameNode(Master)管理者
作用
1.只负责管理,管理集群内各个节点。
2.负责管理整个文件系统的元数据(指的是数据的存放位置或存放路径)或名字空间

  • SecondaryNameNode 辅助管理
    作用
    1.只负责辅助NameNode管理工作。

  • DataNode(Slave) 工作者
    作用
    1.负责工作,进行读写数据,周期向NameNode汇报。
    2.负责管理用户的文件数据块(一个大的数据拆分成多个小的数据块)

  • 1)HDFS集群包括
    NameNode和DataNode以及Secondary Namenode。

  • 2)NameNode负责管理整个文件系统的元数据,以及每一个路径(文件)所对应的数据块信息。

  • 3)Secondary NameNode用来监控HDFS状态的辅助后台程序,每隔一段时间获取HDFS元数据的快照。最主要作用是辅助namenode管理元数据信息

  • 4)DataNode 负责管理用户的文件数据块,每一个数据块都可以在多个datanode上存储多个副本。

MapReduce Yarn
管理者:ResourceManager
工作者:NodeManager

在这里插入图片描述

HDFS分块存储

  • hdfs将所有的文件全部抽象成为block块来进行存储,不管文件大小,全部一视同仁都是以block块的统一大小和形式进行存储,方便我们的分布式文件系统对文件的管理
  • 所有的文件都是以block块的方式存放在HDFS文件系统当中,在Hadoop1当中,文件的block块默认大小是64M,Hadoop2当中,文件的block块大小默认是128M,block块的大小可以通过hdfs-site.xml当中的配置文件进行指定
 <property>
        <name>dfs.block.size</name>
        <value>块大小 以字节为单位</value>//只写数值就可以
    </property>

在这里插入图片描述

  • 一个文件100M,上传到HDFS占用几个快? 一个块128M,剩余的28M怎么办?
    事实上,128只是个数字,数据超过128M,便进行切分,如果没有超过128M,就不用切分,有多少算多少,不足128M的也是一个快。这个快的大小就是100M,没有剩余28M这个概念
  • 抽象成数据块的好处
    1.一个文件有可能大于集群中任意一个磁盘
    20T/128 = xxx块,这些block块属于一个文件
    2.使用块抽象而不是文件,可以简化存储子系统。
    3.块非常适合用于数据备份进而提供数据容错能力和可用性
    块缓存
  • 通常DataNode从磁盘中读取块,但对于访问频繁的文件,其对应的块可能被显示的缓存在DataNode的内存中,以堆外块缓存的形式存在。默认情况下,一个块仅缓存在一个DataNode的内存中,当然可以针对每个文件配置DataNode的数量。作业调度器通过在缓存块的DataNode上运行任务,可以利用块缓存的优势提高读操作的性能

HDFS副本存放机制

HDFS视硬件错误为常态,硬件服务器随时有可能发生故障。
为了容错,文件的所有 block 都会有副本。每个文件的 block 大小和副本系数都是可配置的。应用程序可以指定某个文件的副本数目。副本系数可以在文件创建的时候指定,也可以在之后改变。
数据副本默认保存三个副本,我们可以更改副本数以提高数据的安全性
在hdfs-site.xml当中修改以下配置属性,即可更改文件的副本数

<property>
      <name>dfs.replication</name>
      <value>3</value>
</property>
Hadoop副本节点选择
  • 第一份数据来源于客户端
  • 第二份存放的位置是与第一个副本在相同机架上,且不在同一个节点,按照一定的规则(cpu 内存 IO是用率,和硬 盘剩余容量)找到一个节点存放
  • 第三个副本的存放位置是与第一第二份数据副本不在同一个机架上,且逻辑与存放副本1和2的机架距离最近的机上 按照一定的规则(cpu 内存 IO是用率,和硬盘剩余容量)找到一个节点进行存放
    在这里插入图片描述
名字空间(NameSpace)
  • HDFS 支持传统的层次型文件组织结构。用户或者应用程序可以创建目录,然后将文件保存在这些目录里。文件系统名字空间的层次结构和大多数现有的文件系统类似:用户可以创建、删除、移动或重命名文件。
  • Namenode 负责维护文件系统的名字空间,任何对文件系统名字空间或属性的修改都将被Namenode 记录下来。
  • HDFS 会给客户端提供一个统一的目录树,客户端通过路径来访问文件,形如:hdfs://namenode:port/dir-a/dir-b/dir-c/file.data
    在这里插入图片描述
Namenode 功能

我们把目录结构及文件分块位置信息叫做元数据。Namenode 负责维护整个hdfs文件系统的目录树结构,以及每一个文件所对应的 block 块信息(block 的id,及所在的datanode 服务器)
在这里插入图片描述

  • Namenode节点负责确定指定的文件块到具体的Datanode结点的映射关系。在客户端与数据节点之间共享数据
    在这里插入图片描述
  • 管理Datanode结点的状态报告,包括Datanode结点的健康状态报告和其所在结点上数据块状态报告,以便能够及时处理失效的数据结点
    在这里插入图片描述
    总结
  • Namenode作用
    1、维护 管理文件系统的名字空间(元数据信息)
    2、负责确定指定的文件块到具体的Datanode结点的映射关系。
    3、维护管理 DataNode上报的心跳信息
Datanode功能

文件的各个 block 的具体存储管理由 datanode 节点承担。每一个 block 都可以在多个datanode 上。Datanode 需要定时向 Namenode 汇报自己持有的 block信息。 存储多个副本(副本数量也可以通过参数设置 dfs.replication,默认是 3)
在这里插入图片描述

  • 向Namenode结点报告状态。每个Datanode结点会周期性地向Namenode发送心跳信号和文件块状态报告。
  • 心跳是每3秒一次,心跳返回结果带有namenode给该datanode的命令如复制块数据到另一台机器,或删除某个数据块。如果超过10分钟没有收到某个datanode的心跳,则认为该节点不可用。
  • DataNode启动后向namenode注册,通过后,周期性(1小时)的向namenode上报所有的块信息
    在这里插入图片描述
    执行数据的流水线复制。当文件系统客户端从Namenode服务器进程获取到要进行复制的数据块列表后,完成文件块及其块副本的流水线复制。
    一个数据块在datanode上以文件形式存储在磁盘上,包括两个文件,一个是数据本身,一个是元数据包括数据块的长度,块数据的校验和,以及时间戳
    在这里插入图片描述
    总结
  • DataNode作用
    1、执行数据的读写(响应的是客户端)
    2、周期性向NameNode做汇报(数据块的信息、校验和)
    若datanode 10分钟没有向NameNode做汇报,表示已丢失(已宕机) 心跳周期 3秒
    3、执行流水线的复制(一点一点复制)
机架感知

机架感知需要人为进行配置,编写Python脚本“RackAware.py”。内容为服务器IP与交换机的对应关系。(开源hadoop,使用RackAware.sh)

#!/usr/bin/python  
#-*-coding:UTF-8 -*-  
import sys  
  
rack = {  

        "12.12.3.1":"SW6300-1",  
        "12.12.3.2":"SW6300-1",  
        "12.12.3.3":"SW6300-1",  
  
        "12.12.3.25":"SW6300-2",  
        "12.12.3.26":"SW6300-2",  
        "12.12.3.27":"SW6300-2",  
 
        "12.12.3.49":"SW6300-3",  
        "12.12.3.50":"SW6300-3",  
        "12.12.3.51":"SW6300-3",  
     
        "12.12.3.73":"SW6300-4",  
        "12.12.3.74":"SW6300-4",  
        "12.12.3.75":"SW6300-4",  
		}  
if __name__=="__main__":  
    print "/" + rack.get(sys.argv[1],"SW6300-1-2") 

使用以下命令验证

[root@node01 sbin]# python RackAware.py 12.12.3.1
/SW6300-1 
[root@node01 sbin]# python RackAware.py 12.12.3.25
/SW6300-2
[root@node01 sbin]# python RackAware.py 12.12.3.75
/SW6300-4
[root@node01 sbin]# python RackAware.py 12.12.3.100
/SW6300-1-2

编辑core-site.xml配置文件,将脚本配置为topology.script.file.name的值

<property>
<name>topology.script.file.name</name>
<value>/home/bigdata/apps/hadoop/etc/hadoop/RackAware.py </value>
</property>

RPC 指的是 远程过程调用。是集群中多个组件、多个模块进行数据通信的一 种方式

2、HDFS文件读写流程

HDFS读写适用场景
一次写入,多次读出的场景。支持数据在文件尾追加。不支持在文件中间追加或修改。

HDFS-文件写入流程(重点)

在这里插入图片描述 详细步骤解析:

  • 1、 client发起文件上传请求,通过RPC与NameNode建立通讯,NameNode检查目标文件是否已存在,父目录是否存在,返回是否可以上传;
  • 2、 client请求第一个block该传输到哪些DataNode服务器上;
  • 3、 NameNode根据配置文件中指定的备份数量及机架感知原理进行文件分配,返回可用的DataNode的地址如:A,B,C;
  • 4、 client请求3台DataNode中的一台A上传数据(本质上是一个RPC调用,建立pipeline),A收到请求会继续调用B,然后B调用C,将整个pipeline建立完成,后逐级返回client;
  • 5、 client开始往A上传第一个block(先从磁盘读取数据放到一个本地内存缓存),以packet为单位(默认64K),A收到一个packet就会传给B,B传给C;A每传一个packet会放入一个应答队列等待应答。
  • 6、 数据被分割成一个个packet数据包在pipeline上依次传输,在pipeline反方向上,逐个发送ack(命令正确应答),最终由pipeline中第一个DataNode节点A将pipelineack发送给client;
  • 7、关闭写入流。
  • 8、 当一个block传输完成之后,client再次请求NameNode上传第二个block到服务器。
HDFS-文件读取流程(重点)

在这里插入图片描述
详细步骤解析

  • 1、客户端通过调用FileSystem对象的open()来读取希望打开的文件。
  • 2、 Client向NameNode发起RPC请求,来确定请求文件block所在的位置;
  • 3、 NameNode会视情况返回文件的部分或者全部block列表,对于每个block,NameNode 都会返回含有该 block 副本的 DataNode 地址; 这些返回的 DN 地址,会按照集群拓扑结构得出 DataNode 与客户端的距离,然后进行排序,排序两个规则:网络拓扑结构中距离 Client 近的排靠前;心跳机制中超时汇报的 DN 状态为 STALE,这样的排靠后;
  • 4、 Client 选取排序靠前的 DataNode 来读取 block,如果客户端本身就是DataNode,那么将从本地直接获取数据(短路读取特性);
  • 5、 底层上本质是建立 Socket Stream(FSDataInputStream),重复的调用父类 DataInputStream 的 read 方法,直到这个块上的数据读取完毕;
  • 6、并行读取,若失败重新读取
  • 7、 当读完列表的 block 后,若文件读取还没有结束,客户端会继续向NameNode 获取下一批的 block 列表;
  • 8、返回后续block列表
  • 9、 最终关闭读流,并将读取来所有的 block 会合并成一个完整的最终文件。
    说明:
    1、读取完一个 block 都会进行 checksum 验证,如果读取 DataNode 时出现错误,客户端会通知 NameNode,然后再从下一个拥有该 block 副本的DataNode 继续读。
    2、read 方法是并行的读取 block 信息,不是一块一块的读取;NameNode 只是返回Client请求包含块的DataNode地址,并不是返回请求块的数据;
数据完整性
  • 1)当DataNode读取block的时候,它会计算checksum
  • 2)如果计算后的checksum,与block创建时(第一次上传是会计算checksum值)值不一样,说明block已经损坏。
  • 3)client读取其他DataNode上的block.
  • 4)datanode在其文件创建后周期验证checksum
    在这里插入图片描述
    总结
  • 数据在写入之后进行校验和的计算,DataNode周期性进行校验和计算,将计算结果与第一次的结果进行对比。
  • 若相同表示无数据丢失,若不相同表示数据有丢失,丢失进行数据恢复。
  • 数据读取之前对数据进行校验,与第一次的结果进行对比。
    若相同表示数据没有丢失,可以读取。若不相同表示数据 有所丢失。到其他副本读取
掉线时限参数设置
  • datanode进程死亡或者网络故障造成datanode无法与namenode通信,namenode不会立即把该节点判定为死亡,要经过一段时间,这段时间暂称作超时时长。HDFS默认的超时时长为10分钟+30秒。如果定义超时时间为timeout,则超时时长的计算公式为:
  • timeout = 2 * dfs.namenode.heartbeat.recheck-interval + 10 * dfs.heartbeat.interval。
    而默认的dfs.namenode.heartbeat.recheck-interval 大小为5分钟,dfs.heartbeat.interval默认为3秒。
  • 需要注意的是hdfs-site.xml 配置文件中的heartbeat.recheck.interval的单位为毫秒,dfs.heartbeat.interval的单位为秒
<property>
    <name>dfs.namenode.heartbeat.recheck-interval</name>
    <value>300000</value>
</property>
<property>
    <name> dfs.heartbeat.interval </name>
    <value>3</value>
</property>
DataNode的目录结构

和namenode不同的是,datanode的存储目录是初始阶段自动创建的,不需要额外格式化。在/export/servers/hadoop-2.6.0-cdh5.14.0/hadoopDatas/datanodeDatas/current这个目录下查看版本号

[root@node01 current]# cat VERSION 
#Thu Mar 14 07:58:46 CST 2019
storageID=DS-47bcc6d5-c9b7-4c88-9cc8-6154b8a2bf39
clusterID=CID-dac2e9fa-65d2-4963-a7b5-bb4d0280d3f4
cTime=0
datanodeUuid=c44514a0-9ed6-4642-b3a8-5af79f03d7a4
storageType=DATA_NODE
layoutVersion=-56

具体解释
(1)storageID:存储id号
(2)clusterID集群id,全局唯一
(3)cTime属性标记了datanode存储系统的创建时间,对于刚刚格式化的存储系统,这个属性为0;但是在文件系统升级之后,该值会更新到新的时间戳。
(4)datanodeUuid:datanode的唯一识别码
(5)storageType:存储类型
(6)layoutVersion是一个负整数。通常只有HDFS增加新特性时才会更新这个版本号。

目录结构
在这里插入图片描述
这个例子中“test.txt”有两个数据块
在这里插入图片描述
第一个块“Block0”, 块大小134217728(128M),块ID:1073741853,块池ID:BP-866966434-192.168.100.129-1560531186882,存储在节点node01,node03上
在这里插入图片描述
第二个块“Block0”, 块大小49671168(47.3M) ,块ID: 1073741854,块池ID:BP-866966434-192.168.100.129-1560531186882,存储在节点node01,node03上。
进入node01或node03节点的DataNode存储数据的目录,进入到块池的ID目录
/export/servers/hadoop-2.6.0-cdh5.14.0/hadoopDatas/datanodeDatas/current/BP-866966434-192.168.100.129-1560531186882
在这里插入图片描述
进入到blk的目录找到块的ID
在这里插入图片描述
一次写入,多次读出
HDFS 是设计成适应一次写入,多次读出的场景,且不支持文件的修改。
正因为如此,HDFS 适合用来做大数据分析的底层存储服务,并不适合用来做.网盘等应用,因为,修改不方便,延迟大,网络开销大,成本太高

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值