大家好,我是不温卜火,昵称来源于成语—
不温不火
,本意是希望自己性情温和
。作为一名互联网行业的小白,博主写博客一方面是为了记录自己的学习过程,另一方面是总结自己所犯的错误希望能够帮助到很多和自己一样处于起步阶段的萌新。但由于水平有限,博客中难免会有一些错误出现,有纰漏之处恳请各位大佬不吝赐教!博客主页:https://buwenbuhuo.blog.csdn.net/
此系列主要为我的学弟学妹们所创作,在某些方面可能偏基础。如果读者感觉较为简单,还望见谅!如果文中出现错误,欢迎指正~ 本文主要介绍了Hadoop再探讨High Availability(HA)及YARN原理介绍,除此之外还有High Availability(HA)集群搭建的具体搭建过程。
Hadoop1.0的核心组件(仅指MapReduce和HDFS,不包括Hadoop生态系统内的Pig、Hive、HBase等其他组件)
主要存在以下不足:
Hadoop的优化与发展主要体现在两个方面:
1. 框架的不断改进
Hadoop框架从1.0到2.0自身的改进如下表所示:
组件 | Hadoop1.0的问题 | Hadoop2.0的改进 |
---|---|---|
HDFS | 单一名称节点,存在单点失效问题 | 设计了HDFS HA,提供名称节点热备机制 |
HDFS | 单一命名空间,无法实现资源隔离 | 设计了HDFS Federation,管理多个命名空间 |
MapReduce | 资源管理效率低 | 设计了新的资源管理框架YARN |
2. 生态系统的不断完善生态体系
Hadoop的生态体系一直在不断完善,如下表所示:
组件 | 功能 | 解决Hadoop中存在的问题 |
---|---|---|
Pig | 处理大规模数据的脚本语言,用户只需要编写几条简单的语句,系统会自动转换为MapReduce作业 | 抽象层次低,需要手工编写大量代码 |
Spark | 基于内存的分布式并行编程框架,具有较高的实时性,并且较好支持迭代计算 | 延迟高,而且不适合执行迭代计算 |
Oozie | 工作流和协作服务引擎,协调Hadoop上运行的不同任务 | 没有提供作业(Job)之间依赖关系管理机制,需要用户自己处理作业之间依赖关系 |
Tez | 支持DAG作业的计算框架,对作业的操作进行重新分解和组合,形成一个大的DAG作业,减少不必要操作 | 不同的MapReduce任务之间存在重复操作,降低了效率 |
Kafka | 分布式发布订阅消息系统,一般作为企业大数据分析平台的数据交换枢纽,不同类型的分布式系统可以统一接入到Kafka,实现和Hadoop各个组件之间的不同类型数据的实时高效交换 | Hadoop生态系统中各个组件和其他产品之间缺乏统一的、高效的数据交换中介 |
在了解HDFS2.0的新特征之前,我们需要先来回顾下HDFS1.0组件及其功能。
HDFS的主要组件包括NaneNode
和DataNode
,其主要组件的功能如下图。
名称节点(NameNode)记录了每个文件中各个块所在的数据节点的位置信息。其结构图如下:
1. 名称节点(NameNode)的数据结构
在HDFS
中,名称节点(NameNode
)负责管理分布式文件系统的命名空间(Namespace
),保存了两个核心的数据结构,即FsImage
和EditLog
FsImage
用于维护文件系统树以及文件树中所有的文件和文件夹的元数据EditLog
中记录了所有针对文件的创建、删除、重命名等操作1. 什么是第二名称节点,什么时候使用第二名称节点
第二名称节点是HDFS架构中的一个组成部分,它是用来保存名称节点中对HDFS 元数据信息的备份,并减少名称节点重启的时间。SecondaryNameNode一般是单独运行在一台机器上。
NameNode
运行期间会出现EditLog
不断变大的问题,这个时候就需要使用SecondaryNameNode
。
HDFS
的所有更新操作都是直接写到EditLog
中,久而久之, EditLog
文件将会变得很大FsImage
里面的所有内容映像到内存中,然后再一条一条地执行EditLog
中的记录,当EditLog
文件非常大的时候,会导致名称节点启动操作非常慢,而在这段时间内HDFS
系统处于安全模式,一直无法对外提供写操作,影响了用户的使用。2. SecondaryNameNode
工作机制
SecondaryNameNode的工作过程:
通过对HDFS1.0组件及其功能的回顾,我们可以知道HDFS 1.0存在单点故障问题,但是第二名称节点(SecondaryNameNode)无法解决单点故障这个问题。
在这里我们就要先来了解下第二名称节点(SecondaryNameNode)的用途:
那么为了解决单点故障这种问题,在HDFS 2.0设计了HDFS HA,来解决单点故障问题,其架构图如下图所示:
单点故障(英语:single point of failure,缩写SPOF)是指系统中某一点一旦失效,就会让整个系统无法运作,换句话说,单点故障即会整体故障。
高可用性(英语:high availability,缩写为 HA),IT术语,指系统无中断地执行其功能的能力,代表系统的可用性程度。是进行系统设计时的准则之一。高可用性系统意味着系统服务可以更长时间运行,通常通过提高系统的容错能力来实现。
高可用性或者高可靠度的系统不会希望有单点故障造成整体故障的情形。一般可以透过冗余的方式增加多个相同机能的部件,只要这些部件没有同时失效,系统(或至少部分系统)仍可运作,这会让可靠度提高。
1. 主备集群
解决单点故障,实现系统服务高可用的核心并不是让故障永不发生,而是让故障的发生对业务的影响降到最小。因为软硬件故障是难以避免的问题。
当下企业中成熟的做法就是给单点故障的位置设置备份,形成主备架构。通俗描述就是当主挂掉,备份顶上,短暂的中断之后继续提供服务。
常见的是一主一备架构,当然也可以一主多备。备份越多,容错能力越强,与此同时,冗余也越大,浪费资源。
2. Active、Standby
Active:主角色。活跃的角色,代表正在对外提供服务的角色服务。任意时间有且只有一个active对外提供服务。
Standby:备份角色。需要和主角色保持数据、状态同步,并且时刻准备切换成主角色(当主角色挂掉或者出现故障时),对外提供服务,保持服务的可用性。
在系统的高可用性里有个衡量其可靠性的标准——X个9,这个X是代表数字3-5。X个9表示在系统1年时间的使用过程中,系统可以正常使用时间与总时间(1年)之比。
可以看出,9越多,系统的可靠性越强,能够容忍的业务中断时间越少,但是要付出的成本更高。
1. 脑裂问题
脑裂(split-brain)是指“大脑分裂”,本是医学名词。在HA集群中,脑裂指的是当联系主备节点的"心跳线"断开时(即两个节点断开联系时),本来为一个整体、动作协调的HA系统,就分裂成为两个独立的节点。由于相互失去了联系,主备节点之间像"裂脑人"一样,使得整个集群处于混乱状态。脑裂的严重后果:
避免脑裂问题的核心是:保持任意时刻系统有且只有一个主角色提供服务。
2. 数据同步问题
主备切换保证服务持续可用性的前提是主备节点之间的状态、数据是一致的,或者说准一致的。如果说备用的节点和主节点之间的数据差距过大,即使完成了主备切换的动作,那也是没有意义的。
数据同步常见做法是:通过日志重演操作记录。主角色正常提供服务,发生的事务性操作通过日志记录,备用角色读取日志重演操作。
在Hadoop 2.0.0之前,NameNode是HDFS集群中的单点故障(SPOF)。每个群集只有一个NameNode,如果该计算机或进程不可用,则整个群集在整个NameNode重新启动或在另一台计算机上启动之前将不可用。
NameNode的单点故障从两个方面影响了HDFS群集的总可用性:
HDFS高可用性解决方案:在同一群集中运行两个(从3.0.0起,超过两个)冗余NameNode。这样可以在机器崩溃的情况下快速故障转移到新的NameNode,或者出于计划维护的目的由管理员发起的正常故障转移。
QJM全称Quorum Journal Manager,由cloudera公司提出,是Hadoop官方推荐的HDFS HA解决方案之一。
QJM中,使用zookeeper中ZKFC来实现主备切换;使用Journal Node(JN)集群实现edits log的共享以达到数据同步的目的。
1. ZKFailoverController(zkfc)
Apache ZooKeeper是一款高可用分布式协调服务软件,用于维护少量的协调数据。 Zookeeper的下列特性功能参与了HDFS的HA解决方案中:
ZKFailoverController(ZKFC)是一个新组件,它是一个ZooKeeper客户端。运行NameNode的每台计算机也都运行ZKFC,ZKFC的主要职责:
1. Fencing隔离机制
故障转移过程也就是俗称的主备角色切换的过程,切换过程中最怕的就是脑裂的发送。因此需要Fencing机制来避免,将先前的Active节点隔离,然后将本地NameNode转换为Active状态。
Hadoop公共库中对外提供了两种fenching实现,分别是sshfence和shellfence(缺省实现),其中sshfence是指通过ssh登陆目标节点上,使用命令fuser将进程杀死(通过tcp端口号定位进程pid,该方法比jps命令更准确),shellfence是指执行一个用户事先定义的shell命令(脚本)完成隔离。
Journal Node(JN)集群是轻量级分布式系统,主要用于高速读写数据、存储数据。通常使用2N+1台JournalNode存储共享Edits Log(编辑日志)。
任何修改操作在 Active NN上执行时,JournalNode进程同时也会记录edits log到至少半数以上的JN中,这时 Standby NN 监测到JN 里面的同步log发生变化了会读取JN里面的edits log,然后重演操作记录同步到自己的目录镜像树里面。
当发生故障Active NN挂掉后,Standby NN 会在它成为Active NN 前,读取所有的JN里面的修改日志,这样就能高可靠的保证与挂掉的NN的目录镜像树一致,然后无缝的接替它的职责,维护来自客户端请求,从而达到一个高可用的目的。
HA集群搭建的难度主要在于配置文件的编写,所以一定要小心仔细。搭建HDFS HA之前,你需要搭建好Hadoop集群,关于Hadoop集群如何搭建,此处只给出过程:
node01 | node02 | node03 |
---|---|---|
NameNode | NameNode | |
DataNode | DataNode | DataNode |
JournalNode | JournalNode | JournalNode |
ZK | ZK | ZK |
ZKFC | ZKFC |
1. 集群规划
在node01、node02和node03三个节点上部署Zookeeper。
2. 解压安装
1. 解压Zookeeper安装包到/opt/moudle目录下
hadoop@node01:/opt/software$ tar -zxvf apache-zookeeper-3.5.7-bin.tar.gz -C /opt/moudle/
hadoop@node01:/opt/moudle$ sudo chown -R hadoop:hadoop apache-zookeeper-3.5.7-bin
hadoop@node01:/opt/moudle$ sudo mv apache-zookeeper-3.5.7-bin zookeeper
2. 在/opt/moudle/zookeeper/这个目录下创建zkData
hadoop@node01:/opt/moudle/zookeeper$ mkdir -p zkData
3. 重命名/opt/moudle/zookeeper/conf这个目录下的zoo_sample.cfg为zoo.cfg
hadoop@node01:/opt/moudle/zookeeper/conf$ mv zoo_sample.cfg zoo.cfg
3. 配置zoo.cfg文件
1. 具体配置
# example sakes.
dataDir=/opt/moudle/zookeeper/zkData
#增加如下配置
#######################cluster##########################
server.2=node01:2888:3888
server.3=node02:2888:3888
server.4=node03:2888:3888
2. 配置参数解读
Server.A=B:C:D
集群模式下配置一个文件myid,这个文件在dataDir目录下,这个文件里面有一个数据就是A的值,Zookeeper启动时读取此文件,拿到里面的数据与zoo.cfg里面的配置信息比较从而判断到底是哪个server。
4. 集群操作
1. 在/opt/moudle/zookeeper/zkData目录下创建一个myid的文件
hadoop@node01:/opt/moudle/zookeeper/zkData$ touch myid
2. 编辑myid文件
hadoop@node01:/opt/moudle/zookeeper/zkData$ touch myid
在文件中添加与server对应的编号:如2
3. 拷贝配置好的zookeeper到其他机器上
hadoop@node01:/opt/moudle$ scp -r zookeeper/ hadoop@node02:/opt/moudle/
hadoop@node01:/opt/moudle$ scp -r zookeeper/ hadoop@node03:/opt/moudle/
由于第二篇文章已经讲解了集群分发脚本,所以我们也可以直接把要修改的配置文件同步过去。
一定要记得分别修改node02和node03中myid文件中内容哦!
4. 分别启动zookeeper
hadoop@node01:/opt/moudle/zookeeper$ bin/zkServer.sh start
hadoop@node02:/opt/moudle/zookeeper$ bin/zkServer.sh start
hadoop@node03:/opt/moudle/zookeeper$ bin/zkServer.sh start
5. 查看zookeeper状态
hadoop@node01:/opt/moudle/zookeeper$ bin/zkServer.sh status
6. 停止zookeeper
hadoop@node01:/opt/moudle/zookeeper$ bin/zkServer.sh stop
5. 群起、群闭、查看群体状态脚本
分别启动是否感觉很麻烦,下面给出简便脚本,如果感兴趣,可以自行使用。 1. 群起脚本
# 输入以下内容
for i in `cat /opt/moudle/hadoop/etc/hadoop/workers`
do
echo "========== $i =========="
ssh $i 'source /etc/profile;/opt/moudle/zookeeper/bin/zkServer.sh start'
echo $i " zookeeper is start"
done
2. 群闭脚本
# 输入以下内容
for i in `cat /opt/moudle/hadoop/etc/hadoop/workers`
do
echo "========== $i =========="
ssh $i 'source /etc/profile;/opt/moudle/zookeeper/bin/zkServer.sh stop'
echo $i " zookeeper is stop"
done
3. 查看群体状态脚本
# 输入以下内容
for i in `cat /opt/moudle/hadoop/etc/hadoop/workers`
do
echo "========== $i =========="
ssh $i 'source /etc/profile;/opt/moudle/zookeeper/bin/zkServer.sh status'
echo $i "who is zookeeper's leader "
done
1. 在opt目录下创建一个ha文件夹
hadoop@node01:/opt$ sudo mkdir ha
2.将hadoop拷贝到/opt/ha目录下
hadoop@node01:/opt$ sudo cp -r /opt/moudle/hadoop/ /opt/ha/
hadoop@node01:/opt/ha$ sudo chown -R hadoop:hadoop hadoop/
3.配置hadoop-env.sh
hadoop@node01:/opt/ha/hadoop/etc/hadoop$ vim hadoop-env.sh
export JAVA_HOME=/opt/moudle/jdk1.8
4.配置core-site.xml
<configuration>
<!-- 把两个NameNode)的地址组装成一个集群mycluster -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://mycluster</value>
</property>
<!-- 指定hadoop运行时产生文件的存储目录 -->
<property>
<name>hadoop.tmp.dir</name>
<value>/opt/ha/hadoop/data/tmp</value>
</property>
</configuration>
5.配置hdfs-site.xml
<configuration>
<!-- 完全分布式集群名称 -->
<property>
<name>dfs.nameservices</name>
<value>mycluster</value>
</property>
<!-- 集群中NameNode节点都有哪些 -->
<property>
<name>dfs.ha.namenodes.mycluster</name>
<value>nn1,nn2</value>
</property>
<!-- nn1的RPC通信地址 -->
<property>
<name>dfs.namenode.rpc-address.mycluster.nn1</name>
<value>node01:9000</value>
</property>
<!-- nn2的RPC通信地址 -->
<property>
<name>dfs.namenode.rpc-address.mycluster.nn2</name>
<value>node02:9000</value>
</property>
<!-- nn1的http通信地址 -->
<property>
<name>dfs.namenode.http-address.mycluster.nn1</name>
<value>node01:50070</value>
</property>
<!-- nn2的http通信地址 -->
<property>
<name>dfs.namenode.http-address.mycluster.nn2</name>
<value>node02:50070</value>
</property>
<!-- 指定NameNode元数据在JournalNode上的存放位置 -->
<property>
<name>dfs.namenode.shared.edits.dir</name>
<value>qjournal://node01:8485;node02:8485;node03:8485/mycluster</value>
</property>
<!-- 配置隔离机制,即同一时刻只能有一台服务器对外响应 -->
<property>
<name>dfs.ha.fencing.methods</name>
<value>sshfence</value>
</property>
<!-- 使用隔离机制时需要ssh无秘钥登录-->
<property>
<name>dfs.ha.fencing.ssh.private-key-files</name>
<value>/home/hadoop/.ssh/id_rsa</value>
</property>
<!-- 声明journalnode服务器存储目录-->
<property>
<name>dfs.journalnode.edits.dir</name>
<value>/opt/ha/hadoop/data/jn</value>
</property>
<!-- 关闭权限检查-->
<property>
<name>dfs.permissions.enable</name>
<value>false</value>
</property>
<!-- 访问代理类:client,mycluster,active配置失败自动切换实现方式-->
<property>
<name>dfs.client.failover.proxy.provider.mycluster</name>
<value>org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider</value>
</property>
</configuration>
6.拷贝配置好的hadoop环境到其他节点
hadoop@node01:/opt/ha/hadoop$ scp -r hadoop/ hadoop@node02:/opt/ha
hadoop@node01:/opt/ha/hadoop$ scp -r hadoop/ hadoop@node03:/opt/ha
1.在各个JournalNode节点上,输入以下命令启动journalnode服务
hadoop@node01:/opt/ha/hadoop$ sbin/hadoop-daemon.sh start journalnode
2.在[nn1]上,对其进行格式化,并启动
hadoop@node01:/opt/ha/hadoop$ bin/hdfs namenode -format
hadoop@node01:/opt/ha/hadoop$ sbin/hadoop-daemon.sh start namenode
3.在[nn2]上,同步nn1的元数据信息
hadoop@node02:/opt/ha/hadoop$ bin/hdfs namenode -bootstrapStandby
4.启动[nn2]
hadoop@node02:/opt/ha/hadoop$ sbin/hadoop-daemon.sh start namenode
5.查看web页面显示
6.在[nn1]上,启动所有datanode
hadoop@node01:/opt/ha/hadoop$ sbin/hadoop-daemons.sh start datanode
7.将[nn1]切换为Active
hadoop@node01:/opt/ha/hadoop$ bin/hdfs haadmin -transitionToActive nn1
8.查看是否Active
hadoop@node01:/opt/ha/hadoop$ bin/hdfs haadmin -getServiceState nn1
active
1.具体配置
1. 在hdfs-site.xml中增加
<property>
<name>dfs.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
2. 在core-site.xml文件中增加
<property>
<name>ha.zookeeper.quorum</name>
<value>node01:2181,node02:2181,node03:2181</value>
</property>
3. 分发修改后的配置文件
hadoop@node01:/opt/ha/hadoop/etc/hadoop$ xsync hdfs-site.xml
hadoop@node01:/opt/ha/hadoop/etc/hadoop$ xsync core-site.xml
2. 启动
1. 关闭所有HDFS服务
hadoop@node01:/opt/ha/hadoop$ sbin/stop-dfs.sh
2. 启动Zookeeper集群
hadoop@node01:/opt/ha/hadoop$ start-allzk
3. 初始化HA在Zookeeper中状态
hadoop@node01:/opt/ha/hadoop$ bin/hdfs zkfc -formatZK
4. 启动HDFS服务
hadoop@node01:/opt/ha/hadoop$ sbin/start-dfs.sh
下面我们来和与设想的进程对比下:
经过对比,我们可以发现是没有任何问题的,这说明我们已经成功了,下面进行验证就可以了。
3. 验证
1.将Active NameNode进程kill
kill -9 namenode的进程id
hadoop@node01:/opt/ha/hadoop$ kill -9 5184
2.将Active NameNode机器断开网络
hadoop@node01:/opt/ha/hadoop$ service network stop
3.查看Active是否切换
使用kill -9模拟JVM崩溃。或者重新启动计算机电源或拔出其网络接口以模拟另一种故障。另一个NameNode应在几秒钟内自动变为活动状态。检测故障并触发故障转移所需的时间取决于ha.zookeeper.session-timeout.ms
的配置,但默认值为5秒。
上图即为成功。
设计HDFS Federation的原因是因为HDFS 1.0 中存在这些问题:
当前的HDFS架构有两个主要的层:
1. 命名空间(namespace)
HDFS体系结构中的命名空间层由文件,块和目录组成。该层支持与名称空间相关的文件系统操作,例如创建,删除,修改和列出文件和目录。
2. 块存储层(Block Storage)
块存储层包括两个部分: 1.块管理
NameNode执行块管理。块管理通过处理注册和定期心跳来提供DataNode群集成员身份。它处理块报告并支持与块相关的操作,如创建,删除,修改或获取块位置。它还维护块的位置,副本位置。为未复制的块管理块复制,并在已复制的块中删除。
2.存储
DataNode通过在本地文件系统上存储块并提供读/写访问权限来管理存储空间。
当下的HDFS体系结构仅允许单个NameNode维护文件系统名称空间。注意HA体系中虽然说允许多个NameNode,但是他们所维护的是同一套文件系统名称空间。这种体系目前存在着一些弊端和局限性:
Federation中文意思为联邦,联盟,是NameNode之间的Federation,也就是集群中会有多个NameNode。多个NameNode的情况意味着有多个namespace。注意,这区别于HA模式下的多NameNode,HA中它们是拥有着同一个namespace。
Federation体系中多个namenode之间相互独立且不需要互相协调,各自分工,管理自己的区域。每个DataNode要向集群中所有的namenode注册,且周期性地向所有namenode发送心跳和块报告,并执行来自所有namenode的命令。
上图中,有多个NameNode,分别表示为NN1,NN2,… NNn。NS1,NS2等是由它们各自的NameNode管理的多个名称空间。
每个名称空间都有其自己的块池(block pool)(NS1具有Pool1,NS2具有Pool2,依此类推)。每个DataNode存储集群中所有块池的块。
HDFS Federation体系结构中的块池是属于单个名称空间的块的集合。每个块池彼此独立地进行管理。在删除NameNode或名称空间时,DataNode中存在的相应块池也将被删除。在升级群集时,每个名称空间卷都作为一个单元进行升级。
需要注意的,HDFS Federation并不能解决单点故障问题,也就是说,每个名称节点都存在在单点故障问题,需要为每个名称节点部署一个后备名称节点,以应对名称节点挂掉对业务产生的影响
<configuration>
<property>
<name>dfs.nameservices</name>
<value>ns1,ns2</value>
</property>
<property>
<name>dfs.namenode.rpc-address.ns1</name>
<value>nn-host1:rpc-port</value>
</property>
<property>
<name>dfs.namenode.http-address.ns1</name>
<value>nn-host1:http-port</value>
</property>
<property>
<name>dfs.namenode.secondary.http-address.ns1</name>
<value>snn-host1:http-port</value>
</property>
<property>
<name>dfs.namenode.rpc-address.ns2</name>
<value>nn-host2:rpc-port</value>
</property>
<property>
<name>dfs.namenode.http-address.ns2</name>
<value>nn-host2:http-port</value>
</property>
<property>
<name>dfs.namenode.secondary.http-address.ns2</name>
<value>snn-host2:http-port</value>
</property>
.... Other common configuration ...
</configuration>
数据、程序、运算资源(内存、cpu)三者组在一起,完成了数据的计算处理过程。在单机环境下,这些都不是太大问题。为了应对海量数据的场景,Hadoop出现并提供了分而治之的分布式处理思想。通过对Hadoop版本演进的简单回顾,可以让我们知道YARN的产生和发展简史,洞悉YARN发展进程。
很多Hadoop的早期用户使用Hadoop的方式与在众多主机上运行桌面应用程序类似。
这种方式的一部分原因是没有在Hadoop HDFS上持久存储数据的迫切需求,另一部分原因是没有共享数据和计算结果的动机。
Ad Hoc应当理解为专用、特定的意思(数仓领域中常理解为即席查询)。Ad Hoc集群时代标志着Hadoop集群的起源,集群以Ad Hoc、单用户方式建立。
后来,随着私人集群的使用和Hadoop容错性的提高,持久的HDFS集群出现,并且实现了HDFS集群的共享,把常用和感兴趣的数据集载入HDFS共享集群中。当共享HDFS成为现实,还没实现共享的计算平台就成为关切对象。
不同于HDFS,为多个组织的多个用户简单设置一个共享MapReduce集群并非易事。尤其是集群下的物理资源的共享很不理想。
为了解决集群条件下的多租户问题, Yahoo发展并且部署了称为“Hadoop on Demand”的平台。Hadoop On Demand (HOD)是一个能在大规模物理集群上供应虚拟Hadoop集群的系统。在已经分配的节点上, HOD会启动MapReduce和HDFS守护进程来响应用户数据和应用的请求。
HOD的主要特点是用户可以使用HOD来同时分配多个MapReduce集群。
HOD的缺点包括:无法支持数据本地化、资源回收效率低、无动态扩容缩容能力,多租户共享延迟高等。
共享MapReduce计算集群和与之协同工作的共享HDFS是Hadoop 1.x版本里的主要架构
这种共享计算架构的主要组件如下所示:
共享计算集群的主要弊端有JobTracker可扩展性瓶颈(JobTracker在内存中保存用户作业的数据)、JobTracker身兼多职(作业数据管理、作业状态记录、作业调度、)、可靠性和可用性欠缺(JobTracker单点故障)、计算模型的单一(不是所有问题都能MapReduce)。
并且MapReduce框架本身也经历了很多变化。但是MapReduce被绑定到了集群的管理层,证明MapReduce的变化演变是比较困难的。
针对共享计算集群,JobTracker需要彻底地重写,才能解决扩展性的主要问题。但是,这种重写即使成功了,也不一定能解决平台和用户代码的耦合问题,也不能解决用户对非MapReduce编程模型的需求。如果不做重大的重新设计,集群可用性会继续被捆绑到整个系统的稳定性上。
YARN闪亮登场了,一款被设计用以解决以往架构的需求和缺陷的资源管理和调度软件。经过之前的发展,Hadoop走下了不少的弯路,甚至跳进了一些深坑。因此对于YARN的每个重大决策背后都有完整的惨痛的历史。
Apache Hadoop YARN (Yet Another Resource Negotiator,另一种资源协调者)是一种新的 Hadoop 资源管理器,它是一个通用资源管理系统和调度平台,可为上层应用提供统一的资源管理和调度,它的引入为集群在利用率、资源统一管理和数据共享等方面带来了巨大好处。
可以把Hadoop YARN理解为相当于一个分布式的操作系统平台,而MapReduce等计算程序则相当于运行于操作系统之上的应用程序,YARN为这些程序提供运算所需的资源(内存、cpu等)。
YARN是一个分布式的资源管理系统,用以提高分布式的集群环境下的资源利用率,这些资源包括内存、IO、网络、磁盘等。其产生的原因是为了解决原MapReduce框架的不足。最初MapReduce的committer们还可以周期性的在已有的代码上进行修改,可是随着代码的增加以及原MapReduce框架设计的不足,在原MapReduce框架上进行修改变得越来越困难,所以MapReduce的committer们决定从架构上重新设计MapReduce,使下一代的MapReduce(MRv2/Yarn)框架具有更好的扩展性、可用性、可靠性、向后兼容性和更高的资源利用率以及能支持除了MapReduce计算框架外的更多的计算框架。
由于 MRv1(第一代MapReduce)在扩展性、可靠性、资源利用率和多框架等方面存在明显不足, Apache 开始尝试对 MapReduce 进行升级改造,于是诞生了更加先进的下一代 MapReduce 计算框架 MRv2。
并且在MRv2中,将资源管理任务调度模块单独抽离出来,构建成了一个独立的通用资源管理系统 YARN,而MRv2则专注于数据的计算处理了。
在 Hadoop 1.0 中 MapReduce框架(MRv1,第一代MapReduce框架),和HDFS一样,MapReduce也是采用Master/Slave的架构,其架构如下图所示:
MapReduce 包含四个组成部分,分别为Client,JobTracker,TaskTracker,Task。
在 Hadoop 1.0 中, JobTracker 由资源管理(由 TaskScheduler 模块实现)和作业控制(由JobTracker 中多个模块共同实现)两部分组成,Hadoop 对JobTracker 赋予的功能过多而造成负载过重。
Hadoop YARN 是在 MRv1 基础上演化而来的,它克服了 MRv1 中的各种局限性,概括为以下几个方面:
为了克服以上几个缺点, Apache 开始尝试对 Hadoop 进行升级改造,进而诞生了更加先进的下一代 MapReduce 计算框架 MRv2。正是由于 MRv2 将资源管理功能抽象成了一个独立的通用系统 YARN,直接导致下一代 MapReduce 的核心从单一的计算框架 MapReduce转移为通用的资源管理系统 YARN。
YARN 实际上是一个弹性计算平台,它的目标已经不再局限于支持MapReduce 一种计算框架,而是朝着对多种框架进行统一管理的方向发展。
Hadoop2.0即第二代Hadoop,由分布式存储系统HDFS、并行计算框架MapReduce和分布式资源管理系统YARN三个系统组成,其中YARN是一个资源管理系统,负责集群资源管理和调度,MapReduce则是运行在YARN上的离线处理框架,称为MRv2(MapReduce的第二版)。
MRv1 主要由编程模型(由新旧 API 组成)、数据处理引擎(由 MapTask 和ReduceTask 组成)和运行时环境(由一个 JobTracker 和若干个 TaskTracker 组成)三部分组成,为了保证编程模型的向后兼容性, MRv2 重用了 MRv1 中的编程模型和数据处理引擎,但运行时环境被完全重写,具体如下。
编程模型与数据处理引擎 :MRv2 重用了 MRv1 中的编程模型和数据处理引擎。
运行时环境:MRv1 的运行时环境主要由两类服务组成,分别是 JobTracker 和TaskTracker。
Apache Hadoop YARN 一种开源的分布式资源管理和作业调度技术,它是作为Apache Hadoop 的核心组件之一,负责将系统资源(计算、存储和网络资源)分配给运行在Hadoop集群中的各种应用程序,并对运行在各集群节点上的任务进行调度。在生产环境中,通常采用分布式模式安装部署YARN集群。
YARN集群是一个标准的Master/Slave 结构(主从结构),其中ResourceManager(RM) 为Master, NodeManager(NM) 为 Slave。常见的是一主多从集群,也可以搭建RM的HA高可用集群。
ResourceManager作为主节点,是集群所有可用资源的唯一仲裁者,通过NodeManage管理整个集群的资源,其核心职责是调度分配资源。NodeManage负责在每台具体的机器节点上管理资源。
框架 | node01 | node02 | node03 |
---|---|---|---|
HDFS | NameNode | SecondaryNameNode | |
DataNode | DataNode | DataNode | |
Yarn | ResourceManager | ||
NodeManager | NodeManager | NodeManager | |
MapReduce | MRJobHistoryServer |
由于之前装过集群,在此就不过多阐述,如果需要了解这一具体过程, 可以看系列文章第二篇深入浅出学大数据(二)Hadoop简介及Apache Hadoop三种搭建方式
🔎1.修改文件core-site.xml
请把core-site.xml
文件修改为如下内容:
hadoop@Master:/opt/moudle/hadoop/etc/hadoop$ vim core-site.xml
<configuration>
<!-- 指定NameNode的地址 -->
<property>
<name>fs.defaultFS</name>
<value>hdfs://node01:9000</value>
</property>
<!-- 指定hadoop数据的存储目录 -->
<property>
<name>hadoop.tmp.dir</name>
<value>file:/opt/moudle/hadoop/tmp</value>
<description>Abase for other temporary directories.</description>
</property>
<!-- 配置HDFS网页登录使用的静态用户为hadoop -->
<property>
<name>hadoop.http.staticuser.user</name>
<value>hadoop</value>
</property>
</configuration>
🔎修改文件hdfs-site.xml
对于Hadoop的分布式文件系统HDFS而言,一般都是采用冗余存储,冗余因子通常为3,也就是说,一份数据保存三份副本。本教程数据节点也为3。所以 ,dfs.replication
的值还是设置为3。hdfs-site.xml
具体内容如下:
hadoop@Master:/opt/moudle/hadoop/etc/hadoop$ vim hdfs-site.xml
<configuration>
<property>
<name>dfs.namenode.secondary.http-address</name>
<value>node03:50090</value>
</property>
<property>
<name>dfs.replication</name>
<value>3</value>
</property>
<property>
<name>dfs.namenode.name.dir</name>
<value>file:/opt/moudle/hadoop/tmp/dfs/name</value>
</property>
<property>
<name>dfs.datanode.data.dir</name>
<value>file:/opt/moudle/hadoop/tmp/dfs/data</value>
</property>
</configuration>
🔎3修改文件mapred-site.xml
在有些版本中,“/opt/moudle/hadoop/etc/hadoop
”目录下有一个mapred-site.xml.template
,需要修改文件名称,把它重命名为mapred-site.xml
。如果不需要修改可以忽略此部分说明。然后,把mapred-site.xml
文件配置成如下内容:
hadoop@Master:/opt/moudle/hadoop/etc/hadoop$ vim mapred-site.xml
<configuration>
<!-- 指定MapReduce程序运行在Yarn上 -->
<property>
<name>mapreduce.framework.name</name>
<value>yarn</value>
</property>
<property>
<name>mapreduce.jobhistory.address</name>
<value>node01:10020</value>
</property>
<property>
<name>mapreduce.jobhistory.webapp.address</name>
<value>node01:19888</value>
</property>
<property>
<name>yarn.app.mapreduce.am.env</name>
<value>HADOOP_MAPRED_HOME=/opt/moudle/hadoop</value>
</property>
<property>
<name>mapreduce.map.env</name>
<value>HADOOP_MAPRED_HOME=/opt/moudle/hadoop</value>
</property>
<property>
<name>mapreduce.reduce.env</name>
<value>HADOOP_MAPRED_HOME=/opt/moudle/hadoop</value>
</property>
</configuration>
4.修改文件 yarn-site.xml
请把yarn-site.xml
文件配置成如下内容:
hadoop@Master:/opt/moudle/hadoop/etc/hadoop$ vim yarn-site.xml
<configuration>
<!-- Site specific YARN configuration properties -->
<!-- 指定ResourceManager的地址-->
<property>
<name>yarn.resourcemanager.hostname</name>
<value>node01</value>
</property>
<!-- 指定MR走shuffle -->
<property>
<name>yarn.nodemanager.aux-services</name>
<value>mapreduce_shuffle</value>
</property>
</configuration>
hadoop@node01:/opt/moudle/hadoop/etc/hadoop$ start-all.sh
hadoop@node01:/opt/moudle/hadoop/etc/hadoop$ mr-jobhistory-daemon.sh start historyserver
hadoop@node01:/opt/moudle/hadoop/etc/hadoop$ jps-all jps
下面我们和预期进程对比下:
我们发现和预期是一样,说明我们的过程是没问题的。
查看HDFS WEB UI,地址为:http://192.168.2.6:9870/
查看YARN WEB UI,地址为:http://192.168.2.6:8088/cluster
ResourceManager(RM)负责管理群集中的资源和调度应用程序(如MR、Spark等)。在Hadoop 2.4之前,YARN群集中的ResourceManager存在SPOF(Single Point of Failure,单点故障)。为了解决ResourceManager的单点问题,YARN设计了一套Active/Standby模式的ResourceManager HA(High Availability,高可用)架构。在运行期间有多个ResourceManager同时存在来增加冗余进而消除这个单点故障,并且只能有一个ResourceManager处于Active状态,其他的则处于Standby状态,当Active节点无法正常工作,其余Standby状态的几点则会通过竞争选举产生新的Active节点
ResourceManager的HA通过Active/Standby体系实现,其底层通过ZooKeeper集群来存储RM的状态信息、应用程序的状态。如果Active状态的RM遇到故障,会通过切换Standby状态的RM为Active来继续为集群提供正常服务。
故障转移机制支持自动故障转移和手动故障转移两种方式实现。在生产环境中,自动故障转移应用更为广泛。
第一种:手动故障转移
当没有启用自动故障转移时,管理员必须手动将一个RM转换为活动状态。要从一个RM到另一个RM进行故障转移,需要先把Active状态的RM转换为Standby状态的RM,然后再将Standby状态的RM转换为Active状态的RM。这些操作可用yarn rmadmin 命令来完成。
:mag_right.第二种:自定故障转移
RM可以选择嵌入基于Zookeeper的ActiveStandbyElector(org.apache.hadoop.ha.ActiveStandbyElector类)来实现自动故障转移,以确定哪个RM应该是Active。当Active状态的RM发生故障或无响应时,另一个RM被自动选为Active,然后接管服务。YARN的故障转移不需要像HDFS那样运行单独的ZKFC守护程序,因为ActiveStandbyElector是一个嵌入在RM中充当故障检测器和Leader选举的线程,而不是单独的ZKFC守护进程。
当有多个RM时,Clients和NMs通过读取yarn-site.xml配置找到所有ResourceManager。Clients、AM和NM会轮训所有的ResourceManager并进行连接,直到找着Active状态的RM。如果Active状态的RM也出现故障,它们就会继续查找,直到找着新的Active状态的RM。
YARN这个Active/Standby模式的RM HA架构在运行期间,会有多个RM同时存在,但只能有一个RM处于Active状态,其他的RM则处于Standby状态,当Active节点无法正常提供服务,其余Standby状态的RM则会通过竞争选举产生新的Active节点。以基于ZooKeeper这个自动故障切换为例,切换的步骤如下:
YARN HA高可用依赖于Zookeeper集群存储状态数据和自动故障转移,所以要配置安装部署Zookeeper集群,具体步骤如下: 1. 集群规划
在node01、node02和node03三个节点上部署Zookeeper。
2. 解压安装
1. 解压Zookeeper安装包到/opt/moudle目录下
hadoop@node01:/opt/software$ tar -zxvf apache-zookeeper-3.5.7-bin.tar.gz -C /opt/moudle/
hadoop@node01:/opt/moudle$ sudo chown -R hadoop:hadoop apache-zookeeper-3.5.7-bin
hadoop@node01:/opt/moudle$ sudo mv apache-zookeeper-3.5.7-bin zookeeper
2. 在/opt/moudle/zookeeper/这个目录下创建zkData
hadoop@node01:/opt/moudle/zookeeper$ mkdir -p zkData
3. 重命名/opt/moudle/zookeeper/conf这个目录下的zoo_sample.cfg为zoo.cfg
hadoop@node01:/opt/moudle/zookeeper/conf$ mv zoo_sample.cfg zoo.cfg
3. 配置zoo.cfg文件
1. 具体配置
# example sakes.
dataDir=/opt/moudle/zookeeper/zkData
#增加如下配置
#######################cluster##########################
server.2=node01:2888:3888
server.3=node02:2888:3888
server.4=node03:2888:3888
2. 配置参数解读
Server.A=B:C:D
集群模式下配置一个文件myid,这个文件在dataDir目录下,这个文件里面有一个数据就是A的值,Zookeeper启动时读取此文件,拿到里面的数据与zoo.cfg里面的配置信息比较从而判断到底是哪个server。
4. 配置zkEnv.sh
默认情况下Zookerper服务启动时,日志文件zookeeper.out
在执行命令目录中生成,可以配置日志文件放在Zookeeper安装目录中logs目录下,如下操作:
hadoop@node01:/opt/moudle/zookeeper/bin$ vim zkEnv.sh
#增加配置内容:
ZOO_LOG_DIR=/opt/moudle/zookeeper/logs
5. 新建myid文件
1. 在/opt/moudle/zookeeper/zkData目录下创建一个myid的文件
hadoop@node01:/opt/moudle/zookeeper/zkData$ touch myid
2. 编辑myid文件
hadoop@node01:/opt/moudle/zookeeper/zkData$ touch myid
在文件中添加与server对应的编号:如2
6. 拷贝配置好的zookeeper文件到其他机器上
# myid 里面的数字都是需要修改的,在node02,node03分别修改成3和4
hadoop@node01:/opt/moudle/zookeeper$ cat zkData/myid
2
hadoop@node01:/opt/moudle/zookeeper$ xsync zkData/myid
hadoop@node01:/opt/moudle/zookeeper$ xsync bin/zkEnv.sh
Zookeeper集群配置安装部署启动完成以后,可以参考官方文档配置YARN HA。 文档:http://hadoop.apache.org/docs/r3.1.3/hadoop-yarn/hadoop-yarn-site/ResourceManagerHA.html
YARN HA高可用部署配置,node02和node03为RM服务节点。
框架 | node01 | node02 | node03 |
---|---|---|---|
HDFS | NameNode | SecondaryNameNode | |
DataNode | DataNode | DataNode | |
Yarn | ResourceManager | ResourceManager | |
NodeManager | NodeManager | NodeManager | |
MapReduce | MRJobHistoryServer | ||
Zookeeper | QuorumPeerMain | QuorumPeerMain | QuorumPeerMain |
对YARN配置文件进行修改,删除某些配置,如下步骤操作。
1. 删除内容
<property>
<name>yarn.resourcemanager.hostname</name>
<value>node01</value>
</property>
2. 添加内容
<property>
<name>yarn.resourcemanager.ha.enabled</name>
<value>true</value>
</property>
<property>
<name>yarn.resourcemanager.cluster-id</name>
<value>cluster1</value>
</property>
<property>
<name>yarn.resourcemanager.ha.rm-ids</name>
<value>rm1,rm2</value>
</property>
<property>
<name>yarn.resourcemanager.hostname.rm1</name>
<value>node02</value>
</property>
<property>
<name>yarn.resourcemanager.hostname.rm2</name>
<value>node03</value>
</property>
<property>
<name>yarn.resourcemanager.webapp.address.rm1</name>
<value>node02:8088</value>
</property>
<property>
<name>yarn.resourcemanager.webapp.address.rm2</name>
<value>node03:8088</value>
</property>
<property>
<name>yarn.resourcemanager.ha.automatic-failover.enabled</name>
<value>true</value>
</property>
<property>
<name>hadoop.zk.address</name>
<value>node01:2181,node02:2181,node03:2181</value>
</property>
<property>
<name>yarn.resourcemanager.recovery.enabled</name>
<value>true</value>
</property>
<property>
<name>yarn.resourcemanager.store.class</name>
<value>org.apache.hadoop.yarn.server.resourcemanager.recovery.ZKRMStateStore</value>
</property>
3. 同步配置文件
hadoop@node01:/opt/moudle/hadoop/etc/hadoop$ xsync yarn-site.xml
hadoop@node01:/opt/moudle/hadoop/etc/hadoop$ start-allzk start
hadoop@node01:/opt/moudle/hadoop/etc/hadoop$ start-all.sh
hadoop@node01:/opt/moudle/hadoop/etc/hadoop$ mr-jobhistory-daemon.sh start historyserver
hadoop@node01:/opt/moudle/hadoop/etc/hadoop$ jps-all jps
对比查看:
对比之后发现是一样的,这说明过程是正确的。
我们可以使用YARN提供管理命令,查看RM运行状态
hadoop@node01:/opt/moudle/hadoop/etc/hadoop$ yarn rmadmin -getAllServiceState
使用WebUI查看RM状态:
1. 查看HA状态
当node03节点的RM为Active状态、node02节点的RM为Standby状态时,访问http://node02:8088会自动跳转到http://node03:8088中,表示YARN HA正确配置。
2. 自动故障切换
强制杀死node03节点的RM,基于ZooKeeper的ActiveStandbyElector自动故障转移策略将node02节点的RM选举为Active状态,表示故障转移配置正确。
hadoop@node03:/opt/moudle/hadoop$ kill -9 9251
hadoop@node01:/opt/moudle/hadoop/etc/hadoop$ yarn rmadmin -getAllServiceState rm1
3. 手动故障切换
在非自动故障切换的YARN集群下进行手动故障切换可以使用命令进行故障转移切换。手动故障切换命令yarn rmadmin -failover rm1 rm2
是rm1(node02)故障转移到rm2(node03)。
YARN(Yet Another Resource Negotiator,另一种资源协调者) 是 Hadoop 2.0 中的资源管理系统,它的基本设计思想是将 MRv1 中的 JobTracker拆分成了两个独立的服务 :一个全局的资源管理器 ResourceManager 和每个应用程序特有的ApplicationMaster。其中 ResourceManager 负责整个系统的资源管理和分配,而 ApplicationMaster负责单个应用程序的管理。
YARN 总体上仍然是 Master/Slave 结构(主从结构),在整个资源管理框架中, ResourceManager 为Master, NodeManager 为 Slave, ResourceManager 负责对各个 NodeManager 上的资源进行统一管理和调度。当用户提交一个应用程序时,需要提供一个用以跟踪和管理这个程序的ApplicationMaster,它负责向 ResourceManager 申请资源,并要求 NodeManger 启动可以占用一定资源的任务。由于不同的 ApplicationMaster 被分布到不同的节点上,因此它们之间不会相互影响。
上图描述了 YARN 的基本组成结构, YARN 主要由 ResourceManager、 NodeManager、ApplicationMaster(图中给出了 MapReduce 和 MPI 两种计算框架的 ApplicationMaster,分别为 MR AppMstr 和 MPI AppMstr)和 Container 等几个组件构成。
进程 | 描述 | 级别 |
---|---|---|
ResourceManager | 使用Scheduler(ResourceScheduler类)和ApplicationManager(RMAppManager类)分配群集资源。 | 守护进程 |
ApplicationMaster | 通过指示NodeManager创建或销毁Application的Container来管理Application的生命周期。一个Application只有一个ApplicationMaster进程。 | 用户进程 |
NodeManager | 通过在群集节点中创建和销毁容器来管理特定节点中的作业或工作流。 | 守护进程 |
Container | Container是Yarn对计算资源的抽象,它其实是一组CPU和内存资源,所有的应用都会运行在Container中。 | 用户进程 |
RM(ResourceManager) 是一个全局的资源管理器,负责整个系统的资源管理和分配。它主要由两个组件构成:调度器(Scheduler)和应用程序管理器(Applications Manager, ASM)。
🔍1. 调度器(Scheduler):根据容量、队列等限制条件(如每个队列分配一定的资源,最多执行一定数量的作业等),将系统中的资源分配给各个正在运行的应用程序。
🔍2. 应用程序管理器(Applications Manager):负责管理整个系统中所有应用程序,包括应用程序提交、与调度器协商资源以启动 ApplicationMaster、监控 ApplicationMaster 运行状态并在失败时重新启动它等。
用户提交的每个应用程序均包含一个 AM,主要功能包括:
当前YARN自带了两个AM实现,一个是用于演示AM编写方法的例程序distributedshell,它可以申请一定数目的 Container 以并行运行一个 Shell 命令或者 Shell 脚本 ;另一个是运行 MapReduce 应用程序的 AM—MRAppMaster,此外,一些其他的计算框架对应的 AM 正在开发中,比如 Spark、Flink 等。
NM(NodeManager) 是每个节点上的资源和任务管理器,一方面,它会定时地向 RM 汇报本节点上的资源使用情况和各个 Container 的运行状态;另一方面,它接收并处理来自 AM 的 Container启动 / 停止等各种请求。
Container 是 YARN 中的资源抽象,它封装了某个节点上的多维度资源,如内存、CPU、磁盘、网络等,当 AM 向 RM 申请资源时, RM 为 AM 返回的资源便是用 Container表示的。 YARN 会为每个任务分配一个 Container,且该任务只能使用该 Container 中描述的资源。需要注意的是, Container 不同于 MRv1 中的 slot,它是一个动态资源划分单位,是根据应用程序的需求动态生成的。当下, YARN 仅支持 CPU 和内存两种资源,且使用了轻量级资源隔离机制 Cgroups 进行资源隔离 。
YARN支持各种数据处理引擎对HDFS中的数据进行批处理、交互式和流处理。在不同的场景中使用不同的框架,常见的包括MapReduce、Spark、Storm和Flink等Application。这种架构可以更好、更优雅地进行扩展。因此从一开始就内置了高可用性、安全性和多租户支持更多用户在大型集群上使用,新架构还将提高创新性,敏捷性和硬件利用率。
此外,YARN提供以下功能:
RPC 协议是连接各个组件的“大动脉”,了解不同组件之间的 RPC 协议有助于更深入地理解学习 YARN 框架。在 YARN 中,任何两个需相互通信的组件之间仅有一个 RPC 协议,而对于任何一个 RPC 协议,通信双方有一端是 Client,另一端为 Server,且 Client 总是主动连接 Server 的,因此, YARN 实际上采用的是拉式(pull-based)通信模型。
如上图所示,箭头指向的组件是 RPC Server,而箭头尾部的组件是 RPC Client, YARN 主要由以下几个 RPC 协议组成 :
为了提高 Hadoop 的向后兼容性和不同版本之间的兼容性, YARN 中的序列化框架采用了 Google 开源的 Protocol Buffers。
运行在Hadoop YARN 上的应用程序主要分为两类 :短应用程序和长应用程序。
尽管这两类应用程序作用不同,一类直接运行数据处理程序,一类用于部署服务(服务之上再运行数据处理程序),但运行在 YARN 上的流程是相同的。
当用户向 YARN 中提交一个应用程序后, YARN 将分两个阶段运行该应用程序 :第一个阶段是启动 ApplicationMaster ;第二个阶段是由 ApplicationMaster 创建应用程序,为它申请资源,并监控它的整个运行过程,直到运行完成。
如上图所示, YARN 的工作流程分为以下几个步骤:
YARN 正是一个资源管理系统,它的出现弱化了计算框架之争,引入 YARN 这一层后,各种计算框架可各自发挥自己的优势,并由 YARN 进行统一管理,进而运行在一个大集群上。如今各种开源系统都在开发 YARN 版本,包括 MapReduce、 Spark、 Storm、 Flink等。
扫码关注腾讯云开发者
领取腾讯云代金券
Copyright © 2013 - 2025 Tencent Cloud. All Rights Reserved. 腾讯云 版权所有
深圳市腾讯计算机系统有限公司 ICP备案/许可证号:粤B2-20090059 深公网安备号 44030502008569
腾讯云计算(北京)有限责任公司 京ICP证150476号 | 京ICP备11018762号 | 京公网安备号11010802020287
Copyright © 2013 - 2025 Tencent Cloud.
All Rights Reserved. 腾讯云 版权所有