hadoop学习(一)----概念和整体架构

来源:互联网 发布:酒精刻录软件 编辑:程序博客网 时间:2024/05/22 12:50

程序员就得不停地学习啊,故步自封不能满足公司的业务发展啊!所以我们要有搞事情的精神。都说现在是大数据的时代,可以我们这些码农还在java的业务世界里面转悠呢。好不容易碰到一个可能会用到大数据技术的场景时可惜你又没这个技术把这一票接下来!书到用时方恨少。所以我们也要与时代同进步,搞搞大数据。分布式的基础架构现在有hadoop和spark。虽然spark目前比较火,但是国内大厂因为最开始学习大数据的先锋们给公司搭架构都是使用hadoop,以至于spark火起来都不能撼动hadoop的地位(大家不会吃饱了没事干把底层重新返工一遍!),所以导致spark在国内应用并不是很广。再有就是hadoop目前的版本已经到了正式版2.8,测试版3.0。但是问题在于hadoop1.x和hadoop2.x的底层架构不一样!稍后我会讲到。面对这些问题我们要做的当然是学新的兼顾旧的(不学新的就是倒退)。所以下面我们会一直使用hadoop2.x的版本。

1.hadoop是什么

是什么呢?就是一个棕黄色玩具大象的名字。这是真的!hadoop的作者Doug Cutting说的,这是他儿子的玩具的名字。(是不是太随意了,想想国人取名字的场景。。。)我们回到正轨,hadoop是世界上最大的富豪Apache捐助的分布式系统基础架构。该框架由java语言设计实现,用以实现在大量计算机组成的集群中对海量数据进行分布式计算。Hadoop得以在大数据处理应用中广泛应用得益于其自身在数据提取、变形和加载(ETL)方面上的天然优势。Hadoop的分布式架构,将大数据处理引擎尽可能的靠近存储。

不知道大家有没有听说Nutch这个框架。如果有人使用java做爬虫就应该知道!该框架的作者就是Doug Cutting。hadoop也起源于Nutch并且借鉴了Google于2003年发表的GFS和MapReduce相关论文。有兴趣的可以翻出去看一下。

1.1 hadoop简介

我们先看一下hadoop1.x的生态系统:

这里写图片描述

我们对上面各个模块做一些简要说明:

  • Ambari:基于web的Hadoop集群安装,部署,管理,监控工具。
  • HDFS:分布式文件系统,提供数据容错和对数据的高吞吐率访问。
  • MapReduce:分布式,并行编程模型。将任务分为map和reduce两个阶段,从而实现每个阶段对数据的并行处理。
  • ZooKeeper:高性能的分布式应用程序协调服务,是google的chubby的一个开源实现。
  • HBase:基于HDFS的面向列存储的分布式数据库,用于快速读写大量数据。
  • Hive:以类SQL语言提供实时大规模数据实时查询的数据仓库。
  • Pig:提供高级数据流语言和计算框架来代替mapreduce任务的编写。
  • Mahout:可扩展的基于mapreduce的机器学习和数据挖掘库。
  • Flume:高可用,高可靠,分布式的海量日志采集、聚合和传输的系统。提供对数据进行简单处理,并写到各种数据接收方的能力。
  • Sqoop:用于在关系数据库,数据仓库和Hadoop文件系统之间转移数据的工具。

我们再来看一下hadoop2.x系统架构:

这里写图片描述

2.核心模块说明

2.1 hadoop1.x—-hdfs模块

HDFS作为分布式文件系统的一种,设计之初就是针对适合一次写入,多次查询的情况。不支持并发写,不适用于小文件存储,低时延的数据访问。HDFS包含3个部分:

  • NameNode节点
  • SecondaryNameNode节点
  • DataNode节点

NameNode负责存储数据文件的元数据;
SecondaryNameNode作为NameNode的冷备份,负责合并NameNode上的fsimage和edits文件,再发送给NameNode;
DataNode负责存储实际的数据块。

NameNode负责管理文件系统目录结构,接受客户端的文件操作请求。NameNode维护两套数据:
一套是文件目录与数据块之间的对应关系
一套是数据块与存储节点之间的对应关系。
前一套数据是静态的,存放在磁盘上,通过fsimage和edits文件来维护;后一套是动态的,在集群重启时会在内存自动建立这些信息。其中fsimage存储的是某一时段NameNode内存元数据信息(配置时通过hdfs-default.xml中的dfs.name.dir选项设置);edits记录操作日志文件(配置时通过hdfs-default.xml的dfs.name.edits.dir选项设置);fstime保存最近一次checkpoint的时间。

DataNode负责按Block存储数据文件。每一个数据文件都会按照Block大小进行划分,每个Block都会进行多副本备份(一般为三份)。通常多个副本会按照一定的策略放在不同的DataNode节点上,配置时通过hdfs-default.xml的dfs.data.dir选项设置。
总体架构如下:

这里写图片描述

HDFS1.x中存在的问题:

  • NameNode单点故障,难以应用于在线场景
  • NameNode压力过大,且内存受限,影响系统可扩展性

2.2 hadoop1.x—-MapReduce模块

MapReduce 框架的核心步骤主要包括两部分:Map 和Reduce。当你向MapReduce 框架提交一个计算作业时,它会首先把计算作业拆分成若干个Map 任务,然后分配到不同的节点上去执行,每一个Map 任务处理输入数据中的一部分,当Map 任务完成后,它会生成一些中间文件,这些中间文件将会作为Reduce 任务的输入数据。Reduce任务会对主要对若干个map任务的输出进行汇总。整个数据流图如下:

这里写图片描述

MapReduce作业涉及两个重要的实体:

  • JobTracker:初始化作业,分配作业,与TaskTracker通信,调度整个作业的执行。
  • TaskTracker:保持与JobTracker的通信,在分配的数据片段上执行Map或Reduce任务。

我们简单看一下mapreduce作业的运行过程:

mapreduce作业的运行过程

上图中整体流程如下:

  1. 在集群中的任意一个节点提交MapReduce程序;
  2. JobClient收到作业后,JobClient向JobTracker请求获取一个Job ID;
  3. 将运行作业所需要的资源文件复制到HDFS上(包括MapReduce程序打包的JAR文件、配置文件和客户端计算所得的输入划分信息),这些文件都存放在JobTracker专门为该作业创建的文件夹中,文件夹名为该作业的Job ID;
  4. 获得作业ID后,提交作业;
  5. JobTracker接收到作业后,将其放在一个作业队列里,等待作业调度器对其进行调度,当作业调度器根据自己的调度算法调度到该作业时,会根据输入划分信息为每个划分创建一个map任务,并将map任务分配给TaskTracker执行;
  6. 对于map和reduce任务,TaskTracker根据主机核的数量和内存的大小有固定数量的map槽和reduce槽。这里需要强调的是:map任务不是随随便便地分配给某个TaskTracker的,这里有个概念叫:数据本地化(Data-Locality),意思是:将map任务分配给含有该map处理的数据块的TaskTracker上,同时将程序JAR包复制到该TaskTracker上来运行,这叫“运算移动,数据不移动”;
  7. TaskTracker每隔一段时间会给JobTracker发送一个心跳,告诉JobTracker它依然在运行,同时心跳中还携带着很多的信息,比如当前map任务完成的进度等信息。当JobTracker收到作业的最后一个任务完成信息时,便把该作业设置成“成功”。当JobClient查询状态时,它将得知任务已完成,便显示一条消息给用户;
  8. 运行的TaskTracker从HDFS中获取运行所需要的资源,这些资源包括MapReduce程序打包的JAR文件、配置文件和客户端计算所得的输入划分等信息;
  9. TaskTracker获取资源后启动新的JVM虚拟机,运行每一个任务。

MapReduce1.x存在的问题:

  • JobTracker访问压力大,影响系统可扩展性
  • 难以支持出MapReduce之外的其他计算框架,如Spark,Storm

2.3 hadoop2.x—-HSFS模块

HDFS2针对HDFS1中问题的主要改进是提供了NameNode HA和NameNode Federation。

  • NameNode HA:主备NameNode解决单点故障,主NameNode对外提供服务,备NameNode同步主NameNode元数据以待切换,所有DataNode同时向两个NameNode汇报数据块信息

这里写图片描述

  • NameNode Federation:把元数据的存储和管理分散到多个节点上,每个NameNode管理文件系统命名空间的一部分,实现NameNode横向扩展,把单个NameNode的负载分散到多个节点上。

这里写图片描述

2.4 hadoop2.x—Yarn模块

Hadoop2.x为了改进1.x中MapReduce的缺点,促进框架的长远发展,从0.23.0版本开始,对MapReduce框架进行完全重构,并将新框架命名为Yarn(Yet Another Resource Negotiator),主要思想是将资源管理和任务调度监控划分到不同的组件中,整体架构如下图,包含三个主要组件ResourceManager,ApplicationMaster,NodeManager。

这里写图片描述

  • ResourceManager:基于应用程序对资源(内存,CPU,磁盘,网络等)的需求进行集群资源的仲裁,RM 会追踪集群中有多少可用的活动节点和资源,协调用户提交的哪些应用程序应该在何时获取这些资源,每一个应用程序需要不同类型的资源因此就需要不同的容器。包含ResourceScheduler(根据容量、队列等限制条件,将系统中的资源分配给各个正在运行的应用程序)和Applications Manager(负责管理整个系统中所有应用程序,包括应用程序提交、与调度器协商资源以启动ApplicationMaster、监控
  • ApplicationMaster运行状态并在失败时重新启动它等)l两个组件。
  • ApplicationMaster:向RM和NodeManager要求启动占用一定资源的Container,跟踪协调应用程序(MR作业,DAG作业)中所有任务的执行。
  • NodeManager:每个节点的框架代理,启动执行应用程序的容器,监控应用程序的资源使用情况,并向调度器汇报。

这里写图片描述

yarn工作流程:

  1. 用户向YARN中提交应用程序,其中包括ApplicationMaster程序、启动ApplicationMaster的命令、用户程序等。

  2. ResourceManager为该应用程序分配第一个Container,并与对应的Node-Manager通信,要求它在这个Container中启动应用程序的ApplicationMaster。

  3. ApplicationMaster首先向ResourceManager注册,这样用户可以直接通过ResourceManager查看应用程序的运行状态,然后它将为各个任务申请资源,并监控它的运行状态,直到运行结束,即重复步骤4~7。

  4. ApplicationMaster采用轮询的方式通过RPC协议向ResourceManager申请和领取资源。

  5. 一旦ApplicationMaster申请到资源后,便与对应的NodeManager通信,要求它启动任务。
  6. NodeManager为任务设置好运行环境(包括环境变量、JAR包、二进制程序等)后,将任务启动命令写到一个脚本中,并通过运行该脚本启动任务。
  7. 各个任务通过某个RPC协议向ApplicationMaster汇报自己的状态和进度,以让ApplicationMaster随时掌握各个任务的运行状态,从而可以在任务失败时重新启动任务。 在应用程序运行过程中,用户可随时通过RPC向ApplicationMaster查询应用程序的当前运行状态。
  8. 应用程序运行完成后,ApplicationMaster向ResourceManager注销并关闭自己。

2.5 hadoop2.x—pig模块

Pig提供类SQL语言(Pig Latin)通过MapReduce来处理大规模半结构化数据。而Pig Latin是更高级的过程语言,通过将MapReduce中的设计模式抽象为操作,如Filter,GroupBy,Join,OrderBy,由这些操作组成有向无环图(DAG)。例如如下程序:

visits = load ‘/data/visits’ as (user, url, time);gVisits  = group visits by url;visitCounts  = foreach gVisits generate url, count(visits);urlInfo  = load ‘/data/urlInfo’ as (url, category, pRank);visitCounts  = join visitCounts by url, urlInfo by url;gCategories = group visitCounts by category;topUrls = foreach gCategories generate top(visitCounts,10);store topUrls into ‘/data/topUrls’;

描述了数据处理的整个过程。

而Pig Latin又是通过编译为MapReduce,在Hadoop集群上执行的。上述程序被编译成MapReduce时,会产生如下图所示的Map和Reduce:

这里写图片描述

Pig解决了MapReduce存在的大量手写代码,语义隐藏,提供操作种类少的问题。类似的项目还有Cascading,JAQL等。

2.5 hadoop2.x—Tez模块

Apache Tez,Tez是HortonWorks的Stinger Initiative的的一部分。作为执行引擎,Tez也提供了有向无环图(DAG),DAG由顶点(Vertex)和边(Edge)组成,Edge是对数据的移动的抽象,提供了One-To-One,BroadCast,和Scatter-Gather三种类型,只有Scatter-Gather才需要进行Shuffle。
以如下SQL为例:

SELECT a.state, COUNT(*),AVERAGE(c.price)FROM aJOIN b ON (a.id = b.id)JOIN c ON (a.itemId = c.itemId)GROUP BY a.state

这里写图片描述

图中蓝色方块表示Map,绿色方块表示Reduce,云状表示写屏障(write barrier,一种内核机制,可以理解为持久的写),Tez的优化主要体现在:

  1. 去除了连续两个作业之间的写屏障
  2. 去除了每个工作流中多余的Map阶段(Stage)

通过提供DAG语义和操作,提供了整体的逻辑,通过减少不必要的操作,Tez提升了数据处理的执行性能。

上面简单说了一下hadoop的框架和重要模块。其实说了这么久hadoop,你到底知不知道hadoop是干嘛的?弄清这个问题很重要哈。学以致用,用到了才算。文上我们也说了是在大数据的场景中诞生hadoop。那么什么是大数据呢?大数据的实质特性:针对增量中海量的结构化,非结构化,半结构数据,在这种情况下,如何快速反复计算挖掘出高效益的市场数据?

带着这个问题渗透到业务中去分析,就知道hadoop需要应用到什么业务场景了!!!如果关系型数据库都能应付的工作还需要hadoop吗?

我们举一些例子:

  1. 银行的信用卡业务,当你正在刷卡完一笔消费的那一瞬间,假如在你当天消费基础上再消费满某个额度,你就可以免费获得某种令你非常满意的利益等等,你可能就会心动再去消费,这样就可能提高银行信用卡业务,那么这个消费额度是如何从海量的业务数据中以秒级的速度计算出该客户的消费记录,并及时反馈这个营销信息到客户手中呢?这时候关系型数据库计算出这个额度或许就需要几分钟甚至更多时间,就需要hadoop了,这就是所谓的“秒级营销”. 针对真正的海量数据,一般不主张多表关联。

  2. 在淘宝,当你浏览某个商品的时候,它会及时提示出你感兴趣的同类商品的产品信息和实时销售情况,这或许也需要用到hadoop.

  3. .谷歌搜索引擎分析的时候应该也会用到。

hadoop 主要用于大数据的并行计算

  1. 数据密集型并行计算:数据量极大,但是计算相对简单的并行处理
    如:大规模Web信息搜索

  2. 计算密集型并行计算:数据量相对不是很大,但是计算较为复杂的并行计算
    如:3-D建模与渲染,气象预报,科学计算

  3. 数据密集与计算密集混合型的并行计算
    如:3-D电影的渲染

hadoop主要应用于数据量大的离线场景。特征为:

1、数据量大。一般真正线上用Hadoop的,集群规模都在上百台到几千台的机器。这种情况下,T级别的数据也是很小的。Coursera上一门课了有句话觉得很不错:Don’t use hadoop, your data isn’t that big

2、离线。(大数据不等于高并发)Mapreduce框架下,很难处理实时计算,作业都以日志分析这样的线下作业为主。另外,集群中一般都会有大量作业等待被调度,保证资源充分利用。

3、数据块大。由于HDFS设计的特点,Hadoop适合处理文件块大的文件。大量的小文件使用Hadoop来处理效率会很低。

举个例子,百度每天都会有用户对侧边栏广告进行点击。这些点击都会被记入日志。然后在离线场景下,将大量的日志使用Hadoop进行处理,分析用户习惯等信息。

总的来说Hadoop适合应用于大数据存储和大数据分析的应用,适合于服务器几千台到几万台的集群运行,支持PB级的存储容量

Hadoop典型应用有:搜索、日志处理、推荐系统、数据分析、视频图像分析、数据保存等。

所以各位hadoop的应用场景还是有限的,不是任一个场景都可以上hadoop哈。适得其反就不好了。

Hadoop诞生至今已经十一年,经历了两次重大的版本更新,版图不断扩张,期间也经历了来自其他开源黑马的冲击。Spark在早期发展阶段通过全面兼容Hadoop从而发展成为成熟的生态系统,但Hadoop实际上已经拥抱了Spark技术,积极地适应着不同计算范式的软件平台。此外,Hadoop的商业化也滋养了成千上万的企业,比如Cloudera,Hortonworks,MapR。毫无疑问,Hadoop在这十一年已经是大数据的代名词,大数据的王者,大数据时代软件开发者的必备技能。我们作为技术人员在有这么多前辈无私贡献自己的知识的基础上,应该在有限的时间里多了解这些开源技术,追上时代的步伐!

原创粉丝点击