快速入门大数据分布式文件存储系统--HDFS

HDFS

HDFS基础

HDFS系统架构

Hadoop的框架最核心的设计就是HDFS、MapReduce。hdfs本身是主从架构,即master和slave。

image-20210222225055697

hdfs进行海量数据的分布式存储。namenode是主节点,datanode是从节点。SecondaryNameNode可以理解为一个备份,但实际上并不是。

NameNode

我们先来看看hdfs架构中的namenode。namenode是一个进程在某一个节点(机器)上,本身维护一块内存区域。内存中存储两份最重要的数据(元数据通过datanode通过心跳机制保证,datanode有新增数据,通过心跳机制告诉namenode):

  • 1.文件名->block数据块的映射关系(mapping关系)
  • 2.block数据块到datanode节点之间的映射关系

本质:通过block数据块找到数据真正存储的本地地址。

image-20210131141809739

整个1、2、3数据块合起来就是文件的内容。

比如说,取快递,首先会收到快递信息,信息有快递存放的地址和快递箱。通过这个信息就能找到快递,相当于手机就是nn,通过查看收集上的快递信息(NN上的文件名与block数据块映射信息),找到快递是存在哪个快递箱里(找到对应的DN),再到指定的快递箱(DN)输入对应的编码(block数据块到dn节点之间的映射关系),就能取到对应的快递(数据)。

在存储数据时,首先要找nn分配dn来写入数据。hdfs默认会存储三分数据副本。

NameNode(NN)作用
  • 管理着文件系统命名空间
  • 存储元数据
  • 保存文件,block, datanode之间的映射关系
  • 元信息持久化
  • 运行 Namenode会占用大量内存和I/O资源
  • Hadoop更倾向存储大文件原因
1.为什么hadoop更倾向于存储大文件?

namenode内存有限,如果内存存放大量小文件,会占用大量内存和I/O资源,使得集群反应速度慢。所以,hadoop不适合存储大量的小文件。hdfs1.0的块大小是64M,hdfs2.0是128M。

总结:

1.对于集群硬盘资源造成严重浪费;

2.nn本身内存有限,造成namenode内存溢出;

注意:数据块过大,会导致启动mapreduce并发能力不够,影响任务执行速度。

比如Block块大小为128m,如果数据大小时1G,则可以启动8个maptask线程去跑该数据,但如果Block块大小设置为640m,则只能启动2个maptask线程去跑该数据,8线程和2线程,哪个效率更高,一眼即可看出。

假设有一个块,大小64m,但是存储的文件大小是10m,就浪费了54m的空间,对集群的硬盘资源造成了严重浪费。

image-20210131142947450

在hdfs1.0中只有一个namenode(nn),这是因为当时基础设施的不完整,数据量也不是很多没有想太多。到现在,由于数据量过多,因此产生了zookeeperk(分布式锁服务…)来协调

NN单节点故障

Hadoop集群生态只有一个 Namenode,容易导致单节点故障。

解决方案
  • 1.将 hdfs元数据写入到本地文件系统的同时再实时同步到一个远程挂载的网络文件系统(NFS)

    • fsimage它是在 Namenode启动时对整个文件系统的快照
    • edit logs它是在 Namenode启动后,对文件系统的改动序列,产生log

image-20210131143946451

  • 2.运行一个 Secondary Name Node,它的作用是与Namenode进行交互定期通过编辑日志文件合并命名空间镜像。当 NameNode发生故障时它会通过自己合并的命名空间镜像副本来恢复。需要注意的是 Secondary Namenode保存的状态总是滞后于NameNode,所以这种方式难免会导致丢失部分数据。

image-20210131144402202

snn的意义是对editlog进行汇总,并产生一个新的fsimage,但也是不能保证完全不会产生信息丢失,下面只是hdfs1.0的一个临时解决方案,具体解决方案会在hdfs2.0讲解。

DataNode(NN)作用
  • 负责存储数据块,负责为系统客户端提供数据块的读写服务
  • 根据 Namenodel的指示进行创建、删除和复制等操作
  • 心跳机制,定期报告文件块列表信息
机架感知策略–Block副本放置策略

image-20210222224325790

  • 什么情况下涉及到机架感知?

hadoop集群规模很大的时候,还有为了避免跨机架,导致的带宽消耗

目的:

1.不同节点之间的通讯,尽量发生在一个机架之内,节省网络传输带宽

2.提高容错能力

数据完整性–检测数据是否受到损坏
  • 不希望在存储和处理数据时丢失或损坏任何数据
  • HDFS会对写入的数据计算校验和,并在读取数据时验证校验和
  • 两种检验方法逻辑
    • 校检和
      • 检测损坏数据的常用方法是在第一次进行系统时计算数据的校验和,在通道传输过程中,如果新生成的校验和不完全匹配原始的校验和,那么数据就会被认为是被损坏的。
      • image-20210131211913558
    • 数据块检测程序 DataBlockScanner
      • 在 Datanode节点上开启一个后台线程,来定期验证存储在它上所有块,这个是防止物理介质出现损减情况而造成的数据损坏。
容错–数据可靠性
  • 一个NN和多个DN

  • 故障检测

    • 数据节点
      • 心跳包(检测是否宕机):dn和nn随时保持心跳,3s一次,保证集群可靠性;
      • 快报告(安全模式下检测)
      • 数据完整性检测(校验和比较–crc32)
  • 空间回收机制

    • Trash目录:-skipTrash(删除的文件跳过回收站直接删除)
  • 数据复制(冗余机制)

    • 副本-数据冗余存放(机架感知策略)
  • snn,保证镜像文件数据可以恢复;

HDFS特点
优点
  • 存储并管理PB级数据
  • 处理非结构化数据
  • 注重数据处理的吞吐量(延迟不敏感)
  • 应用模式:write-once-read-many存取模式(无数据一致性问题)
缺点
  • 存储小文件(不建议)
  • 大量随机读(不建议)
  • 需要对文件修改(不建议)
    • 对文件修改会影响块进行重新分配,块分配又会影响到和多个dn节点间进行网络通讯;
  • 多用户写入(不支持)

hdfs不适合场景

存储海量小文件

文件被修改

大量随机读取,对于大数据的文件读取,更倾向于顺序读,因为随机读取需要寻址,浪费时间影响效率,而且顺序读取的效率会比内存读取要高

hdfs写流程

写的文件经过namenode同意,即文件是否已存在?用户是否有写的权限?如果都ok,则nn分配dn节点去写数据。当client写入数据到第一个dn后就直接返回成功,其他节点对第一个dn进行拷贝,减轻了client的负担,数据同步是异步的过程。dn通过心跳告知nn数据的增加。

image-20210222224347989

hdfs读流程

image-20210222224409160

HDFS&MapReduce的本地模式

mapreduce(mr)集群在1.0中,主(jobtracker–nn),从(tasktracker–dn)

hdfs是一个存储集群,mr是一个计算集群;

主:分配任务,根据集群空闲情况分配任务;

从:具体干活

就近原则:本地化,数据不移动,任务移动;哪些节点有数据,就把代码逻辑放到哪些节点上,提高了集群整体性能。因为大量数据移动会产生高带宽,可如果只是代码逻辑移动,代码文件不大,能有效减少带宽,提高集群效率。

存在问题:Block大小影响线程效率?理解不是很清晰。

shell 命令

管道符"|":代表前面的命令作为后面命令的输入;

“ll -rt”:查询最近修改的文件;

“rm -rf xx”: 如果是root身份,在根目录执行该命令,会删除所有文件,要慎用,用之前pwd一下,并指定删除对象

“du -sh”: 查看文件大小,默认单位为byte

“wc -l”: 查看文件里的行数

“rm -r”:删除文件

“rm -r skipTrash”: 删除文件跳过回收站

“kill -9 pid”:删除进程

“history”:导出history后,按住鼠标右键,按住shift可以快速选择列,删除命令id(sublime text才可以)

image-20210131154118124

HDFS2.0

新特性

  • Namenode HA
  • Namenode Federation
  • HDFS快照
  • HDFS缓存
  • HDFS ACL

NameNode的HA(高可用)

Hadoop2.0中的HA 主要解决Hadoop1.0中的单点故障问题(使用两个NN,一个activeNN, 一个是standbyNN),并不是两个nn都对外提供服务,activenn挂了,standby则顶替上。

单点故障问题解决方案
  • HDFS的高可用性将通过在同一个集群中运行两个 Name Nodeactive Name Node& standby Name Node)来解决
  • 在任何时间,只有一台机器处于 Active>状态;另一台机器是处于Standby状态
  • Active NN负责集群中所有客户端的操作,Standby NN主要用于备用,它主要维持足够的状态,如果必要,可以提供快速的故障恢复。
数据一致性如何保证?
  • 1.共享的网络文件系统(文件名 -> block映射关系)
  • 2.dn向两个nn都发送心跳信息,维护block和dn节点的映射关系
    • 之所以向两个同时发,是因为要保证standbyNN顶替时,能够与原来的activeNN拥有一样的元数据信息?*

故障转移:利用zookeeper来保证(本身维护了一个有序的临时节点)

NameNode2.0

实现了active挂掉无感知。active挂掉后,fc进程会将信息传给zk,进行一个故障转移。

image-20210131155812358

JN(网络共享文件系统)

可以理解为一个集群。但因为有多个机器,怎么判断哪些机器的数据是新的哪些是旧的呢?

  • 采用投票机制,谁的票数越多,就以谁的为准。

    • 前提是节点个数必须是奇数,避免一半赞成一半反对情况的出现导致无法确定结果,方便进行投票选举出含有最新数据所在机器并以此为根据,达到数据的统一存储;
  • 共享文件系统的作用是保证数据统一存储

JN:QJM(是JN组成的集群,只有投票,没有存储),JN部署一般和DN在一起,处于同一个节点上,不部署在NN上是因为如果NN挂掉会影响JN进行投票。

  • 但是每一个datanode上都部署一个JN合理吗?

    • 只需要选择一部分部署即可(选择奇数个节点部署),便于利用少数服从多数的机制。
    • 但会导致多个机器数据不一致??

JN优点:

  • 不需要额外的配置共享存储,节约成本
  • 没有单节点问题
  • 不需要人为搭建(介入),自动支持
当activeNN挂掉了,standbyNN如何顶替?
  • 故障转移(利用zookeeper保证)

    • 主要通过有序的临时节点来保证
    • image-20210131220352497
集群配置:

nn和jn可以配置在一个节点上好,还是不同机器好?

  • 通常nn和jn放置在不同机器上,如果放在同一机器,nn挂掉了,会影响jn;
  • nn和fc部署在同一节点上,以便于随时监控nn的情况;
  • hadoop2.0 RM(相当于jobtracker)和nm在同一个节点上;
  • NM(相当于tasktracker)和DN在同一个节点上,因为就近原则,减少带宽损耗
  • zk独立维护一套集群

NameNode Federation

联邦nn用于解决单nn的内存限制问题,集群中提供多个nn,每个nn负责管理一部分dn,集群共享整个dn。

nn联邦机制:本质是突破nn本身内存资源的瓶颈,不再受某一个nn内存限制

解决的问题:

  • 高可用
  • nn内存资源不足

减轻了单个nn的压力,有利于集群的横向拓展,提升了性能。

关键点:每个nn共享所有dn的数据,让我们的元数据和存储得到了隔离

image-20210222224444175

前面解决了高可用的问题,但是NN本身的内存资源也是不够

联邦:(解决了高可用,内存资源增加)

  • 通过将数据进行切分,产品部门,技术部门,其他业务部门,各自维护各自的namenode, 但是背后的数据都是共享同一套DN

好处:

  • 减轻单一的NN的压力,将数据可以通过其他的NN来管理
  • 有利于集群的横向扩展,性能带来很大的提升,资源得到隔离

本质:

  • 元数据管理和存储得到解耦,但是真实的数据是共享的

HDFS快照

数据备份,灾备,快速恢复

快照本质:只记录block列表和大小,不涉及到数据的复制

  • HDFS快照是一个只读的基于时间点文件系统拷贝
  • 快照可以是整个文件系统的也可以是一部分。
  • 常用来作为数据备份,防止用户错误操作和容灾恢复。
  • Snapshot并不会影响HDFS的正常操作:修改会按照时间的反序记录,这样可以直接读取到最新的数据。
  • 快照数据是当前数据减去修改的部分计算出来的。
  • 快照会存储在 snapshottable的目录下

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nhjSQF1T-1614005466810)(G:\Desktop\大数据分布式文件存储系统–HDFS.assets\image-20210222224528267.png)]

HDFS缓存

image-20210222224551162

本地client,第一次记录查询的文件路径以及dn(涉及和nn的交互),第二次直接拿着查询的文件路径进行查询即可

image-20210222224609645

chmod o+w 文件:给other用户组添加一个写权限

ACL

dr(读权限)w(写权限)x(执行权限)(代表owner的权限) r-x(用户同组的权限) r-x(其他不是和owner同组的用户). 2 6 01:01 hadoop d表示目录 若是文件使用 “-”

hadoop集群搭建

1.集群配置

三个节点,一主两从

image-20210131162718505

2.安装步骤

  • 1.安装java,配置环境变量

  • 2.解压hadoop2.6.1安装包

    • tar -zxvf hadoop…
  • 3.修改hadoop配置文件

    • 1,进入hadoop配置目录:/etc/hadoop/
    • 2.修改hadoop-env.sh里的java_home目录指向java根目录
    • 3.修改yarn-env.sh,也是修改java_home的路径,同上
    • 4.修改slaves,添加两台从节点
    • 5.hdfs-site.xml配置修改
    • 6.修改core-site.xml
    • 7.修改mapred-site.xml
    • 8.修改yarn-site.xml

    4.环境变量配置

    ~./bashrc:用户级别环境变量

    /etc/profile:全局的环境变量

    bash全局刷新环境变量

    5.master slave1 slave2进行免密登陆

    6.远程拷贝:

    scp -rp xxx文件 root@slave1:/root/.bashrc

    7.启动集群

    • 初始化namenode
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值