博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Hadoop基础概念
阅读量:4621 次
发布时间:2019-06-09

本文共 3946 字,大约阅读时间需要 13 分钟。

Apache Hadoop有2个核心的组件,他们分别是:

HDFS: HDFS是一个分布式文件系统集群,它可以将大的文件分裂成块并将他们冗余地分布在多个节点上,HDFS是运行在用户空间的文件系统

MapReduce: MapReduce是函数式编程领域分布式计算中的一个编程模型,这个模型是专门用于查询/处理存储在HDFS中的大量数据

 

HDFS

NameNode

namenode将整个源数据维护在内存中,这有助于客户端接收快速响应读取请求。因此运行namenode的机器需要很大的内存。文件的数量越多,内存消耗的越多

namenode也维护存储在磁盘上的持久元数据,称为 fsimage
当在集群中 placed/deleted/updated文件时,这些操作会在edits文件中更新,更新edits日志后,在内存中的元数据也相应更新
每次写入操作都不会更新fsimage

重启namenode会发生以下事件:

  1. 从磁盘读取fsimage文件加载到内存中
  2. 读取edits日志文件中的每个操作,并把这些操作在内存中应用到fsimage
  3. 把fsimage持久化到磁盘

 

Secondary namenode

因为fsimage文件并不会更新每次操作,而edits 日志文件可能会变得非常大,当namenode需要重启的时候,edits日志文件需要合并到fsimage,这会使得重启变得非常慢,而secondary namenode可以解决这个问题

secondary namenode负责定期执行合并来自namenode的edits日志文件和fileimage

如果namenode进程失败,可以利用secondary namenode合并的数据重建文件系统元数据,因为secondary namenode是定时 checkpoint数据,因此会存在一些数据丢失的情况

注意:secondary namenode并不是故障转移节点

  1. 从namenode获取edits日志文件
  2. 从namenode获取 fsimage文件
  3. 将eidts日志中的所有操作应用到fsimage中
  4. 把fsimage推送到namenode

上面的操作是周期性的执行,因此无论何时重启namenode,它都会有一个相对较新的fsimage,这样启动时间就会快很多

 

DataNode

datanode是负载存储实际文件的节点,这些文件作为数据块在集群中进行分割,通常是128MB大小的块,块的大小是可以配置的。Hadoop集群中文件块还会将自己复制到其他的datanode冗余,以便在datanode进程失败的时候不会丢失数据,datanode向namenode发送存储在该节点的文件块的信息,并响应所有的namenode文件系统的操作

 上图示例,文件A、B和C文件块被复制到集群多个节点上冗余,这确保了即使其中一个节点故障,数据仍然可用。这个集群的复制因子为3,表示文件文件块被复制了3次。namenode维护文件在集群中的位置列表,当有客户端需要访问一个文件,namenode会向客户端提供文件在哪个数据节点上,然后客户端会直接从数据节点访问文件

 

YARN

YARN是在Hadoop集群中处理数据的一个通用的分布式应用程序管理框架, YARN解决了一下两个重要问题:

  • 支持大的集群(4000+节点)
  • 能够运行MapReduce之外的其他应用程序已经存储在HDFS中的数据,例如MPI和Apache Giraph

YARN 资源管理框架包括 ResourceManager(资源管理器)、Applica-tionMaster、NodeManager(节点管理器)。各个组件描述如下

(1)ResourceManager

ResourceManager 是一个全局的资源管理器,负责整个系统的资源管理和分配。它主要由两个组件构成:调度器(Scheduler)和应用程序管理器(ApplicationManager,AM)。
Scheduler 负责分配最少但满足 Application 运行所需的资源量给 Application。Scheduler 只是基于资源的使用情况进行调度,并不负责监视/跟踪 Application 的状态,当然也不会处理失败的 Task。
ApplicationManager 负责处理客户端提交的 Job 以及协商第一个 Container 以供 App-licationMaster 运行,并且在 ApplicationMaster 失败的时候会重新启动 ApplicationMaster(YARN 中使用 Resource Container 概念来管理集群的资源,Resource Container 是资源的抽象,每个 Container 包括一定的内存、IO、网络等资源)。

(2)ApplicationMaster

ApplicatonMaster 是一个框架特殊的库,每个 Application 有一个 ApplicationMaster,主要管理和监控部署在 YARN 集群上的各种应用。

(3)NodeManager

主要负责启动 ResourceManager 分配给 ApplicationMaster 的 Container,并且会监视 Container 的运行情况。在启动 Container 的时候,NodeManager 会设置一些必要的环境变量以及相关文件;当所有准备工作做好后,才会启动该 Container。启动后,NodeManager 会周期性地监视该 Container 运行占用的资源情况,若是超过了该 Container 所声明的资源量,则会 kill 掉该 Container 所代表的进程。

提交作业给YARN一系列步骤

  1. 当作业提交的集群,Client第一个接收到来自ResourceManager的应用程序ID
  2. 接下来,Client将作业资源复制到HDFS中的一个位置
  3. 然后,ResourceManager启动第一个容器NodeManager管理调出ApplicationMaster
  4. ApplicationMaster基于要执行的作业,请求资源来自ResourceManager
  5. 一旦ResourceManager调度具有请求的容器资源,ApplicationMaster联系NodeManager启动容器并执行任务。 在MapReduce作业的情况下,该任务将是一个map或reduce任务。
  6. 客户端检查ApplicationMaster以获取状态更新提交的工作

 

The read/write operational flow in HDFS

为了更好的理解HDFS,我们需要知道 HDFS是如何进行以下操作的

  • A file is written to HDFS
  • A file is read from HDFS

HDFS uses a single-write, multiple-read model, where the files are writtern once and read several time.The data cannot be altered once written. However, data can be appended to the file by reopening it(只能追加,不能修改).All files in the HDFS are saved as data blocks.

 Writing files in HDFS

  1.  client 告知namenode它想要write a file, namenode检查该文件是否已经存在
  2.  如果存在,将会返回一个消息给client,如果不存在,namenode会给这个新文件创建一个metadata(元数据)
  3.  client会将文件分成数据包并建立数据队列,然后将队列中的数据包以流的形式发送给集群中的datanode
  4.  namenode维护了datanode信息列表,并且配置好了数据副本因子,namenode 提供datanode构建管道执行写入
  5.  然后将来自数据队列中的第一个数据包传输到第一个datanode,第一个datanode存储了该数据block,然后复制给管道的下一个datanode,这个过程将一直持续到数据包被写入最后一个datanode
  6.  每一个写在databode上的数据包,会进行确认发送给client
  7.  如果数据包无法写入其中一个datanode,那么该datanode会从管道中 删除,并且把其余的数据包写入到正常的datanode. namenode意识到副本数不足,会安排另一个datanode进行复制
  8.  写入所有数据包后,client执行关闭操作,指示数据队列中的数据包已完全传输
  9. client通知namenode写操作已经完成了

 Reading files in HDFS

  1. client连接namenode获取要读取的文件数据块的位置
  2. namenode返回数据块所在datanode地址列表
  3. 对于任何读取操作,HDFS会尝试使用datanode网络最接近client的数据返回
  4. client有了列表后,就会连接datanode然后以流式进行读取数据块
  5. 在一个datanode读取完块后,终止该datanode连接并与承载序列中下一个块的datanode进行数据块传输。这个过程将持续到该文件的最后一个块被读取完

 

转载于:https://www.cnblogs.com/sellsa/p/11213682.html

你可能感兴趣的文章
create-react-app 配置sass
查看>>
02_关系数据库
查看>>
在win7电脑中如何查看运行进程的PID标识符
查看>>
[Vue] vue-cli3.0安装
查看>>
C++学习之字符串
查看>>
图像化列表
查看>>
2014年10月9日——语言基础2
查看>>
mysql查
查看>>
[正则表达式]难点和误区
查看>>
217. Contains Duplicate
查看>>
hadoop遇到问题总结
查看>>
Windows下手动安装redis服务
查看>>
把 MongoDB 当成是纯内存数据库来使用(Redis 风格)
查看>>
PyTorch 1.0 中文官方教程:使用ONNX将模型从PyTorch传输到Caffe2和移动端
查看>>
LeetCode 4Sum
查看>>
BBC-The Race and a quiz
查看>>
大端小端
查看>>
IntelliJ IDEA 把java项目导出成可执行的jar
查看>>
DynamicReports
查看>>
鼠标经过图像改变实现
查看>>