文章目录
- @[toc]
- 2 Hadoop概念
- 2.1 Hadoop简介
- 2.2 MapReduce编程模型简介
- 2.3 Hadoop系统的组成
文章目录
- @[toc]
- 2 Hadoop概念
- 2.1 Hadoop简介
- 2.2 MapReduce编程模型简介
- 2.3 Hadoop系统的组成
2 Hadoop概念
面对大数据量的处理需求,一个常用的方法就是把它们分割成互不依赖的小份数据来分别计算处理,这就是所谓的单指令多数据流(SIMD)的数据计算模式。Hadoop为这样的云计算提供了一套开源的计算框架和分布式文件系统。
不过要知道的是,Hadoop架构从1.0到2.0变迁后,原先的1.0它是由HDFS和MapReduce构成,这就导致了MapReduce一个组件要干两个活,既要数据处理,又要资源管理。而后在2.0中,资源管理转交给了YERN。
而在3.0中,总体的架构已经没有发生变化了,而是着重于性能优化上面。
比如开始支持GPU运算、多重备份、内部的数据实现、动态地平衡、采用纠删码来存储等。
2.1 Hadoop简介
Hadoop是一个基于Java语言的MapReduce框架。随着Hadoop平台被越来越多的企业采用,Hadoop需要加入对非Java语言的支持。
现在Hadoop已经发展成为包含很多项目的集合。虽然其核心内容是MapReduce和Hadoop分布式文件系统,但与Hadoop相关的Common、Avro、Chukwa、Hive、HBase等项目也是不可或缺的。它们提供了互补性服务或在核心层上提供了更高层的服务。
在下面我们先对它们的这几个小成员做一个简单的介绍吧,为了能够听懂人话,我们采用了一种叙述式讲法:
让我们回到世界转变为数字时代的日子。那时候,生成的数据量非常小,生成缓慢,数据大多数是表格类的数据,也就是我们说的结构化数据,所以存储或处理这类数据并不麻烦。因为单个存储单元和处理器组合就可以完成这项工作。但是随着事件的流逝,互联网席卷了全球,在无时无刻都产生大量多种形式和格式的数据,比如视频、音频还有图像等非结构化或半结构化数据,这些数据我们统称为大数据。看到数据这么大,我们如果想直接处理它们显然是不可能的,而且单个存储单元处理器明显不能做这个事。所以,我们就要推广到多个存储单元和处理器了。这就是我们最开始提到的Hadoop框架的概念。该框架可以更好地处理大数据,其通过多硬件(你可以理解为是多台电脑分别处理数据。)集群来处理。Hadoop由三个专门为处理大数据而设计的组件组成。为了充分利用数据,第一步是存储数据;如果你玩过电脑你就应该知道,在我们查看硬盘上的文件的时候,我们都是通过文件系统来访问电脑的磁盘的。所以对于分布式系统,我们也应该有一个分布式文件系统与之对应,这就是我们要讲的Hadoop分布式文件系统,也叫做HDFS。
假设我们现在有600MB的数据,那么这个数据就会以块
的形式,分别分成好几个数据块。例如上图一个块分为128MB。最后剩下的88MB单独作为一个块。每个块在不同的计算机上。
如果其中一个块由于外界的原因损坏了,那会发生什么呢?记得我们在数据库笔记中讲过分布式数据库系统吗?分布式数据库系统每个节点不是孤立的,而是相互有联系的,每个节点中存储的数据都是在其他节点有相应的备份的。如果把分布式数据库系统推广到我们刚刚说的这个层面上的话,我们可以发现,即使A块损坏,A块也能根据B块和C块中关于A块数据的记录来做恢复。
成功存储数据后,需要对数据进行处理,其数据处理的正是接下来要讲的Hadoop的第二个组件,MapReduce发挥作用的地方。在传统的集中式系统中,整个数据都是在一台具有单个处理器的机器上处理的。既费时又低效。那怎么办呢?Hadoop中的MapReduce就发挥了此时应有的功能:它将数据分摊给各个节点,每个节点分开处理,处理后的结果在汇总然后输出。这实际上改善了负载平衡并节省了大量时间。
现在我们已经准备好了MapReduce,是时候在Hadoop集群上运行了。其过程是在内存、网络带宽和CPU等资源的帮助下完成的。多个作业在Hadoop上完成,它们都需要硬件资源来成功完成任务。为了有效地管理这些资源,我们使用了Hadoop的第三个组件,我们称之为YARN。YARN由资源管理器、节点管理器、应用管理器和容器组成。如下图:
其中资源管理器分配资源,节点管理器处理节点并监控节点中的资源使用情况,容器包含物理资源的集合。假设我们想要处理创建的MapReduce作业,这时候应用管理器从节点管理器请求容器,容器把资源给了节点管理器。节点管理器获得资源后,将它们发送给资源管理器。这样YARN在Hadoop中就可以处理作业请求并管理集群资源。
以上这些只是说了其中几个组件。实际上,Hadoop生态系统还包括其他几个组件。
比如Hive、pig、spark、FLUME和Scoop等。它们致力于更好地管理大数据,广义上Hadoop指的是围绕Hadoop打造的大数据生态圈。
当然了,说完上面的这些简单易懂的东西,还有一些其余复杂的组件,这里也稍微提一下,看不懂没关系,后面会细讲。
Commom:Common是为Hadoop其他子项目提供支持的常用工具,它主要包括FileSystem、PRC和串行化库,它们为廉价硬件上搭建云计算环境提供基本的服务,并且会为运行在该平台上的软件开发提供所需的API。
- Avro:Avro是用于数据序列化的系统。它提供了丰富的数据结构类型、快速可压缩的二进制数据格式、存储持久性数据的文件集、远程调用PRC的功能和简单的动态语言集中功能。其中代码生成器几部需要读写文件数据,也不需要使用或实现PRC协议,它只是一个可选的对静态类型语言的实现。
- Avro系统依赖于模式,数据的读和写是在模式之下完成的。这样可以减少写入数据的开销,提高序列化的速度并缩减其大小;同时,也可以方便动态脚本语言的使用,因为数据连同其模式都是自描述的。
- 在PRC中,Avro系统的客户端和服务端通过握手协议进行模式的交换,因此当客户端和服务端拥有彼此全部的模式时,不同模式下相同命名字段、丢失字段和附加字段等信息的一致性问题就得到了很好的解决。
- Hive:Hive最早是由Facebook设计的,是一个建立在Hadoop基础之上的一个数据仓库,它提供了一些用于对Hadoop文件中的数据集进行数据整理、特殊查询和分析存储的工具。Hive提供的是一种结构化数据的机制,它支持类似于传统RDBMS中的SQL语言的查询语言,来帮助那些熟悉SQL的用于查询Hadoop中的数据,该查询语言由于用到SQL的思想,所以该查询语言也叫Hive QL。有了这个工具后,传统的MapReduce变成人员也可以在Mapper或Reducer中通过Hive QL查询数据。Hive编译器会把Hive QL编译成 一组MapReduce任务。
- HBase:HBase是一个分布式的、面向列的开源数据库,该技术来源于Google论文。HBase在Hadoop之上提供了类似于Bigtable(分布式数据库)的能力。HBase不同于一般的关系数据库,原因有两个:其一,HBase是一个适合于非结构化数据存储的数据库,而我们前面学过数据库的都知道,关系数据库只能存放结构化数据。其二,HBase是基于列而不是基于行的模式。HBase和Bigtable使用相同的数据模型。用户将数据存储在一个表里,一个数据行拥有一个可选择的键和任意数量的列。由于HBase表是疏松的,用户可以为行定义各种不同的列。HBase主要用于随机访问、实时读写的大数据。
- pig:pig是一个对大型数据集进行分析、评估的平台。pig最突出的优势在于它的结构能够经受住高并行化的检验,这个特效使得它能够处理大型的数据集。
- ZooKeeper:ZooKeeper是一个为分布式应用所涉及的开源协调服务。它主要为用户提供同步、配置管理、分组、命名等服务,减轻分布式应用程序所承担的协调任务。ZoopKeeper的文件系统使用了我们熟悉的目录树结构。ZooKeeper是使用java编写的,但是它支持java和C两种编程语言。
2.2 MapReduce编程模型简介
Hadoop系统支持MapReduce编程模型。这个模型分为两个步骤:
- Map:数据初始化读取和转换步骤,在这个步骤中,每个独立的输入数据记录都进行并行处理。
- Reduce:一个数据整合或者加和的步骤。在这个步骤中,相关联的所有数据记录要放在一个计算节点来处理。
粗略的过程我们在前面已经提到了,但是在这一小节,我们需要补充一些细节。
在学习某些编程语言的时候,我们喜欢用hello world来开始我们的学习,这里我们也用MapReduce中的hello world来进入我们的学习。对于MapReduce来说,最简单的程序莫过于计数程序
。其基本逻辑如下。
假如你有海量的文本文档,如果要统计某些单词的出现数量,我们会遵循如下的步骤:
- 维护一个哈希表,该哈希表的键是文本中的每个词,该键对应的值是该词的个数。
- 把每篇文档加载到内存
- 把文档分隔成一个个的词
- 对于文档中的每个词,更新其在哈希表中的计数
- 当所有的文档都处理完成,我们就得到了所有单词的计数
这种方案在少量的文本文档似乎可取,但是对于海量的文本文档,其处理的时间过长,我们试着用MapReduce来解决这个计数问题:
- 有一个多台服务器组成的集群供我们使用。我们假设该集群的计算节点数量为50,
- 每台服务器上都会运行大量的Map处理,一个合理的假设是多少个文件正在被处理,就有多少个Map处理。当然,这种假设是不严格的。
- 在给定的时间内,我们有多少个CPU核,就有多少个Map处理同时运行。集群的服务器是8核的CPU,所以8个Mapper可以同时运行。在数据处理的过程中,8个Mapper同时运行处理文件,一个Mapper处理文件需要经过多次迭代。
- 每个Mapper处理一个文件,抽取文件中的单词,并输出关于单词和出现次数的键值对。如{“THE”:1}
- 假设只有一个Reducer,Reducer会接受上述格式的键值对,如果一个单词出现多次,就会是这样:如{“THE”:1,1,1,1,1…}。其对出现次数进行相加。如{“THE”:20},在这个过程中,键值对一对一变成一对多的过程被叫做
排序/混洗
阶段。
我们把上述的过程画成图,即为下图:
这里需要注意的是,Hadoop并不是从NFS来获取所需处理的文件的,因为从网络中读取是很慢的,为此,Hadoop为了让文件尽快地处理,会利用HDFS把输入的文件分摊存储于所有计算节点中。
2.3 Hadoop系统的组成
对于Hadoop的组成,我们在这一小节会从Hadoop的1.x系统开始讲起。对于1.x系统来说,其有以下几个守护进程:
- 名称结点(NameNode):维护着存储在HDFS上的所有文件的元数据信息。这些元数据信息包括组成文件的数据块信息及这些数据块在数据节点上的位置。
- 辅助名称结点(Secondary NameNode):它为名称结点组件执行一些内务处理。
- 数据结点(DataNode):把真正的数据块存放在本地硬盘上,这些数据块组成了保存在HDFS上的每个文件。
- 作业跟踪器(JobTracker):这是Hadoop系统的主要组件之一,他负责一个任务的整个执行过程:调度各个子任务到各自的计算节点运行,时刻监控任务运行和计算节点的健康状况,对失败的子任务重新调度执行。
- 任务跟踪器(TaskTracker):运行在各个数据节点上,用来启动和管理各个Map/Reduce任务。其和作业跟踪器相互通信。
在Hadoop1.x集群中有两种类型的节点:主节点
和从节点
。主节点负责名称节点、辅助名称节点、作业跟踪器的进程;而从节点负责数据节点和任务跟踪器的进程。