2011年的时候咱们在百度搜索Hadoop相关的问题天天只有零星几个,2015年再去百度搜索Hadoop已经有800多万个问题,而现在已然已通过亿了,Hadoop已成为大数据必备的基础设施了。Hadoop被公认是一套行业大数据标准开源软件,在分布式环境下提供了海量数据的处理能力。几乎全部主流厂商都围绕Hadoop开发工具、开源软件、商业化工具和技术服务。近年大型IT公司,如EMC、Microsoft、Intel、Teradata、Cisco都明显增长了Hadoop方面的投入。那么到底什么是Hadoop?它有什么做用?它的基础架构是怎么样的?今天就Hadoop的这些基本概念来作一次简单的梳理。node
1、Hadoop是什么?git
Hadoop是一个由Apache基金会所开发的分布式系统基础架构, 是一个存储系统+计算框架的软件框架。主要解决海量数据存储与计算的问题,是大数据技术中的基石。Hadoop以一种可靠、高效、可伸缩的方式进行数据处理,用户能够在不了解分布式底层细节的状况下,开发分布式程序,用户能够轻松地在Hadoop上开发和运行处理海量数据的应用程序。github
2、Hadoop能解决什么问题架构
一、海量数据存储框架
HDFS有高容错性的特色,而且设计用来部署在低廉的(low-cost)硬件上;并且它提供高吞吐量(High throughput)来访问数据,适合那些有着超大数据集(large data set)的应用程序,它由n台运行着DataNode的机器组成和1台(另一个standby)运行NameNode进程一块儿构成。每一个DataNode 管理一部分数据,而后NameNode负责管理整个HDFS 集群的信息(存储元数据)。分布式
二、资源管理,调度和分配工具
Apache Hadoop YARN(Yet Another Resource Negotiator,另外一种资源协调者)是一种新的 Hadoop 资源管理器,它是一个通用资源管理系统和调度平台,可为上层应用提供统 一的资源管理和调度,它的引入为集群在利用率、资源统一管理和数据共享等方面带来了巨 大好处。oop
3、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 官网或者社区进行深刻理解。
本文首发于:数栈研习社
咱们在github上有一个开源项目:flinkx,你们欢迎来玩