大数据基础--深入了解HDFS

HDFS

主要内容

  1. HDFS适用场景
  2. HDFS内部组成
  3. HDFS原理、机制
  4. HDFS特性
  5. HDFS基本使用
  6. HDFS-Web界面介绍
  7. HDFS高级使用
  8. HDFS API

Hadoop组成
Hadoop HDFS:一个高可靠、高吞吐量的分布式文件系统,对海量数据的存储
Hadoop MapReduce:一个分布式的资源调度和离线并行计算框架
Hadoop yarn:基于HDFS,用于作业调度和集群资源管理的框架
Hadoop Common:Hadoop工具包,支持其他模块的工具模块(Configuration、RPC、序列化机制、日志操作)
在这里插入图片描述
简要概括:
HDFS
管理者:NameNode
作用:负责管理,管理集群内各个节点。
负责管理整个文件系统的元数据(指的是数据的存放位置或存放路径)或名字空间
辅助管理者:SecondaryNameNode
作用:责辅助NameNode管理工作。
工作者:DataNode
作用:负责工作,进行读写数据。 周期向NameNode汇报。
负责管理用户的文件数据块(一个大的数据拆分成多个小的数据块)
MapReduce
Yarn
管理者:ResourceManager
工作者:NodeManager

1、 Hadoop的文件系统介绍

目标:掌握什么是HDFS,HDFS的使用场景,组成部分。
HDFS 是 Hadoop Distribute File System 的简称,意为:Hadoop 分布式文件系统。是 Hadoop 核心组件之一,作为最底层的分布式存储服务而存在。
分布式文件系统解决的问题就是大数据存储。它们是横跨在多台计算机上的存储系统。分布式文件系统在大数据时代有着广泛的应用前景,它们为存储和处理超大规模数据提供所需的扩展能力。

在这里插入图片描述
HDFS使用Master和Slave结构对集群进行管理。一般一个 HDFS 集群只有一个 Namenode 和一定数目的Datanode 组成。Namenode 是 HDFS 集群主节点,Datanode 是 HDFS 集群从节点,两种角色各司其职,共同协调完成分布式的文件存储服务。
在这里插入图片描述
Namenode(Master)管理者-只负责管理,管理集群内各个节点。
SecondaryNameNode 辅助管理-只负责辅助Namenode管理工作。
DateNode(slave)工作者,是负责工作,周期向namenode汇报,进行读写数据。

  1. HDFS集群包括,NameNode和DateNode以及Secondary Namenode。
  2. Namenode 负责管理整个文件系统的元数据,以及每一个路径(文件)所对应的数据块信息。
  3. DataNode 负责管理用户的文件数据块,每一个数据块,每一个数据块都可以在多个datanode上存储多个副本。
  4. Secondary Namenode 用来监控HDFS状态的辅助后台程序,每隔一段时间获取HDFS元数据的快照。最主要作用是辅助namenode管理元数据信息。
    在这里插入图片描述

HDFS分块存储

目标:掌握什么是分块存储,HDFS的分块存储策略
hdfs将所有的文件全部抽象成为block块来进行存储,不管文件大小,全部一视同仁都是以block块的统一大小和形式进行存储,方便我们的分布式文件系统对文件的管理。

所有的文件都是以block块的方式存在HDFS文件系统中,在Hadoop1当中,文件的block块默认大小是64M,Hadoop2当中,文件的block块大小默认是128M,block块的大小可以通过hdfs-site.xml当中的配置文件进行指定
在这里插入图片描述
在这里插入图片描述
坑1:
一个文件100M,上传到HDFS占用几个快?
一个块128M,剩余的28M怎么办?
事实上,128只是个数字,数据超过128M,便进行切分,如果没有超过128M,就不用切分,有多少算多少,不足128M的也是一个快。这个快的大小就是100M,没有剩余28M这个概念。

抽象成数据块的好处
1.一个文件有可能大于集群中任意一个磁盘
20T/128 = xxx块,这些block块属于一个文件
2.使用块抽象而不是文件,可以简化存储子系统。
3.块非常适合用于数据备份进而提供数据容错能力和可用性

块缓存
通常DataNode从磁盘中读取块,但对于访问频繁的文件,其对应的块可能被显示的缓存在DataNode的内存中,以堆外块缓存的形式存在。默认情况下,一个块仅缓存在一个DataNode的内存中,当然可以针对每个文件配置DataNode的数量。作业调度器通过在缓存块的DataNode上运行任务,可以利用块缓存的优势提高读操作的性能。

HDFS副本机制

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

低版本Hadoop副本节点选择
第一个副本在client所处的节点上。如果客户端在集群外,随机选一个。
第二个副本和第一个副本位于不相同机架的随机节点上。
第三个副本和第二个副本位于相同机架,节点随机。
在这里插入图片描述

Hadoop2.7.2副本节点选择
第一个副本在client所处的节点上。如果客户端在集群外,随机选一个。
第二个副本和第一个副本位于相同机架,随机节点。
第三个副本位于不同机架,随机节点
在这里插入图片描述

简要概括:(橙色小方块代表副本)
第一份副本数据来源于客户端
第二份副本存放的位置是第一个副本用一个机架上,且不同节点按照一定的规则(cpu内存IO使用率,和硬盘剩余容量)找一个节点存放。
第三个副本的存放位置是与第一份第二份逻辑距离最近的且按照规则(cpu内存 io使用率 磁盘剩余容量)找一个节点存放。

名字空间(NameSpace)

目标:掌握什么是“名字空间”
目标:掌握什么是“名字空间”
HDFS 支持传统的层次型文件组织结构。用户或者应用程序可以创建目录,然后将文件保存在这些目录里。文件系统名字空间的层次结构和大多数现有的文件系统类似:用户可以创建、删除、移动或重命名文件。
Namenode 负责维护文件系统的名字空间,任何对文件系统名字空间或属性的修改都将被Namenode 记录下来。
HDFS 会给客户端提供一个统一的目录树,客户端通过路径来访问文件,形如:hdfs://namenode:port/dir-a/dir-b/dir-c/file.data。
在这里插入图片描述

Namenode 功能

目标:掌握NameNode有哪些主要的功能
我们把目录结构及文件分块位置信息叫做元数据。Namenode 负责维护整个hdfs文件系统的目录树结构,以及每一个文件所对应的 block 块信息(block 的id,及所在的datanode 服务器)
在这里插入图片描述
Namenode节点负责确定指定的文件块到具体的Datanode结点的映射关系。在客户端与数据节点之间共享数据。
在这里插入图片描述
管理Datanode结点的状态报告,包括Datanode结点的健康状态报告和其所在结点上数据块状态报告,以便能够及时处理失效的数据结点。
在这里插入图片描述
简要概括:
1、维护 管理文件系统的名字空间(元数据信息)
2、负责确定指定的文件块到具体的Datanode结点的映射关系。
3、维护管理 DataNode上报的心跳信息

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上以文件形式存储在磁盘上,包括两个文件,一个是数据本身,一个是元数据包括数据块的长度,块数据的校验和,以及时间戳。
在这里插入图片描述

机架感知

目标:掌握集群的机架感知配置
机架感知需要人为进行配置,编写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的值

topology.script.file.name /home/bigdata/apps/hadoop/etc/hadoop/RackAware.py
发布了41 篇原创文章 · 获赞 114 · 访问量 2万+

猜你喜欢

转载自blog.csdn.net/Mr_Yang888/article/details/102861599