大数据开发入门之hadoop介绍

Hadoop

Hadoop是一个由Apache基金会所开发的分布式系统基础架构,它可以使用户在不了解分布式底层细节的情况下开发分布式程序,充分利用集群的威力进行高速运算存储

Hadoop架构

Hadoop有三个核心组件:

  • HDFS:分布式文件系统
  • YARN:资源管理调度系统
  • MapReduce:分布式计算框架

HDFS

HDFS(Hadoop Distributed File System)是可扩展、容错、高性能的分布式文件系统,可以被广泛的部署于廉价的PC上。对外部客户端而言,HDFS就像一个传统的分级文件系统,可以进行创建、删除、移动或重命名文件或文件夹等操作,与Linux文件系统类似。

hadoop

HDFS架构采用主从架构(master/slave),由一组特定的节点构建的,这些节点包括:

  • 名称节点(NameNode),它在HDFS内部提供元数据服务;
  • 第二名称节点(Secondary NameNode),名称节点的帮助节点,主要是为了整合元数据操作(不是名称节点的备份);
  • 数据节点(DataNode),它为HDFS提供存储块;

名称节点(NameNode)

NameNode是整个文件系统的管理节点,也是HDFS的守护程序,存储在内存,管理数据映射,处理客户端的读写请求,对内存和I/O进行集中管理,管理HDFS的名称空间,会纪录所有的元数据分布存储的状态信息,比如文件是如何分割成数据块的,以及这些数据块被存储到哪些节点上。用户首先会访问Namenode,通过该总控节点获取文件分布的状态信息,找到文件分布到了哪些数据节点。不过这是个单点,发生故障将使集群崩溃。

NameNode中的信息虽然保存在内存中,但是也是可以持久化到磁盘上的。

hadoop

上面的这张图片展示了NameNode怎么把元数据保存到磁盘上的,这里有两个不同的文件:

  • fsimage:它是在NameNode启动时对整个文件系统的快照
  • editlogs:它是在NameNode启动后,对文件系统的改动序列

只有在NameNode重启时,edit logs才会合并到fsimage文件中,从而得到一个文件系统的最新快照。但是在产品集群中NameNode是很少重启的,这也意味着当NameNode运行了很长时间后,edit logs文件会变得很大。在这种情况下就会出现下面一些问题:

  • edit logs文件会变的很大,怎么去管理这个文件是一个挑战。
  • NameNode的重启会花费很长时间,因为有很多改动要合并到fsimage文件上。

Secondary NameNode就是来帮助解决上述问题的,接着往下看,先了解一下Secondary NameNode。

第二名称节点(Secondary NameNode)

第二名称节点也称辅助名称节点,监控HDFS状态的辅助后台程序,可以保存名称节点的副本,它与NameNode进行通讯,定期保存HDFS元数据快照,NameNode故障可以作为备用NameNode使用,目前还不能自动切换。

hadoop

上面的图片展示了Secondary NameNode是怎么工作的:

  • 首先,它定时到NameNode去获取edit logs,并更新到fsimage上;
  • 一旦它有了新的fsimage文件,它将其拷贝回NameNode中;
  • NameNode在下次重启时会使用这个新的fsimage文件,从而减少重启的时间;

现在,我们明白了Secondary NameNode所做的不过是在文件系统中设置一个检查点来帮助NameNode更好的工作,它不是要取代掉NameNode也不是NameNode的备份。

数据节点(DataNode)

DataNode是slave节点,存储在磁盘,负责存储客户端发来的数据块,执行数据块的读写操作并提供检索等服务。

在HDFS中,块(block)是最基本的存储单位,HDFS将每个文件分成一系列较小但仍然较大的块(默认的块大小等于128 MB)。每个块被冗余地存储在三个DataNode上,以实现容错(注:每个文件的副本数量是可配置的)。

YARN

YAEN(Yet Another Resource Negotiator),资源管理调度系统。YARN主要由ResourceManager、NodeManager、ApplicationMaster和Container等组件构成。

ResourceManager

ResourceManager是master上的进程,负责整个分布式系统的资源管理和调度。他会处理来自client端的请求(包括提交作业/杀死作业);启动/监控Application Master;监控NodeManager的情况,比如可能挂掉的NodeManager。

NodeManager

相对应的,NodeManager时处在slave节点上的进程,他只负责当前slave节点的资源管理和调度,以及task的运行。他会定期向ResourceManager回报资源/Container的情况(heartbeat);接受来自ResourceManager对于Container的启停命令。

Application Master

每一个提交到集群的作业都会有一个与之对应的Application Master来负责应用程序的管理。他负责进行数据切分;为当前应用程序向ResourceManager去申请资源(也就是Container),并分配给具体的任务;与NodeManager通信,用来启停具体的任务,任务运行在Container中;而任务的监控和容错也是由Application Master来负责的。

Container

那么container又是什么呢?它包含了Application Master向ResourceManager申请的计算资源,比如说CPU/内存的大小,以及任务运行所需的环境变量和队任务运行情况的描述。AM也是在container上运行的,不过AM的container是RM申请的。

工作流程

hadoop

  • Client向ResourceManager提交作业(可以是Spark/Mapreduce作业);
  • ResourceManager会为这个作业分配一个container;
  • ResourceManager与NodeManager通信,要求NodeManger在刚刚分配好的container上启动应用程序的Application Master;
  • Application Master先去向ResourceManager注册,而后ResourceManager会为各个任务申请资源,并监控运行情况;
  • Application Master采用轮询(polling)方式向ResourceManager申请并领取资源(通过RPC协议通信);
  • Application Manager申请到了资源以后,就和NodeManager通信,要求NodeManager启动任务;
  • 最后,NodeManger启动作业对应的任务。

Mapreduce

MapReduce是一种编程模型,用于大规模数据集的并行运算。Map(映射)和Reduce(化简),采用分而治之思想,先把任务分发到集群多个节点上,并行计算,然后再把计算结果合并,从而得到最终计算结果。

MapReduce的计算流程:

输入 –> map –> shuffle –> reduce –>输出

hadoop

流程说明如下:

  • 输入文件分片,每一片都由一个MapTask来处理;
  • Map输出的中间结果会先放在内存缓冲区中,这个缓冲区的大小默认是100M,当缓冲区中的内容达到80%时(80M)会将缓冲区的内容写到磁盘上。也就是说,一个map会输出一个或者多个这样的文件,如果一个map输出的全部内容没有超过限制,那么最终也会发生这个写磁盘的操作,只不过是写几次的问题;
  • 从缓冲区写到磁盘的时候,会进行分区并排序,分区指的是某个key应该进入到哪个分区,同一分区中的key会进行排序,如果定义了Combiner的话,也会进行combine操作;
  • 如果一个map产生的中间结果存放到多个文件,那么这些文件最终会合并成一个文件,这个合并过程不会改变分区数量,只会减少文件数量。例如,假设分了3个区,4个文件,那么最终会合并成1个文件,3个区;
  • 以上只是一个map的输出,接下来进入reduce阶段,每个reducer对应一个ReduceTask,在真正开始reduce之前,先要从分区中抓取数据;
  • 相同的分区的数据会进入同一个reduce。这一步中会从所有map输出中抓取某一分区的数据,在抓取的过程中伴随着排序、合并;
  • reduce输出;

通俗说MapReduce是一套从海量源数据提取分析元素最后返回结果集的编程模型,将文件分布式存储到硬盘是第一步,而从海量数据中提取分析我们需要的内容就是MapReduce做的事了。

Hadoop生态圈

广义上来讲,我们经常提到的hadoop其实是指hadoop生态圈,是由很多工具组成的庞大的大数据处理工具链。

hadoop

整个hadoop生态圈,涉及到30多种工具和应用,十分庞大,要想全部掌握,确实有点困难。关于hadoop生态圈组成部分,不在本文讨论范畴,大家可以自行百度。

有用就打赏一下作者吧!