现在已经进入了大数据(Big Data)时代,数以万计用户的互联网服务时时刻刻都在产生大量的交互,要处理的数据量实在是太大了,以传统的数据库技术等其他手段根本无法应对数据处理的实时性、有效性的需求。HDFS 顺应时代出现,在解决大数据存储和计算方面有很多的优势。
一、什么是大数据
大数据是指无法在一定时间范围内用常规软件工具进行捕捉、管理和处理的大量数据集合,是需要新的处理模式才能具备更强的决策能力、洞察发现能力和流程优化能力的海量、高增长率和多样化的信息资产数据。简而言之,就是数据量非常大,大到无法用常规工具处理,如关系型数据库、数据仓库等。这里的"大"又是一个什么量级呢?如阿里巴巴每天所处理的交易数据达到 20PB(即 20971520GB)。传统数据处理技术为何不能胜任?主要原因是关系型数据库是针对表、字段、行这种可使用二维表格表示的结构化数据而设计的,而大数据通常是针对文本这种非结构化数据。
数据量大是大数据的显著特点,归纳来说大数据特点如下:
数据体量巨大。按目前的发展趋势看,大数据的体量已经达到PB甚至EB级。
大数据的数据类型多样,以非结构化数据为主。如:网络日志、音频、视频图片、地理位置信息、交易数据、社交数据等。
价值密度低。有价值的数据仅占到数据总量相当小的一部分。比如一段监控视频中真正有价值的画面可能只有几秒钟。由于价值密度低,所以迅速地完成数据的价值提纯是目前大数据汹涌背景下亟待解决的难题。
产生和要求处理速度快。这是大数据区分于传统数据挖掘最显著的特征。
另外,大数据也是一种方法论。原则是"一切都被记录,一切都被数字化,从数字里寻找需求、寻找知识、发掘价值",这是一种新的思维方式,不同于此前的专家方式,而是通过数据分析来得到结论,这是大数据时代的一个显著特征。这也就要求技术人员拥有能够从各种各样类型的数据中快速获得有价值信息的能力。
目前,有很多大数据处理系统可以处理大数据,本文介绍Hadoop。Hadoop是开源软件,实现了一个分布式文件系统(Hadoop Distributed File System,HDFS),分布式系统是运行在多个主机上的软件系统。HDFS有着高容错性的特点,能够自动保存数据的多个副本,并能自动将失败的任务重新分配。Hadoop 设计用来部署在低廉的通用硬件平台上组成集群,提供热插拔的方式加入新的节点来向集群中扩展,将计算任务动态分配到集群中各个节点并保证各节点的动态平衡。总的来说,Hadoop具有低成本、高扩展性、高效性、高容错性的特点,所以 Hadoop 得到多家厂商支持或采用,包括阿里巴巴、腾讯、百度、Microsoft、Intel、IBM、雅虎等。
二、Hadoop体系结构
Hadoop 源自于 Google 在 2003 到 2004年公布的关于 GFS(Google FileSystem)、MapReduce 和 BigTable 三篇论文,创始人是 Doug Cutting。Hadoop 现在是 Apache 基金会顶级项目,"Hadoop"是一个虚构的名字,由 Doug Cutting 的孩子为其黄色玩具大象所命名。
1.Hadoop的核心构成
前面提过 HDFS 和 MapReduce 是 Hadoop 的两大核心。通过 HDFS 实现对分布存储的底层支持,达到高速并行读写与大容量的存储扩展。通过 MapReduce 实现对分布式并行任务处理程序支持,保证高速分析处理数据。HDFS在MapReduce 任务处理过程中提供了对文件操作和存储的支持,MapReduce 在 HDFS的基础上实现了任务的分发、跟踪、执行等工作,并收集结果,二者相互作用,完成了Hadoop 分布式集群的主要任务。在后面的章节中还会详细介绍这两部分。
2.Hadoop子项目
整个 Hadoop 生态圈已发展成为包含很多子项目的集合。除了两个核心内容外还包括 Hive、Pig、HBase、ZooKeeper等。
下面分别对它们进行简单介绍。
HDFS:分布式文件系统,是整个Hadoop体系的基石。
MapReduce/YARN:并行编程模型。YARN是下一代的MapReduce 框架。从 Hadoop 0.23.01 版本后,MapReduce 被重构。通常 YARN 也称为MapReduceV2,老版本MapReduce 称为MapReduce V1。
Hive:建立在 Hadoop 上的数据仓库。提供类似 SQL语言的查询方式查询Hadoop 中的数据。
Pig:一个对大型数据集进行分析、评估的平台。主要作用类似于数据库里的存储过程。
HBase:全称 Hadoop Database。Hadoop 分布式、面向列的数据库来源于Google 关于 BigTable 的论文,主要用于需要随机访问、实时读写的大数据。在后面章节还会详细介绍。
ZooKeeper:是一个为分布式应用所设计的协调服务。主要为用户提供同步、配置管理、分组和命名等服务,减轻分布式应用程序所承担的协调任务。
当然还有大量其它项目加入到Hadoop 生态圈,如:
Sqoop:主要用于 Hadoop与传统数据库(MySQL等)间的数据传递
Flume:日志采集系统。
Spark:前面提过,是一个相对独立于Hadoop的大数据处理系统,可单独进行分布式处理。在这里列出来是因为它可以和HDFS很好的结合。
Oozie:可以将多个MapReduce 作业组合到一个逻辑工作单元中,进行工作计划的安排,类似于工作流管理引擎。
Ambari:支持 Hadoop 集群管理、监控的 Web 工具。
经过近十多年的发展,越来越多的项目加入到了 Hadoop 的生态圈。在本课程中着重介绍2个模块,分别是:HDFS、MapReduce。对于 Hadoop 应用开发人员来说,这也是最基本的模块。
3.MapReduce 框架设计
为什么使用 MapReduce?对于大量数据的计算,通常采用的处理方法就是并行计算。这就要求能够将大型而复杂的计算问题分解为各个子任务,并分配到多个计算资源下同时进行计算,其显著特点是耗时小于单个计算资源下的计算。对多数开发人员来说,并行计算还是个陌生、复杂的东西,尤其是涉及到分布式的问题,将会更加棘手。MapReduce 就是一种实现了并行计算的编程模型,它向用户提供接口,屏蔽了并行计算特别是分布式处理的诸多细节,让那些没有多少并行计算经验的开发人员也可以很方便的开发并行应用。
MapReduce 由两个概念合并而来:map(映射)和reduce(归约)。map 负责把任务分解成多个任务,reduce负责把分解后多任务的处理结果进行汇总。
与 HDFS 架构设计相似,Hadoop 中用于执行 MapReduce 作业的机器也有两个角色:JobTracker 和TaskTracker。
JobTracker:是一个Master 服务,用于作业(Job)的管理和调度工作。-个 Hadoop 集群中只有一台 JobTracker。一般情况下,应该把它部署在单独的机器上。JobTracker 负责创建、调度作业中的每一个子任务(MapTask或 ReduceTask)运行于 TaskTracker上,并监控它们。如果发现有失败的任务就重新运行它。
TaskTracker:是运行于多个节点上的Slave 服务,用于执行任务。TaskTracker需要运行在 HDFS的 DataNode 上。
4.下一代 MapReduce 框架 YARN
前面都是以旧的 MapReduce V1 框架进行讲解,比如 hadoop 1.2.1 版本,实际上之前的所有 MapReduce 作业均是运行在 YARN 框架上。由于在 MapReduce V1中对于超过 4000个节点的大型集群,开始面临扩展性的瓶颈。主要表现在:
JobTracker 单点瓶颈。MapReduce 中的 JobTracker 负责作业的分发、管理和调度,同时还必须和集群中所有的节点保持"心跳"通信,跟踪机器的运行状态。随着集群的数量和提交 Job 的数量不断增加,导致 JobTracker 的任务量随之增加,最终成为集群的单点瓶颈。
TaskTracker端。由于作业分配信息过于简单,有可能将多个资源消耗多或运行时间长的 Task 分配到同一个Node 上,这样会造成作业的等待时间过长。
作业延迟高。在 MapReduce 运行作业之前,需要 TaskTracker 汇报自己的资源运行情况,JobTracker 根据获取的信息分配任务,TaskTracker 获取任务之后再开始运行。这样的结果导致小作业启动时间过长。
编程框架不够灵活。虽然 MapReduce V1框架允许用户自定义各阶段的对象和处理方法,但 MapReduce V1还是限制了编程的模式及资源的分配。
基于以上问题,下一代 MapReduce 框架 YARN(Yet Another ResourceNegotiator 另一种资源协调者,也称MapReduce V2)应运而生。
5.YARN 架构
YARN 将 JobTracker 的职能进行了拆分,从而改善了 MapReduce V1 面临的扩展性瓶颈问题。将 JobTracker 承担的两大块任务:集群资源管理和作业管理进行分离,分别为管理集群上资源使用的资源管理器(ResourceManager)和管理集群上运行任务(MapReduce 作业)生命周期的应用主体(ApplicationMaster),然后TaskTracker演化成节点管理器(NodeManager)。
YARN仍然是Master/Slave 结构,全局的 ResourceManager 和局部的NodeManager组成了数据计算框架,ApplicationMaster负贵与 ResourceManager通信获取资源并与 NodeManager配合完成节点的Task任务。下面列出了各实体角色的职责:
资源管理器:包括两个功能组件调度器和应用管理器。调度器仅负责协调集群上计算资源的分配,不负责监控各个应用的执行情况。应用管理器负责接收作业,协商获取第一个资源容器用于启动作业所属的应用主体并监控应用主体的存在情况。
节点管理器:负责启动和监视集群中机器上的计算资源容器(Container)。
应用主体:应用主体与应用一一对应,负责协调运行 MapReduce 作业的任务,它和 MapReduce 任务都在资源容器中运行。
资源容器:对节点自身内存、CPU、磁盘、网络带宽等资源的抽象封装,由资源管理器分配并由节点管理器进行管理。主要职责是运行、保存或传输应用主体提交的作业或需要存储和传输的数据。
6.YARN 配置文件
前面提过,基于 MapReduce V1编写的程序无需修改也可以运行在 YARN 中。启动YARN需要单独配置,共涉及到如下文件:
yarn-env.sh:加入 JDK 路径。
mapred-site.xml:指定mapreduce.framework.name 为yarn。
yarn-site.xml:YARN 具体配置信息。
另外,YARN 需要单独启动 sbin/start-yarn.sh。在 NameNode 上,使用"jps"命令查看到"ResourceManager"进程表示已成功运行,相应地在 DataNode 上会出现"NodeManager"进程
7.YARN 优势
YARN 优势具备的优势有:
分散了 JobTracker的任务,资源管理器和应用主体各司其责,解决了JobTracker 的瓶颈问题,提高了集群的扩展性。
YARN 中应用主体是一个用户可自定义的部分,用户可以针对编程模型编写自己的应用主体程序,扩展了YARN 的适用范围。
集群资源统一组织成资源容器,提高了集群资源的利用率。