Hadoop从入门到宕机

Hadoop

1.介绍&概览

Hadoop是一个开源的分布式计算平台,用于存储和处理大规模数据集。它的核心组件包括HDFS(Hadoop分布式文件系统)用于存储大数据集,YARN用于管理和调度资源以及MapReduce用于并行处理这些数据。

2.特点

Hadoop在大规模数据处理中被广泛应用的原因主要有以下几点优势:

  • 可靠性和容错性:Hadoop通过数据复制和分布式存储实现高可靠性和容错性,即使有节点故障也不会丢失数据。
  • 横向扩展性:Hadoop集群可以轻松扩展,通过增加节点来处理更大规模的数据。
  • 成本效益:Hadoop是基于廉价的标准硬件构建的,相对于传统的大型数据仓库解决方案,具有更低的成本。
  • 处理多样化数据:Hadoop可以处理结构化数据、半结构化数据和非结构化数据,适用于各种类型的大数据处理场景。

至于劣势,则是实时性较差等。

3.分布式存储系统核心属性

无限扩展支撑海量数据存储:

  • 特点: 分布式存储系统能够无缝地扩展以支持大规模数据存储需求。系统能够轻松地添加新的节点,从而提供对海量数据的持续支持,而不会遭遇性能瓶颈。

元数据记录:

  • 特点: 分布式存储系统记录关于存储的元数据信息,这包括文件的位置、大小、权限等信息。这样的元数据记录使得系统能够快速定位文件位置,实现高效的文件查找和访问。

分块存储:

  • 特点: 存储系统将大文件划分成小块,并分布存储在多个节点上。这种分块存储的方式允许对数据进行并行操作,从而提高系统的读写效率。同时,也使得系统能够更好地应对大规模数据的存储和处理需求。

    (HDFS中的文件在物理上是分块存储的default block = 128M,参数位于hdfs-default.xml中的dfs.blocksize)

副本机制:

  • 特点: 为了保障数据的安全性和容错性,分布式存储系统通常采用副本机制。系统会将数据的多个副本存储在不同的节点上,确保即使发生节点故障,数据仍然可用。冗余的存储机制提高了系统的可靠性和容错性。

4.HDFS集群

HDFS(Hadoop分布式文件系统)是Hadoop的核心组件之一,用于存储大规模数据集。它的作用是将大文件切分成多个数据块并存储在集群中的多个节点上,以实现数据的可靠存储和高效访问。HDFS的特点包括高容错性、高吞吐量、适合大文件存储等。

在Hadoop中处理节点故障的方式主要包括数据复制和任务重新调度。当一个节点发生故障时,HDFS会自动寻找该节点上的数据的副本所在的节点上,以确保数据的可靠性。同时,YARN会重新调度失败的任务到其他可用节点上继续执行,以确保作业的完成。

NameNode

NameNode 是分布式环境中的主节点,它维护存储在 HDFS 中的数据块的元数据信息,如块位置、复制因子等。

DataNode

DataNode是Hadoop分布式文件系统(HDFS)的另一个关键组件,负责存储实际的数据块。每个DataNode节点都负责存储一部分HDFS中的数据块。

Secondary NameNode:

Secondary NameNode并不是NameNode的备份,而是用于协助NameNode的辅助节点。其主要任务是定期合并和压缩NameNode的编辑日志(Edit Log),以避免其过度增长。

HDFS读数据步骤

HDFS读数据步骤

  1. Client向NameNode发起RPC请求,确定文件block位置。
  2. NameNode返回block列表和每个block的DataNode地址。
  3. DataNode地址按照集群拓扑结构排序,考虑网络距离和心跳机制的状态。
  4. Client选取排序靠前的DataNode读取block,若为本地DataNode,则直接获取数据。
  5. 通过建立Socket Stream(FSDataInputStream),循环调用read方法读取数据块。
  6. 每读取一个block进行checksum验证,出现错误时通知NameNode并从其他DataNode备份读取。
  7. 最终合并所有block形成完整文件。

HDFS写数据步骤

HDFS写数据步骤

  1. Client通过RPC请求向NameNode上传文件,NameNode检查文件和权限信息,若通过则创建文件记录,否则返回异常信息。
  2. Client请求NameNode确定第一个block的DataNode地址,根据备份策略选择可用的DataNode(例如 A、B、C)。
  3. Client向选定的DataNode A 发起上传请求,建立pipeline,依次调用 B、C,并逐级返回给 Client。
  4. Client开始向 A 上传第一个block,以64K的packet为单位,A传递给 B,B传递给 C,每传一个packet放入应答队列等待应答。
  5. 若某DataNode在写数据时宕机,系统会执行透明的恢复步骤,确保数据不丢失,并完成未写完的block的备份。
  6. 数据通过pipeline传输,逐个发送ack,最终由第一个DataNode A 将ack发送给Client。
  7. 当一个block传输完成后,Client再次请求NameNode上传下一个block。

5.MapReduce

MapReduce是一种用于处理和生成大规模数据集的编程模型和处理引擎。

思想核心是“先分再合,分而治之”。

MapReduce的核心思想分为两个阶段:Map阶段和Reduce阶段

MapReduceWordCount为例子

Map阶段

在MapTask执行时,输入数据来源于HDFS的Block。默认情况下,每个Split对应一个Block。在WordCount例子中,假设Map的输入数据是字符串“aaa”。

  1. 切分输入数据: 输入数据按照一定的标准逐个进行逻辑切片。
  2. Mapper任务执行: 调用Mapper类中的mapper方法处理数据,按照一定规则读取解析返回<K,V>对。
  3. 内存缓冲区: 然后数据发送到环形缓冲区,默认大小100MB,达到一定比例(80%)就会溢写到磁盘上。
  4. 在写入磁盘之前,会根据数据要传输的reducer把数据划分成相应的分区。在每个分区中按键值对数据进行排序,如果有combiner函数,就会在排序之后运行,combiner函数使得map输出结果更紧凑,减少磁盘写入与读取的数据。
  5. Merge(合并): 最终,MapTask完成时,所有溢写文件将被合并成一个已分区已排序的文件。即使Map的输出很小,也至少会有一个溢写文件存在。

Reduce阶段

  1. Copy阶段: 每个Reduce复制对应分区的数据。
  2. Merge阶段: 拉取所有数据后先进行合并然后再进行一次排序。
  3. Reducer输出文件: 对排序后的<K,V>对调用reduce方法。key相等的会合并在一起。最终数据写入HDFS文件中。

ReShuffle机制

Map方法之后Reduce方法之前这段处理过程叫Shuffle。

Map阶段之后:

  1. 内存缓冲区: 然后数据发送到环形缓冲区,默认大小100MB,达到一定比例(80%)就会溢写到磁盘上,溢出的时候会根据key进行排序。
  2. 在写入磁盘之前,会根据数据要传输的reducer把数据划分成相应的分区。在每个分区中按键值对数据进行排序,如果有combiner函数,就会在排序之后运行,combiner函数使得map输出结果更紧凑,减少磁盘写入与读取的数据量。
  3. Merge(合并): 最终,MapTask完成时,所有溢写文件将被归并成一个文件。即使Map的输出很小,也至少会有一个溢写文件存在。

Reduce阶段之前:

  1. Copy阶段: 每个Reduce复制拉取对应分区的数据。
  2. Merge阶段: 拉取所有数据后先进行合并然后再进行一次排序。

6.YARN集群

Hadoop YARN(Yet Another Resource Negotiator)是Hadoop的一个集群资源管理器,用于有效地管理和调度集群中的资源

YARN集群

特点和主要组件

  1. 分离资源管理与计算调度: YARN将资源管理(Resource Manager)和作业调度(Application Master)分离,使得Hadoop集群可以同时运行多个应用程序。
  2. Resource Manager: 负责整个集群的资源管理,分配和监控。它接收来自各个Node Manager的资源报告,并根据应用程序的需求动态分配资源。
  3. Node Manager: 运行在集群中的每个节点上,负责监控本地资源使用情况,并向Resource Manager报告可用资源。
  4. Application Master: 用于管理特定应用程序的资源请求、分配和监控。每个应用程序都有一个独立的Application Master。
  5. Container: YARN使用容器的概念,将资源划分为容器,并动态分配给不同应用程序的任务。

工作流程

工作流程

1.用户通过客户端向YARN的ResourceManager提交应用程序,ResourceManager为应用程序分配第一个容器,并要求NodeManager启动ApplicationMaster。
2. 一旦ApplicationMaster启动成功,它向ResourceManager注册,允许用户通过ResourceManager查看应用程序运行状态。
3. ApplicationMaster为程序内的任务向ResourceManager申请资源,并监控任务状态。一旦资源分配成功,ApplicationMaster与对应的NodeManager通信,要求启动任务。
4. NodeManager设置任务运行环境,将任务启动命令写入脚本,并通过运行脚本启动任务。
5. 各个任务通过RPC向ApplicationMaster汇报状态和进度,使其随时了解任务运行情况。在应用程序运行期间,用户可通过RPC向ApplicationMaster查询当前运行状态。
6. 应用程序完成后,ApplicationMaster注销并关闭自身。

调度器策略

FIFO Scheduler(先进先出调度器)

特点:

  • 简单而直观的调度器,按照作业提交的先后顺序依次分配资源。
  • 不考虑作业的资源需求和优先级。

适用场景:

  • 适用于小型集群或者对调度性能要求不高的场景。
  • 任务的优先级不会变高,因此高优先级的作业需要等待。不适合需要灵活性、资源隔离和更复杂调度需求的大规模集群。

Capacity Scheduler(容量调度器)

特点:

  • 多队列调度器,每个队列有独立的资源配额。
  • 可以为不同的用户或应用程序分配独立的资源。
  • 在一个队列内部,资源的调度是采用的是先进先出(FIFO)策略。

优势:

  • 更灵活,支持队列的层次结构,能够更精细地控制资源分配。
  • 在运行时可以动态调整队列的资源配额。

Capacity Scheduler

Fair Scheduler(公平调度器)

特点:

  • 公平调度器试图在所有应用程序之间平均分配资源,避免某个应用长时间占用全部资源。
  • 不同应用程序之间的资源分配更为公正。

适用场景:

  • 适用于需要公平分享集群资源的场景,防止某个应用长时间占用全部资源。

特殊特性:

  • 支持动态资源池调整和作业优先级,更注重公平性。
  • 通过权重和最小份额来实现对资源的公平分配。
如何理解公平共享
  • 有两个用户A和B,每个用户都有自己的队列。

  • A启动一个作业,由于没有B的需求,它分配了集群所有可用的资源。

  • 然后B在A的作业仍在运行时启动了一个作业,经过一段时间,A,B各自作业都使用了一半的资源。

  • 现在,如果B用户在其他作业仍在运行时开始第二个作业,它将与B的另一个作业共享其资源,因此B的每个作业将

  • 拥有资源的四分之一,而A的继续将拥有一半的资源。

  • 结果是资源在用户之间公平地共享。
    Fair Scheduler

  • 26
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值