hadoop与hdfs

第2章 大数据处理架构Hadoop

简介

  • Hadoop的核心是分布式文件系统HDFS(Hadoop Distributed File System)和MapReduce
  • Hadoop是一个能够对大量数据进行分布式处理的软件框架,并且是以一种可靠、高效、可伸缩的方式进行处理的

项目结构

应用框架

版本演变

项目结构

组件功能
HDFS分布式文件系统
MapReduce分布式并行编程模型
YARN资源管理和调度器
Tez运行在YARN之上的下一代Hadoop查询处理框架
HiveHadoop上的数据仓库
HBaseHadoop上的非关系型的分布式数据库
Pig一个基于Hadoop的大规模数据分析平台,提供类似SQL的查询语言Pig
Sqoop用于在Hadoop与传统数据库之间进行数据传递
OozieHadoop上的工作流管理系统
Zookeeper提供分布式协调一致性服务
Storm流计算框架
Flume一个高可用的,高可靠的,分布式的海量日志采集、聚合和传输的系统
AmbariHadoop快速部署工具,支持Apache
Kafka一种高吞吐量的分布式发布订阅消息系统,可以处理消费者规模的网站中的所有动作流数据
Spark类似于Hadoop

第3章 分布式文件系统HDFS

简介

  • 分布式文件系统把文件分布存储到多个计算机节点上,成千上万的计算机节点构成计算机集群
  • 这些节点分为两类,“名称结点”(NameNode),“数据节点”(DataNode)
  • NameNode
    • 存储元数据
    • 元数据保存在内存中
    • 保存文件,block,datanode 之间的映射关系
  • DataNode
    • 储存文件内容
    • 文件内容保存在磁盘
    • 维护了block id到datanode本地文件的映射关系
  • 抽象的块概念
    • 好处:
      • 支持大规模文件存储:文件以块为单位进行存储,一个大规模文件可以被分拆成若干个文件块,不同的文件块可以被分发到不同的节点上,因此,一个文件的大小不会受到单个节点的存储容量的限制,可以远远大于网络中任意节点的存储容量
      • 简化系统设计:首先,大大简化了存储管理,因为文件块大小是固定的,这样就可以很容易计算出一个节点可以存储多少文件块;其次,方便了元数据的管理,元数据不需要和文件块一起存储,可以由其他系统负责管理元数据
      • 适合数据备份:每个文件块都可以冗余存储到多个节点上,大大提高了系统的容错性和可用性
    • 局限
      • 不适合低延迟数据访问
      • 无法高效存储大量小文件。HDFS采用了分布式的存储架构,它将大文件切分成多个数据块,并将其分散存储在多个节点上。这种设计使得HDFS非常适合处理大文件和流式数据访问,但对于小文件的存储和访问则效率较低。
      • 不支持多用户写入及任意修改文件。HDFS的写入模式是追加模式,即只能在文件末尾追加数据,不支持多用户并发写入同一个文件。这限制了HDFS在多用户写入文件方面的灵活性,并且不支持任意修改文件。

NameNode

名称节点负责管理分布式文件系统的命名空间,
保存了两个核心的数据结构:

  • FsImage,用于维护文件系统树以及文件树中所有的文件和文件夹的元数据
  • EditLog,操作日志文件,记录了所有针对文件的创建、删除、重命名等操作
FsImage

包含了文件系统中所有目录和文件inode的序列化形式

inode是一个文件或目录的元数据的内部表示,并包含:文件的复制等级、修改和访问时间、访问权限、块大小以及组成文件的块。对于目录,则存储修改时间、权限和配额元数据。

fsimage没有记录文件包含哪些块以及每个块存储在哪个数据节点。
而是由名称节点把这些映射信息保留在内存中。
当数据节点加入HDFS集群时,数据节点会把自己所包含的块列表告知给名称节点,此后会定期执行这种告知操作,以确保名称节点的块映射是最新的。

相当于,比如一个文件,名字叫“aaa”。你存了aaa在fsimage中。
然后有一天你改了名字,叫“bbb”。此时,fsimage中还是aaa,然后editLog中记录了“aaa—>bbb”。
这样会导致一个问题。你的操作增多,editLog变大。当你要用aaa文件的时候,会很慢。所以有了SecondaryNameNode。

SecondaryNameNode的工作情况:
(1)SecondaryNameNode会定期和NameNode通信,请求其停止使用EditLog文件,暂时将新的写操作写到一个新的文件edit.new上来,这个操作是瞬间完成,上层写日志的函数完全感觉不到差别;
(2)SecondaryNameNode通过HTTP GET方式从NameNode上获取到FsImage和EditLog文件,并下载到本地的相应目录下;
(3)SecondaryNameNode将下载下来的FsImage载入到内存,然后一条一条地执行EditLog文件中的各项更新操作,使得内存中的FsImage保持最新;这个过程就是EditLog和FsImage文件合并;
(4)SecondaryNameNode执行完(3)操作之后,会通过post方式将新的FsImage文件发送到NameNode节点上
(5)NameNode将从SecondaryNameNode接收到的新的FsImage替换旧的FsImage文件,同时将edit.new替换EditLog文件,通过这个过程EditLog就变小了

但其实按我的理解就是:
你fsimage是"name:aaa"
editLog里面“aaa->bbb->ccc->ddd”
(为了方便,把所有更新操作举例为更改名字)
现在嫌启动的时候要改4次名字,很麻烦。
于是有个第二名称节点,开始进行操作。
假设第二名称节点启动时刻是1:00,假设第二名称节点操作时间是10分钟,所以结束的时候是1:10。
1:00————把fsimage和editLog文件用get方式进行下载(因为第二名称节点一般单独运行在另一台机器上,所以需要把这两个文件下载备份)。
1:00到1:10————现在你所有操作不卸载editLog上了,写在一个edit.now文件中。(因为刚刚备份了editLog文件,你现在再往上写,刚刚那份就少了记录了)。
1:00到1:10————现在第二名称节点开始进行备份的editLog中的操作,把aaa文件一步步操作成ddd文件。
1:10————第二名称节点用post方式把fsimage重新发回NameNode上替换原来的。然后把edit.now文件作为新的editLog文件。

这里还没搞清楚的疑问:

  1. “哪些块储存在哪个数据节点”和“数据节点会把自己包含哪些块告知名称节点”,“映射关系”有什么区别。
  2. 为什么说没有“记录文件包含哪些块以及每个块存储在哪个数据节点”呢,明明名称节点维护一个称为"块映射表(BlockMap)"的数据结构,用于记录文件的数据块信息。块映射表中的条目包括块ID和对应的数据节点列表。每个条目表示一个数据块,它存储了该块在HDFS中的多个副本的存储位置,即数据节点的信息。而且不是说inode包含了组成文件的块信息吗。

数据节点

  • 负责数据的存储和读取,会根据客户端或者是名称节点的调度来进行数据的存储和检索,并且向名称节点定期发送自己所存储的块的列表
  • 每个数据节点中的数据会被保存在各自节点的本地Linux文件系统中

体系结构

命名空间
  • HDFS的命名空间包含目录、文件和块
  • 在HDFS1.0体系结构中,在整个HDFS集群中只有一个命名空间,并且只有唯一一个名称节点,该节点负责对这个命名空间进行管理
  • HDFS使用的是传统的分级文件体系,因此,用户可以像使用普通文件系统一样,创建、删除目录和文件,在目录间转移文件,重命
通信协议
  • HDFS是一个部署在集群上的分布式文件系统,因此,很多数据需要通过网络进行传输。
  • 所有的HDFS通信协议都是构建在TCP/IP协议基础之上的
  • 客户端通过一个可配置的端口向名称节点主动发起TCP连接,并使用客户端协议与名称节点进行交互
  • 名称节点和数据节点之间则使用数据节点协议进行交互
  • 客户端与数据节点的交互是通过RPC(Remote Procedure Call)来实现的。在设计上,名称节点不会主动发起RPC,而是响应来自客户端和数据节点的RPC请求名文件等

客户端-> TCP链接 ->NameNode
NameNode-> 数据节点协议 ->DataNode
客户端-> RPC协议 ->DataNode

局限性
  1. 命名空间的限制:名称节点是保存在内存中的,因此,名称节点能够容纳的对象(文件、块)的个数会受到内存空间大小的限制。
  2. 性能的瓶颈:整个分布式文件系统的吞吐量,受限于单个名称节点的吞吐量。
  3. 隔离问题:由于集群中只有一个名称节点,只有一个命名空间,因此,无法对不同应用程序进行隔离。
  4. 集群的可用性:一旦这个唯一的名称节点发生故障,会导致整个集群变得不可用。

储存原理

冗余数据保存

为了保证系统的容错性和可用性,HDFS采用了多副本方式对数据进行冗余存储,通常一个数据块的多个副本会被分布到不同的数据节点上,优点:
(1)加快数据传输速度
(2)容易检查数据错误
(3)保证数据可靠性

数据存取策略

  • 第一个副本:放置在上传文件的数据节点;如果是集群外提交,则随机挑选一台磁盘不太满、CPU不太忙的节点
  • 第二个副本:放置在与第一个副本不同的机架的节点上
  • 第三个副本:与第一个副本相同机架的其他节点上
  • 更多副本:随机节点

HDFS提供了一个API可以确定一个数据节点所属的机架ID,客户端也可以调用API获取自己所属的机架ID
当客户端读取数据时,从名称节点获得数据块不同副本的存放位置列表,列表中包含了副本所在的数据节点,可以调用API来确定客户端和这些数据节点所属的机架ID,当发现某个数据块副本对应的机架ID和客户端对应的机架ID相同时,就优先选择该副本读取数据,如果没有发现,就随机选择一个副本读取数据

数据错误与恢复

  1. 名称节点出错
    HDFS设置了备份机制,把这些核心文件同步复制到备份服务器SecondaryNameNode上。当名称节点出错时,就可以根据备份服务器SecondaryNameNode中的FsImage和Editlog数据进行恢复。
  2. 数据节点出错
  • 每个数据节点会定期向名称节点发送“心跳”信息,向名称节点报告自己的状态
  • 当数据节点发生故障,或者网络发生断网时,名称节点就无法收到来自一些数据节点的心跳信息,这时,这些数据节点就会被标记为“宕机”,节点上面的所有数据都会被标记为“不可读”,名称节点不会再给它们发送任何I/O请求
  • 这时,有可能出现一种情形,即由于一些数据节点的不可用,会导致一些数据块的副本数量小于冗余因子
  • 名称节点会定期检查这种情况,一旦发现某个数据块的副本数量小于冗余因子,就会启动数据冗余复制,为它生成新的副本
  • HDFS和其它分布式文件系统的最大区别就是可以调整冗余数据的位置
  1. 数据出错
  • 网络传输和磁盘错误等因素,都会造成数据错误
  • 客户端在读取到数据后,会采用md5和sha1对数据块进行校验,以确定读取到正确的数据
  • 在文件被创建时,客户端就会对每一个文件块进行信息摘录,并把这些信息写入到同一个路径的隐藏文件里面
  • 当客户端读取文件的时候,会先读取该信息文件,然后,利用该信息文件对每个读取的数据块进行校验,如果校验出错,客户端就会请求到另外一个数据节点读取该文件块,并且向名称节点报告这个文件块有错误,名称节点会定期检查并且重新复制这个块
  • 24
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值