第2章 大数据处理架构Hadoop
简介
- Hadoop的核心是分布式文件系统HDFS(Hadoop Distributed File System)和MapReduce
- Hadoop是一个能够对大量数据进行分布式处理的软件框架,并且是以一种可靠、高效、可伸缩的方式进行处理的
项目结构
应用框架
版本演变
项目结构
组件 | 功能 |
---|---|
HDFS | 分布式文件系统 |
MapReduce | 分布式并行编程模型 |
YARN | 资源管理和调度器 |
Tez | 运行在YARN之上的下一代Hadoop查询处理框架 |
Hive | Hadoop上的数据仓库 |
HBase | Hadoop上的非关系型的分布式数据库 |
Pig | 一个基于Hadoop的大规模数据分析平台,提供类似SQL的查询语言Pig |
Sqoop | 用于在Hadoop与传统数据库之间进行数据传递 |
Oozie | Hadoop上的工作流管理系统 |
Zookeeper | 提供分布式协调一致性服务 |
Storm | 流计算框架 |
Flume | 一个高可用的,高可靠的,分布式的海量日志采集、聚合和传输的系统 |
Ambari | Hadoop快速部署工具,支持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文件。
这里还没搞清楚的疑问:
- “哪些块储存在哪个数据节点”和“数据节点会把自己包含哪些块告知名称节点”,“映射关系”有什么区别。
- 为什么说没有“记录文件包含哪些块以及每个块存储在哪个数据节点”呢,明明名称节点维护一个称为"块映射表(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
局限性
- 命名空间的限制:名称节点是保存在内存中的,因此,名称节点能够容纳的对象(文件、块)的个数会受到内存空间大小的限制。
- 性能的瓶颈:整个分布式文件系统的吞吐量,受限于单个名称节点的吞吐量。
- 隔离问题:由于集群中只有一个名称节点,只有一个命名空间,因此,无法对不同应用程序进行隔离。
- 集群的可用性:一旦这个唯一的名称节点发生故障,会导致整个集群变得不可用。
储存原理
冗余数据保存
为了保证系统的容错性和可用性,HDFS采用了多副本方式对数据进行冗余存储,通常一个数据块的多个副本会被分布到不同的数据节点上,优点:
(1)加快数据传输速度
(2)容易检查数据错误
(3)保证数据可靠性文章来源:https://www.toymoban.com/news/detail-815414.html
数据存取策略
存
- 第一个副本:放置在上传文件的数据节点;如果是集群外提交,则随机挑选一台磁盘不太满、CPU不太忙的节点
- 第二个副本:放置在与第一个副本不同的机架的节点上
- 第三个副本:与第一个副本相同机架的其他节点上
- 更多副本:随机节点
取
HDFS提供了一个API可以确定一个数据节点所属的机架ID,客户端也可以调用API获取自己所属的机架ID
当客户端读取数据时,从名称节点获得数据块不同副本的存放位置列表,列表中包含了副本所在的数据节点,可以调用API来确定客户端和这些数据节点所属的机架ID,当发现某个数据块副本对应的机架ID和客户端对应的机架ID相同时,就优先选择该副本读取数据,如果没有发现,就随机选择一个副本读取数据文章来源地址https://www.toymoban.com/news/detail-815414.html
数据错误与恢复
- 名称节点出错
HDFS设置了备份机制,把这些核心文件同步复制到备份服务器SecondaryNameNode上。当名称节点出错时,就可以根据备份服务器SecondaryNameNode中的FsImage和Editlog数据进行恢复。 - 数据节点出错
- 每个数据节点会定期向名称节点发送“心跳”信息,向名称节点报告自己的状态
- 当数据节点发生故障,或者网络发生断网时,名称节点就无法收到来自一些数据节点的心跳信息,这时,这些数据节点就会被标记为“宕机”,节点上面的所有数据都会被标记为“不可读”,名称节点不会再给它们发送任何I/O请求
- 这时,有可能出现一种情形,即由于一些数据节点的不可用,会导致一些数据块的副本数量小于冗余因子
- 名称节点会定期检查这种情况,一旦发现某个数据块的副本数量小于冗余因子,就会启动数据冗余复制,为它生成新的副本
- HDFS和其它分布式文件系统的最大区别就是可以调整冗余数据的位置
- 数据出错
- 网络传输和磁盘错误等因素,都会造成数据错误
- 客户端在读取到数据后,会采用md5和sha1对数据块进行校验,以确定读取到正确的数据
- 在文件被创建时,客户端就会对每一个文件块进行信息摘录,并把这些信息写入到同一个路径的隐藏文件里面
- 当客户端读取文件的时候,会先读取该信息文件,然后,利用该信息文件对每个读取的数据块进行校验,如果校验出错,客户端就会请求到另外一个数据节点读取该文件块,并且向名称节点报告这个文件块有错误,名称节点会定期检查并且重新复制这个块
到了这里,关于hadoop与hdfs的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!