2011年的时候我们在百度搜索Hadoop相关的问题每天只有零星几个,2015年再去百度搜索Hadoop已经有800多万个问题,而如今已然已经过亿了,Hadoop已成为大数据必备的基础设施了。Hadoop被公认是一套行业大数据标准开源软件,在分布式环境下提供了海量数据的处理能力。几乎所有主流厂商都围绕Hadoop开发工具、开源软件、商业化工具和技术服务。近年大型IT公司,如EMC、Microsoft、Intel、Teradata、Cisco都明显增加了Hadoop方面的投入。那么到底什么是Hadoop?它有什么作用?它的基础架构是怎么样的?今天就Hadoop的这些基本概念来做一次简单的梳理。
Hadoop是一个由Apache基金会所开发的分布式系统基础架构, 是一个存储系统+计算框架的软件框架。主要解决海量数据存储与计算的问题,是大数据技术中的基石。Hadoop以一种可靠、高效、可伸缩的方式进行数据处理,用户可以在不了解分布式底层细节的情况下,开发分布式程序,用户可以轻松地在Hadoop上开发和运行处理海量数据的应用程序。
01
海量数据存储
HDFS有高容错性的特点,并且设计用来部署在低廉的(low-cost)硬件上;而且它提供高吞吐量(High throughput)来访问数据,适合那些有着超大数据集(large data set)的应用程序,它由n台运行着DataNode的机器组成和1台(另外一个standby)运行NameNode进程一起构成。每个DataNode 管理一部分数据,然后NameNode负责管理整个HDFS 集群的信息(存储元数据)。
02
资源管理,调度和分配
Apache Hadoop YARN(Yet Another Resource Negotiator,另一种资源协调者)是一种新的 Hadoop 资源管理器,它是一个通用资源管理系统和调度平台,可为上层应用提供统 一的资源管理和调度,它的引入为集群在利用率、资源统一管理和数据共享等方面带来了巨 大好处。
看过了Hadoop 的基本介绍之后。我们来了解HDFS 和 YARN的核心架构和原理,先上HDFS框架图:
看完上面的图之后,先来思考几个问题:
元数据信息是什么,NameNode是如何维护元数据的,元数据信息如何保障一致性?
NameNode维护了HDFS 集群的元数据信息,包括文件的目录树,每个文件对应的数据块列表,权限设置,副本数等等。
元数据信息存储在内存里,那么NameNode异常宕机情况下咋办?
NameNode对元数据的修改包含两个部分
内存数据修改
修改内存之后写一条EditLog
再来看两个概念FsImage 和 EditLog:
FsImage:FsImage是NameNode内存中元数据的镜像文件,是元数据的一个永久性checkpoint,包含了HDFS的所有目录和文件idnode的序列化信息,可以类比银行的账户余额,只有简单的信息。
EditLog:EditLog是用于衔接内存元数据和FsImage之间的操作日志,保存了自最后一次检查点之后,所有针对HDFS文件系统的操作,比如增加文件、重命名文件、删除目录等等,可以类比银行的账户流水,包括每一笔的记录,如果日积月累,流水信息可以非常大。
那么如果Editlog变的非常大之后,宕机之后需要读取Editlog进行恢复元数据,这是一个非常慢点过程。这个时候该StandbyNameNode 节点上场了。Standby 节点从JournalNode集合拉取Editlog,并定时将Editlog合并成FsImage. FsImage是一份合并之后的存量数据信息。同时将FsImage 上传到ActiveNode节点。
NameNode Active 和 standby 之间是如何切换并始终保持一个ActiveNode?
我们可以在上面的HDFS框架图中看到,链接ZK集群和NameNode的组件ZKFC
ZKFC 监控NameNode的监控状态
ZKFC 利用ZK提供的主备节点选举来切换
通知和修改NameNode的状态
确认元数据同步完成之后对外提供服务
再来看YARN框架图:
上图描述了YARN的一个任务的提交和资源分配流程,在整个过程中涉及到如下的组件:
ResourceManeger:负责所有资源的监控、分配和管理,并处理客户端请求,启动和监控AppMaster,NodeManager
NodeManager:单个节点上的资源管理和任务管理,处理ResourceManager,AppMaster 的命令
AppMaster:负责某个具体应用程序的调度和协调,为应用程序申请资源,并对任务进行监控
Container:YARN中的一个动态资源分配的概念,其拥有一定的内存,核数。
一个任务提交的整体流程:
(1)Client向YARN中提交应用程序,
其中包括ApplicationMaster程序、命令、用户程序,资源等。
(2)ResourceManager为该应用程序分配第一个Container,并与对应的NodeManager通信,要求它在这个Container中启动应用程序的ApplicationMaster。
(3)ApplicationMaster首先向ResourceManager注册,这样用户可以直接通过ResourceManager查看应用程序的运行状态,然后它将为各个任务申请资源,并监控它的运行状态
(4)ApplicationMaster采用轮询的方式通过RPC协议向ResourceManager申请和领取资源。
(5)一旦ApplicationMaster申请到资源后,便与对应的NodeManager通信,要求它启动任务。
(6)NodeManager为任务设置好运行环境(包括环境变量、Jar包、二进制程序等)后,将任务启动命令写到一个脚本中,并通过运行该脚本启动任务。
(7)各个任务通过某个RPC协议向ApplicationMaster汇报自己的状态和进度,以让ApplicationMaster随时掌握各个任务的运行状态,从而可以在任务失败时重新启动任务。在应用程序运行过程中,用户可随时通过RPC向ApplicationMaster查询应用程序的当前运行状态。
(8)应用程序运行完成后,ApplicationMaster向ResourceManager注销并关闭自己。
通过上面的内容,可以对Hadoop 的一些基本框架有一些简单的印象了。之后在使用的时候可以对照上面的结构图和Hadoop 官网或者社区进行深入理解。