Hadoop 相关知识点(二)
阅读原文时间:2023年07月12日阅读:1

1、HDFS副本机制

Hadoopde 默认副本布局策略是

(1)在运行客户端的节点上放置第一个副本如果客户端运行在集群之外,就随机选择一个节点,不过系统会避免选择那些存储太满或者太忙的节点);

(2)第二个副本放置在与第一不同且随机另外选择的机架节点上;

(3)第三个副本放置在与第二个副本在同一机架上,且随机选择的另外的一个节点上;

(4)其他的副本放置在随机选择的另外的节点上,不过系统会避免在同一个机架上防止太多的副本。

一旦选择了副本的放置位置,就会根据网络拓扑创建一个管线。例如副本数为3,如下图

这种方法的好处就在于

减少了机架间的数据传输,提高了写操作的效率,因为数据块只存放在两个不同的机架上,减少了读取数据时需要的网络传输总带宽。这样在一定程度上兼顾了数据安全和网络传输的开销。

2、Hadoop1.0与Hadoop2.0的区别

一、从Hadoop整体框架来说

  Hadoop1.0即第一代Hadoop,由分布式存储系统HDFS和分布式计算框架MapReduce组成,其中HDFS由一个NameNode和多个DateNode组成,MapReduce由一个JobTracker和多个TaskTracker组成。

  Hadoop2.0即第二代Hadoop为克服Hadoop1.0中的不足:针对Hadoop1.0单NameNode制约HDFS的扩展性问题,提出HDFS Federation,它让多个NameNode分管不同的目录进而实现访问隔离和横向扩展,同时彻底解决了NameNode单点故障问题;针对Hadoop1.0中的MapReduce在扩展性和多框架支持等方面的不足,它将JobTracker中的资源管理和作业控制分开,分别由ResourceManager(负责所有应用程序的资源分配)和ApplicationMaster(负责管理一个应用程序)实现,即引入了资源管理框架Yarn。同时Yarn作为Hadoop2.0中的资源管理系统,它是一个通用的资源管理模块,可为各类应用程序进行资源管理和调度,不仅限于MapReduce一种框架,也可以为其他框架使用,如Tez、Spark、Storm等

二、从MapReduce计算框架来讲

  MapReduce1.0计算框架主要由三部分组成:编程模型、数据处理引擎和运行时环境。它的基本编程模型是将问题抽象成Map和Reduce两个阶段,其中Map阶段将输入的数据解析成key/value,迭代调用map()函数处理后,再以key/value的形式输出到本地目录,Reduce阶段将key相同的value进行规约处理,并将最终结果写到HDFS上;它的数据处理引擎由MapTask和ReduceTask组成,分别负责Map阶段逻辑和Reduce阶段的逻辑处理;它的运行时环境由一个JobTracker和若干个TaskTracker两类服务组成,其中JobTracker负责资源管理和所有作业的控制,TaskTracker负责接收来自JobTracker的命令并执行它

  MapReducer2.0具有与MRv1相同的编程模型和数据处理引擎,唯一不同的是运行时环境。MRv2是在MRv1基础上经加工之后,运行于资源管理框架Yarn之上的计算框架MapReduce它的运行时环境不再由JobTracker和TaskTracker等服务组成,而是变为通用资源管理系统Yarn和作业控制进程ApplicationMaster,其中Yarn负责资源管理的调度而ApplicationMaster负责作业的管理

3、HDFS的读和写

1、写的过程

写详细步骤:

1、客户端发起请求:hadoop fs -put hadoop.tar.gz / 

客户端怎么知道请求发给那个节点的哪个进程?

因为客户端会提供一些工具来解析出来你所指定的HDFS集群的主节点是谁,以及端口号等信息,主要是通过URI来确定,

url:hdfs://hadoop1:9000 当前请求会包含一个非常重要的信息: 上传的数据的总大小

2、namenode会响应客户端的这个请求

namenode的职责: 1 管理元数据(抽象目录树结构) 用户上传的那个文件在对应的目录如果存在。那么HDFS集群应该作何处理,不会处理用户上传的那个文件要存储的目录不存在的话,如果不存在不会创建

2、响应请求 真正的操作:做一系列的校验, (1)、校验客户端的请求是否合理 (2)、校验客户端是否有权限进行上传 1、客户端向NameNode发出写文件请求。

3、如果namenode返回给客户端的结果是 通过, 那就是允许上传

namenode会给客户端返回对应的所有的数据块的多个副本的存放节点列表,如:

file1_blk1 hadoop02,hadoop03,hadoop04

file1_blk2 hadoop03,hadoop04,hadoop05

4、客户端在获取到了namenode返回回来的所有数据块的多个副本的存放地的数据之后,就可以按照顺序逐一进行数据块的上传操作

5、对要上传的数据块进行逻辑切片

切片分成两个阶段:

1、规划怎么切

2、真正的切 物理切片: 1 和 2

逻辑切片: 1

file1_blk1 : file1:0:128

file1_blk2 : file1:128:256

6、开始上传第一个数据块

7、客户端会做一系列准备操作

1、依次发送请求去连接对应的datnaode

pipline : client - node1 - node2 - node3

按照一个个的数据包的形式进行发送的。 每次传输完一个数据包,每个副本节点都会进行校验,依次原路给客户端

2、在客户端会启动一个服务:

用户就是用来等到将来要在这个pipline数据管道上进行传输的数据包的校验信息

客户端就能知道当前从clinet到写node1,2,3三个节点上去的数据是否都写入正确和成功

8、clinet会正式的把这个快中的所有packet都写入到对应的副本节点

1、block是最大的一个单位,它是最终存储于DataNode上的数据粒度,由dfs.block.size参数决定,2.x版本默认是128M;注:这个参数由客户端配置决定;如:System.out.println(conf.get(“dfs.blocksize”));//结果是134217728

2、packet是中等的一个单位,它是数据由DFSClient流向DataNode的粒度,以dfs.write.packet.size参数为参考值,默认是64K;注:这个参数为参考值,是指真正在进行数据传输时,会以它为基准进行调整,调整的原因是一个packet有特定的结构,调整的目标是这个packet的大小刚好包含结构中的所有成员,同时也保证写到DataNode后当前block的大小不超过设定值;

如:System.out.println(conf.get(“dfs.write.packet.size”));//结果是65536

3、chunk是最小的一个单位,它是DFSClient到DataNode数据传输中进行数据校验的粒度,由io.bytes.per.checksum参数决定,默认是512B;注:事实上一个chunk还包含4B的校验值,因而chunk写入packet时是516B;数据与检验值的比值为128:1,所以对于一个128M的block会有一个1M的校验文件与之对应;

如:System.out.println(conf.get(“io.bytes.per.checksum”));//结果是512

9、clinet进行校验,如果校验通过,表示该数据块写入成功

10、重复7 8 9 三个操作,来继续上传其他的数据块

11、客户端在意识到所有的数据块都写入成功之后,会给namenode发送一个反馈,就是告诉namenode当前客户端上传的数据已经成功。

读的过程:

读的步骤

1、客户端调用FileSystem 实例的open 方法,获得这个文件对应的输入流InputStream。

2、通过RPC 远程调用NameNode ,获得NameNode 中此文件对应的数据块保存位置,包括这个文件的副本的保存位置( 主要是各DataNode的地址) 。

3、获得输入流之后,客户端调用read 方法读取数据。选择最近的DataNode 建立连接并读取数据。

4、如果客户端和其中一个DataNode 位于同一机器(比如MapReduce 过程中的mapper 和reducer),那么就会直接从本地读取数据。

5、到达数据块末端,关闭与这个DataNode 的连接,然后重新查找下一个数据块。

6、不断执行第2 - 5 步直到数据全部读完。

7、客户端调用close ,关闭输入流DFS InputStream。

4、yarn框架 

Apache Yarn是Hadoop的一个集群资源管理框架。YARN被引入Hadoop 2,最初是为了改善MapReduce的实现,但是他具有足够的通用性,同样可以支持其他的分布式计算模式。

运行机制

YARN通过两类长期运行的守护进程提供自己的和核心服务:管理集群上的资源使用的ResourceManager 运行在集群中所有节点上的而且能够启动和监控容器(container)的节点管理器(Node Manager)容器是用于执行特定应用程序的进程,每个容器都有资源限制(内存、CPU等)。一个容器可以是一个Unix进程,也乐意是一组Linux cgroup取决于Yarn的配置。

主要有三大模块RM NM AM

其中,ResourceManager负责所有资源的监控、分配和管理;ApplicationMaster负责每一个具体应用程序的调度和协调;NodeManager负责每一个节点的维护。对于所有的applications,RM拥有绝对的控制权和对资源的分配权。而每个AM则会和RM协商资源,同时和NodeManager通信来执行和监控task。

为了在Yarn上运行一个应用,首先,客户端联系资源管理器,要求他运行一个application Master进程。然后,资源管理器找到一个能够在容器中启动application Master的节点管理器。 application Master一旦运行起来做些什么依赖于应用本身。每一个MapReduce作业都会有一个application Master。

ResourceManager的功能有

1、ResourceManager负责整个集群的资源管理和分配,是一个全局的资源管理系统。

2、NodeManager以心跳的方式向ResourceManager汇报资源使用情况(目前主要是CPU和内存的使用情况)。RM只接受NM的资源回报信息,对于具体的资源处理则交给NM自己处理。

3、YARN Scheduler根据application的请求为其分配资源,不负责application

job的监控、追踪、运行状态反馈、启动等工作。

NodeManager的作用有

1、 NodeManager是每个节点上的资源和任务管理器,它是管理这台机器的代理,负责该节点程序的运行,以及该节点资源的管理和监控。YARN集群每个节点都运行一个NodeManager。

/2、NodeManager定时向ResourceManager汇报本节点资源(CPU、内存)的使用情况和Container的运行状态。当ResourceManager宕机时NodeManager自动连接RM备用节点。

/3、NodeManager接收并处理来自ApplicationMaster的Container启动、停止等各种请求。

ApplicationMaster的作用有:

1、用户提交的每个应用程序均包含一个ApplicationMaster,它可以运行在ResourceManager以外的机器上。

2、负责与RM调度器协商以获取资源(用Container表示)。

3、将得到的任务进一步分配给内部的任务(资源的二次分配)。

4、与NM通信以启动/停止任务。

5、监控所有任务运行状态,并在任务运行失败时重新为任务申请资源以重启任务。

6、当前YARN自带了两个ApplicationMaster实现,一个是用于演示AM编写方法的实例程序DistributedShell,它可以申请一定数目的Container以并行运行一个Shell命令或者Shell脚本;另一个是运行MapReduce应用程序的AM—MRAppMaster。

注:RM只负责监控AM,并在AM运行失败时候启动它。RM不负责AM内部任务的容错,任务的容错由AM完成。

参考文章:

https://blog.csdn.net/u012050154/article/details/52353545

https://www.cnblogs.com/qingyunzong/p/8548806.html

https://www.cnblogs.com/BYRans/p/5513991.html