Hadoop简介
Hadoop是谷歌以2004年发表的一篇关于MapReduce的论文作为基础开发的,就自身来讲,Hadoop是一个基于Java语言的MapReduce框架。随着Hadoop被越来越多的企业采用,自身不断改进并衍生出很多子项目。
- Hadoop Streaming——任何命令行脚本都可以通过Streaming调用MapReduce框架。
- Hadoop Hive——使用MapReduce平台的用户发现,开发一个MapReduce程序常常需要大量的编码工作,而且易于出错且难以测试。Apache Hive可以把海量的数据集放入数据仓库,用户可以编写类似SQL的语句的Hive查询语句来查找数据。Hive引擎把Hive查询语句透明地转换为底层MapReduce任务来执行。高级用户还可以用Java编写自定义函数。
- Hadoop Pig——使用Pig的目的与使用Hive的目的是一样的,但是Hive是一个类似SQL的语言,属于陈述性语言,而Pig是一种过程性语言,非常适合数据管道应用场景。
- Hadoop Hbase——所有之前的项目,包括MapReduce都是批处理程序,并不是实时的查询数据,而Hbase可以在Hadoop中实时查询数据。
MapReduce编程模型简介
MapReduce模型有两个彼此独立的步骤,这两个步骤可以配置并需要用户在程序中自定义:
- Map: 数据初始读取和转换步骤,这个步骤中,每个独立的输入数据记录都进行并行处理
- Reduce: 一个数据整合或者加和的步骤,在这个步骤中,相关联的所有数据记录要放在一个计算节点来处理。
Hadoop系统中MapReduce的核心思路是:将输入的数据在逻辑上分割成多个数据块,每个逻辑数据块被Map任务单独地处理。数据块处理后所得结果会被划分到不同的数据集,且将数据集排序完成。每个经过排序的数据集传输到Reduce任务进行处理。
当数据量不是很大的时候,我们计算文档中每个词出现的个数并不是一件难事。
- 维护一个哈希表,该哈希表的键为文本中的每一个词,该键对应的值是该词的个数
- 把每篇文档加载进内存
- 把文档分隔成一个个的词
- 对于文档中的每个词,更新其在哈希表中的个数- 当所有的文档都处理完成,我们就得到了所有单词的计数
当数据量非常大的时候,我们可以尝试使用MapReduce来解决这个计数问题
- 假设有一个多台服务器组成的集群供我们使用,假设该集群的计算节点数量为50,每台服务其上都会运行大量的Map处理,假设有一千万个文件,这样就会有一千万个Map处理这些文件,在给定的时间内,我们假设有多少个CPU核,就会有多少个Map在同时进行。集群的服务器是8核的,所以可以有8个Map同事运行,这样每台服务器负责运行20万个Map处理,整个数据处理过程中,每个计算节点都会运行8个Mapper,共25000个迭代(每次迭代过程可以运行8个Mapper,一个CPU运行一个Mapper)
- 每个Mapper处理一个文件,抽取文件的单词,输出<{WORD},1>键值对
- 假设我们只有一个Reduce,这个假设不是必须的,只是默认的设定,实际应用的场景中我们根据需求常常需要改变。
- Reduce接收<{WORD},[1,...,1]>这样的键值对
- Reduce每处理一个相同的单词,就将该单词的计数加1,最终得到单词的总数,然后按照以下键值对格式输出:<{WORD},{单词总数}>
- 最后排序输出结果
Hadoop系统组成:
Hadoop1.x版本系统的组件:
1.名称节点(NameNode):维护着存储在HDFS上的所有文件的元数据信息。这些元数据信息包括组成文件的数据块信息,及这些数据块在数据节点上的位置。
2.辅助名称节点(SecondaryNameNode):这不是名称节点的备份,实际上是Hadoop平台的一个组件,为名称节点组件执行一些内务处理功能。
3.数据节点(DataNode):把真正的数据块存放在本地硬盘上,这些数据块组成了保存在HDFS上的每个文件。
4.作业跟踪器(JobTracker):负责一个任务的整个执行过程,它的具体功能包括:调度各个子任务(Mapper和Redeuce任务各自的子任务)到各自的计算节点运行,时刻监控任务运行和计算节点的健康状况,对失败的子任务重新调度执行。
5.任务跟踪器(TaskTracker):运行在各个数据节点上,用来启动和管理各个Map/Reduce任务,与作业跟踪器通信。
Hadoop分布式文件系统HDFS
Hadoop的文件本质是块存储
对于大数据,我们首要解决的就是大数据的存储问题,这里我们采用HDFS分布式存储的解决方案。HDFS是主从架构,运行名称节点进程的服务器为主节点,运行数据节点进行的服务器为从节点。在Hadoop系统中,每个文件都被分隔成多个数据块,每个数据块的大小为64MB,也可以配置成32MB或者128MB,这些数据块存储在数据节点上,为了防止节点故障,这些数据块是有备份的,系统默认的备份数量是3,具有机架感知功能的Hadoop系统把文件的一个数据块存储在本地机架上的一台计算节点上,第二个备份会存放在另外一个远程机架上的计算节点上,第三个备份会存放在第二次数据块备份机架上的另一台计算节点上。Hadoop系统借助一个单独配置的网络拓扑文件实现机架感知功能,这个网络拓扑文件配置了机架到计算节点的域名系统DNS名称之间的映射,该网络拓扑文件路径配置在Hadoop配置文件中。
文件元数据和名称节点
当客户端想HDFS请求读取或者存储一个文件的时候,它需要知道要访问的数据节点是哪一个,NameNode负责管理所有的文件操作,包括文件/目录的打开、关闭、重命名、移动等等。数据节点就负责存储实际的文件数据,这是一个非常重要的区别,当客户点请求或者发送文件数据,文件的数据在物理上不是经过NameNode传输的,客户端仅仅是简单地从NameNode获取文件的元数据,然后根据其元数据信息直接从数据节点获取文件的数据块。需要注意的是NameNode并不存储数据节点的身份信息,数据节点的身份信息在集群启动的时候从每个数据节点获取。名称节点维护的信息是:HDFS的文件由哪些数据块(数据节点上每个数据块的文件名组成)
元数据存储在名称节点的本地磁盘上,但是为了快速访问,在集群操作的时候会把这些元信息加载到内存。这个提高了Hadoop系统的操作性能,但是如果Hadoop存储小文件,很容易会使元数据的数据量大幅增长,导致名称节点更大量的内存占用。但是同时成为了Hadoop系统的一个瓶颈,由此衍生出Hadoop2.x
HDFS系统写文件机制
客户端把一个文件写入到HDFS文件那系统需要经过以下几个步骤
- 客户端在联系名称节点之前,会把文件数据流式地读入到客户端本地文件系统中的一个临时文件中
- 当文件数据的大小达到一个数据块的大小时,客户端就联系名称节点
- 名称节点会在HDFS文件系统的层级结构中构建一个文件,然后把数据块的标识符和数据节点上的位置信息发送给客户端。这个数据节点数据块信息列表里面还包括了其备份节点的数据块信息列表。
- 进行完上诉的步骤,客户端就会根据上一步的数据块信息把本地临时文件中的数据刷新到集群上的数据块(只写入到第一个数据节点中)这样,真实的文件数据就放在了集群数据节点本地文件存储系统中。
- 当文件(客户端可以访问的HDFS文件)被关闭时候,名称节点会执行一个提交操作,从而使得该文件在集群中为可见状态。如果在提交操作完成之前名称节点挂掉了,这个文件就丢失了。
HDFS系统读文件机制
1)客户端访问名称节点,名称节点返回组成文件的数据块列表以及数据块的位置(包括备份数据块的位置)
2)客户端会直接访问数据节点以获取数据块中的数据。如果此时其访问数据节点出现古战,就会访问存在备份数据块的数据节点
3)读取数据块的时候会计算该数据块的校验和,并将该校验和与写入文件时候的校验和作比较,如果检验失败,则从其他数据节点获取备份数据块。
HDFS系统删除文件机制
1)名称节点仅仅重命名了文件路径,使其移动到/trash目录,需要注意的是,这个操作过程是链接到重命名文件路径的元数据的更新操作。这个执行过程非常迅速,/trash目录中的文件会保存一段时间,这个保存时间是预先确定的(当前设定为6小时而且当前不可配置)在这段时间内,把删除的文件从/trash目录中移动出来即可迅速地恢复该文件。
2)当/trash目录中的文件超过了保存时间,名称节点就会将该文件从HDFS命名空间删除。
3)删除文件就会使得改文件相关的数据块被释放,HDFS系统最后会显示增加了一些空闲的空间。‘
辅助名称节点
辅助名称节点的作用就是周期性地把edit文件中的内容与fsimage文件中的内容合并,辅助名称节点会周期性地顺序执行下列步骤:
1)辅助名称节点会请求名称节点来结转文件,确保新的更新保存到一个新的文件,这个新的文件名字叫做edits.new
2)辅助名称节点向名称节点请求获取fsimage文件和edits文件
3)辅助名称节点把edits文件和fsimage文件合并,生成一个新的fsimage文件
4)名称节点从辅助名称节点接收到新生成的fsimage文件,并替代旧的fsimage文件。同时将edits文件中的内容替换成步骤1中创建的edit.new文件的内容。
5)更新fstime文件来记录发生的检查点操作
任务跟踪器和作业跟踪器
任务跟踪器守护进程在集群中每台计算节点运行,接收诸如Map和Reduce和Shuffle这些操作任务的请求,每个任务跟踪器都会分配一定的槽位数,其槽位数的数量一般与计算节点上可用的CPU核数一致,任务跟踪器接收到一个来自作业跟踪器的请求后,就会启动一个任务,任务跟踪器会为这个任务初始化一个新的JVM。作业跟踪器守护进程负责启动和监控MapReduce作业,当一个客户端向Hadoop系统提交一个作业,作业的启动流程如图:
1)作业跟踪器收到了作业请求
2)大多数的MapReduce作业都需要一个或多个输入文件目录,任务跟踪器向名称节点发出请求,获得一个数据节点的列表。这个列表的数据节点存储了组成输入文件数据的数据块。
3)作业跟踪器为作业的执行做准备工作。在这个步骤中,任务跟踪器确定执行该作业需要的任务(Mapper和Reducer任务)数量。作业跟踪器尽量把这些任务都调度到离数据块最近的位置进行。
4)作业跟踪器把任务提交到每个任务跟踪器节点去执行。任务跟踪器节点监控任务执行情况。任务跟踪器以预先设定的时间间隔发送心跳信息到作业跟踪器,如果作业跟踪器在预先设定的时间间隔之后,没有收到任务跟踪器发来的心跳信息,那么就认为该任务跟踪节点出现故障,任务就会被调度到另外一个节点去运行。
5)一旦所有任务都执行完毕,作业跟踪器就会更新作业状态为成功,如果任务反复失败达到一定数量,作业跟踪器就会宣布作业运行失败、
6)客户端会轮询作业跟踪器及时地获得作业运行状态、
Hadoop2.0
MapReduce已经进行了全新升级,升级后的版本被称为MapReduce2.0或者YARN,YARN是一套应用编程接口,兼容MRV1,Hadoop1.x中的作业调度器承担两个主要功能:
- 资源管理
- 作业调度/作业监控
YARN把这两个功能分为两个守护进程来分别承担,这样的设计使得系统有一个全局的资源管理器以及每个程序有一个应用程序管理器。注意这里我们提到了程序而不是作业,在新的系统中,一个程序既可以指传统概念上的一个单独的MapReduce作业,也可以指一系列作业组成的有向无环图(DAG)
YARN系统由一下几个组成部分:
- 全局资源管理器
- 针对每种应程序的应用程序管理器
- 调度器
- 容器
容器:是YARN框架中的计算单元。一部分CPU内核和一部分内存构成了容器,一个应用程序运行在一组容器当中。它是一个任务进行工作得单元子系统,也可以认为YARN框架中的容器相当于MapReduce v1中的一个任务执行器。集群节点与容器之间的关系是:一个节点可以运行多个容器,但是一个容器只能运行在一个节点之内。应用程序管理器的一个实例会向全局资源管理请求获取资源。调度器会通过每个节点的节点管理器来分配资源(容器)。节点管理器会向全局资源管理器汇报每个容器的使用情况。
节点管理器:运行在集群中的一个节点上,集群中的每一个节点都会运行一个自己的节点管理器,它是一个从属服务,它接收来自资源管理器的请求,然后分配容器给应用程序。它还负责监控和汇报资源使用情况给资源管理器。节点管理器的任务如下:
- 接收来自资源管理器的请求,为作业分配容器
- 与资源管理器交换信息,确保整个集群的稳定运行。资源管理器依靠各个节点管理器的汇报来跟踪整个集群的健康状况,节点管理器作为代理任务来监控和管理本节点的健康状况。
- 管理每个已启动的容器的整个生命周期- 每个节点的日志管理
- 运行各种YARN应用程序使用的辅助服务。
资源管理器:核心是个调度,当多个应用程序竞争使用集群资源的时候,它来负责资源的调度,确保集群资源的优化合理使用。资源管理有一个插件化的调度器,该调度器按程序队列和集群的处理能力,负责为正在运行的多个应用程序分配其所需的集群资源。应用程序管理器:是一个特性的框架函数库实例,同资源管理器协调沟通资源,并通过节点管理器来获取这些系统资源,然后执行任务。可以提高拓展性并且框架更加的通用。
YARN的运行图
HDFS具有的高可用性
通过HDFS的系统介绍,在Hadoop1.x的系统中,名称节点会引发系统单点故障,如果运行名称节点的服务器出现故障了,那么整个集群都会处于不可用的状态,除非名称节点在另外一台服务器上重新启动。Hadoop2.x引入了高可用名称节点的概念,高可用名称节点的背后核心思想是使用两个相同的名称节点,一个处于活动模式,另外一个处于待机模式,处于活动模式的名称节点对系统提供服务,处在待机模式的名称节点需要实时同步活动名称节点的数据,一旦活动名称节点当机,系统可以快速的进行故障切换。在当前的设计中,为了这个目的,两个名称节点必须共享同一个存储设备(通过NFS),活动名称节点的任何修改都会记录到共享存储设备当中的edits日志文件中。待机名称节点将这些修改应用到自己的名称空间中红,一旦活动名称节点发生故障,待机名称节点会确保edits文件中的所有数据都被应用,并接管活动名称节点的职责。