Hadoop由Apache基金会开发, 开源的、可靠的 、可拓展的、用于分布式计算 的分布式系统基础架构或框架。
① 可扩展、高容错、高性能的分布式文件系统
② 负责数据的分布式存储和备份
① Map(映射)
② Reduce(规约)
资源管理器,提高资源在集群中的利用率,提高执行效率
1 2002年——道格·卡廷和迈克·卡法雷拉创建Nutch
2 2003年——谷歌公司发表了GFS和MapReduce论文
3 2004年——道格·卡廷和其他开发者们开始研究NDFS和MapReduce
4 2006年——道格·卡廷加入雅虎公司并带走了Hadoop
5 2007年——开发人员在100个亚马逊的虚拟机服务器上使用Hadoop转换处理了4TB的图片数据
6 2008年——Facebook创建了基于Hadoop的组件:Hive
7 2009年——道格·卡廷加入Cloudera公司
8 2011年——Hortonworkers公司成立
9 2012年——推出YARN框架的靠前个版本
10 2013年——Hortonworkers公司完全开源
11 2014年——Hadoop 2.x快速发展
12 2016年——Hadoop及其生态圈组件得到广泛的应用
13 2017年——Hadoop 3.x发布
14 2022年——Hadoop 3.1.4发布
HDFS在存储文件时将在多台机器或多个节点上存储文件的备份副本,当读取该文件出错或某一个节点宕机时,系统会调用其他节点上的备份文件,保证程序顺利运行。如果启动存储的任务失败,那么Hadoop 将重新运行该任务或启用其他任务来完成失败的任务中没有完成的部分。
数据存储有多个备份,集群部署在不同机器上,可以防止一个节点宕机造成集群损坏。当数据处理请求失败时,Hadoop 将自动重新部署计算任务。Hadoop框架中有备份机制和检验模式,可以对出现问题的部分进行修复,也可以通过设置快照的方式在集群出现问题时回到之前的一个时间点。
Hadoop是在可用的计算机集群间分配数据并完成计算任务的。为集群添加新的节点并不复杂,因此集群可以很容易地进行节点的扩展,以扩大集群。
Hadoop可以在节点之间动态地移动数据,在数据所在节点进行并行处理
并保证各个节点的动态平衡,因此处理速度非常快。
Hadoop 是开源的,即不需要支付任何费用即可下载并安装使用,节省了
软件购买的成本。
Hadoop不要求机器的配置达到极高的水准,大部分普通商用服务器即可满足要求,通过提供多个副本和容错机制提高集群的可靠性。
Hadoop是一个用Java语言开发的框架,因此运行在Linux 系统上是非常理想的。Hadoop 上的应用程序也可以使用其他语言编写,如C++和Python。
分别是分布式文件系统HDFS、分布式计算框架MapReduce和集群资源管理器YARN。
① HDFS是以分布式进行存储的文件系统,主要负责集群数据的存储与读取。
② HDFS是一个主/从(Master/Slave)体系架构的分布式文件系统。
HDFS文件系统主要包含一个NameNode、一个Secondary NameNode和多个DataNode。
1)NameNode.
NameNode用于存储元数据以及处理客户端(Client)发出的请求。
元数据不是具体的文件内容,它包含3类重要信息。
第1类
是文件和目录自身的属性信息,如文件名、目录名、父目录信息、文件大小、创建时间、修改时间等;
第2类
是文件内容存储的相关信息,如文件分块情况、副本个数、每个副本所在的DataNode 信息等;
第3类
是HDFS中所有DataNode的信息,用于管理DataNode。
在NameNode 中存放元数据的文件是fsimage 文件。
在系统运行期间,所有对元数据的操作均保存在内存中,并被持久化到另一个文件edits中。
当NameNode启动时,fsimage文件将被加载至内存,再对内存里的数据执行edits文件中所记录的操作,以确保内存所保留的数据处于最新的状态。
(2) Secondary NameNode。
Secondary NameNode 用于备份NameNode的数据,周期性地将edits文件合并到fsimage文件并在本地备份,将新的fsimage 文件存储至NameNode,覆盖原有的fsimage文件,删除edits文件,并创建一个新的edits文件继续存储文件当前的修改状态。
(3)DataNode.
DataNode 是真正存储数据的地方,在DataNode中,文件以数据块的形式进行存储。
数据文件在上传至HDFS时将根据系统默认的文件块大小被划分成一个个数据块,Hadoop 3.x中一个数据块的大小为128MB,如果存储一个大小为129MB的文件,那么文件将被分为两个数据块进行存储。
再将每个数据块存储至不同的或相同的DataNode中,并且备份副本,一般默认备份3个副本,NameNode 负责记录文件的分块信息,确保在读取该文件时可以找到并整合所有该文件的数据块。
图:
(2)分布式原理
HDFS作为一个分分布式系统可以划分成多个子系统或模块,各自运行在不同的机器上,子系统或模块之间通过网络通信进行协作,实现最终的整体功能。利用多个节点共同协作完成一项或多项具体业务功能的系统即为分布式系统。
分布式文件系统,主要体现在3个方面
图:
(3)宕机处理
数据存储在文件系统中,如果某个节点宕机了,那么很容易造成数据流失。
① 冗余备份——在数据存储的过程中,对每个数据块都进行了副本备份,副本个数可以自行设置。
② 副本存放——目前使用的策略是,以存放3个副本(dfs.replication=3)为例,在同一机器的两个节点上各备份一个副本,再在另一台机器的某个节点上存放一个副本,前者可防止当该机器的某个节点宕机使可恢复数据,后者则防止当某个机器宕机时可恢复数据。
③ 宕机处理
A. 如果NameNode在预定的时间内没有收到心跳信息(默认是10min),将该DataNode从集群中移除。
B. 当HDFS读取某个数据块时,如果正好存储该数据块的某个节点宕机了,那么客户端将会在存储该数据块的其他节点上读取数据块信息。
C. 当HDFS存储数据时,如果需要存放数据的节点宕机,那么HDFS将再重新分配一个节点给该数据块,并备份宕机节点中的数据。
(4)HDFS特点
① HAFS——优点
A. 高容错性
HDFS上传的数据自动保存多个副本,通过增加副本的数量增加HDFS的容错性,如果某一个副本丢失,那么HDFS将复制其他节点上的副本。
B. 适合大规模数据的处理
HDFS能够处理上百万的GB、TB甚至PB级别的数据,数量非常大。
C. 流式数据访问
流式数据访问·HDFS以流式数据访问模式存储超大文件,有着“一次写入,多次读取”的特点,
文件一旦写入,不能修改,只能增加,以保证数据的一致性。
② HAFS——缺点
A. 不适合低延迟数据访问
B. 无法高效存储大量小文件
C. 不支持多用户写人及任意修改文件
(1) MapReduce简介
MapReduce是Hadoop的核心计算框架,是用于大规模数据集(大于1TB)并行运算的编程模型,主要包括Map(映射)和Reduce(规约)两个阶段。
MapReduce的核心思想是,当启动一个MapReduce任务时,Map端将会读取HDFS上的数据,将数据映射成所需要的键值对类型并传至Reduce端。Reduce端接收Map端键值对类型的中间数据,并根据不同键进行分组,对每一组键相同的数据进行处理,得到新的键值对并输出至HDFS。
(2) MapReduce工作原理
一个完整的MapReduce过程包含数据的输入与分片、Map阶段数据处理、Shuffle&Sort阶段数据整合、Reduce阶段数据处理、数据输出等阶段。
① 根据设置的分片大小划分文件,得到一到多个文件块,一个文件块对应一个Map
② 针对所有键相同的数据,对其值进行整合
③ 整合后的数据传送到Reduce端处理
图:
(3)了解HDFS
① 读取输入数据
从HDFS分布式文件系统中读取的,根据所设置的分片大小对文件重新分片(Split)。
② Map阶段
数据将以键值对的形式被读入,键的值一般为每行首字符与文件最初始位置的偏移量,即中间所隔字符个数,值为该行的数据记录。
根据具体的需求对键值对进行处理,映射成新的键值对,将新的键值对传输至Reduce端。
③ Shuffle&Sort阶段
将同一个Map中输出的键相同的数据先进行整合,减少传输的数据量,并且在整合后将数据按照键进行排序。
④ Reduce阶段
针对所有键相同的数据,对数据进行规约,形成新的键值对。
⑤ 输出阶段
将数据文件输出至HDFS,输出的文件个数和Reduce的个数一致,如果只有一个Reduce,那么输出的只有一个数据文件,默认命名为“part-r-00000”。
(4)MapReduce的本质
将一组键值对<K1,V1>经过Map阶段映射成新的键值对<K2,V2>,接着经过Shuffle/Sort阶段进行排序和整合,最后经过Reduce阶段,将整合后的键值对组进行规约处理,输出新的键值对<K3,V3>。
图:
(1) YARN简介
① YARN是Hadoop的资源管理器,提交应用至YARN上执行可以提高资源在集群的利用率,加快执行速率。
② Hadoop YARN的目的是使得Hadoop数据处理能力超越MapReduce。
③ YARN的另一个目标就是拓展Hadoop,使得YARN不仅可以支持MapReduce计算,而且还可以很方便地管理如Hive、HBase、Pig、Spark/Shark等组件的应用程序。
(2)YARN的基本架构和任务流程
A. YARN的基本组成结构 YARN主要由ResourceManager、NodeManager、ApplicationMaster和Client Application这4部分构成。
图:
① ResourceManager(简称RM):一个全局的资源管理器,负责整个系统的资源管理和分配,主要由两个组件构成,即调度器(Scheduler)和应用程序管理器(Applications Manager,ASM)。
调度器负责将系统中的资源分配给各个正在运行的应用程序,不从事任何与具体应用程序相关的工作,如监控或跟踪应用程序的执行状态等,也不负责重新启动因应用程序行失败或硬件故障而导致的失败任务。
应用程序管理器负责处理客户端提交的任务以及协商靠前个Container(包装资源的对象)以供ApplicationMaster 运行,并且在Application Master失败时会将其重新启动。其中,Container 是YARN中的资源承载,它封装了某个节点上的多维度资源,如内存、CPU、磁盘、网络等。当Application Master 向 ResourceManager 申请资源时,ResourceManager为ApplicationMaster 返回的资源就是使用Container 表示的。YARN会为每个任务分配一个Container,且该任务只能使用该Container 中描述的资源。
②NodeManager(简称NM):每个节点上的资源和任务管理器。一方面,它会定时地向ResourceManager 汇报本节点上的资源使用情况和各个Container的运行状态;另一方面,它将接收并处理来自 ApplicationMaster 的Container 启动或停止等各种请求。
③ ApplicationMaster(简称AM):在用户提交每个应用程序时,系统会生成一个ApplicationMaster 并将其添加到提交的应用程序里。ApplicationMaster 的主要功能如下。
与ResourceManager 调度器协商以获取资源(用Container 表示)。
将得到的任务进行进一步的分配。
与NodeManager 通信以启动或停止任务。
监控所有任务运行状态,在任务运行失败时重新为任务申请资源并重启任务。
④ Client Application:客户端应用程序。客户端将应用程序提交到ResourceManager时,首先将创建一个Application 上下文对象,再设置 ApplicationMaster 必需的资源请求信息,最后提交至ResourceManager。
(2)YARN的工作流程。
YARN从提交任务到完成任务的整个工作流程如下:
YARN的工作流程:
① 用户通过客户端提交一个应用程序到YARN中进行处理,其中包括 ApplicationMaster程序、启动ApplicationMaster的命令、用户程序等。
②ResourceManager 为该应用程序分配靠前个Container,并与分配的Container 所在位置的NodeManager 通信,要求NodeManager 在这个Container 中启动应用程序的ApplicationMaster。该Container 用于启动 ApplicationMaster 和 ApplicationMaster后续的命令。
③ ApplicationMaster 启动后先向 ResourceManager 注册,这样用户就可以直接通过ResourceManager 查看应用程序的运行状态,再为提交的应用程序所需要执行的各个任务申请资源,并监控任务的运行状态,直至运行结束,即重复步骤④~⑦。图1-7所示的示例应用程序需要执行两个Map任务和一个Reduce任务,因此需要轮番执行步骤④~⑦共3次,先执行Map任务,再执行Reduce任务。
④ ApplicationMaster 采用轮询的方式通过远程进程调用(Remote Procedure Call,RPC)协议向ResourceManager 申请和领取资源。因此多个应用程序同时提交时,不一定是靠前个应用程序先执行。
⑤一旦 ApplicationMaster 申请到资源,便与资源对应的 NodeManager 通信,要求NodeManager 在分配的资源中启动任务。
⑥NodeManager 为任务设置好运行环境(包括环境变量、Jar包、二进制程序等)后,将任务启动命令写入一个脚本中,并通过运行该脚本启动任务。
⑦ 被启动的任务开始执行,各个任务通过某个RPC 协议向 ApplicationMaster 汇报运行的状态和进度,以便让ApplicationMaster 随时掌握各个任务的运行状态,从而可以在任务失败时重新启动任务。在应用程序运行过程中,用户可随时通过RPC协议向ApplicationMaster查询应用程序的当前运行状态。
⑧应用程序运行完成后,ApplicationMaster 向ResourceManager进行注销,释放资源。
⑨关闭客户端与 ApplicationMaster。
Hadoop经过多年的发展,已经形成了一个相当成熟的生态系统。现代生活节奏快速,各行各业无时无刻产生着大量的数据,Hadoop也应用于各种行业中,发挥着重要的作用。因为不同的需求,所以还需要在Hadoop的基础上进行一些改进和优化,也因此产生了许多围绕Hadoop展开的工具,逐渐地演变成一个庞大的Hadoop生态系统。
在Hadoop生态系统中不同的组件分别提供特定的服务,常用的组件:
介绍:
HBase是一个针对非结构化数据的可伸缩、高可靠、高性能、分布式和面向列的动态模式数据库。
提供了对大规模数据的随机、实时读写访问。
保存的数据可以使用MapReduce进行处理。
将数据存储和并行计算很好地结合在一起。
应用场景:
大数据量(TB级数据)且有快速随机访问的需求,如淘宝交易记录等。
及时响应用户的需求。
业务场景简单,不需要关系型数据库中的很多特殊操作,如交叉查询、连接查询等
介绍:
Hive是建立在Hadoop上的数据仓库基础构架
提供了一系列的工具,可存储、查询和分析存储在Hadoop中的大规模数据
定义了一种类SQL语言为HQL(Hive Query Language),HQL语句在Hive的底层将被转换为复杂的MapReduce程序,运行在Hadoop大数据台上.
应用场景:
大数据集的批处理作业,如网络日志分析
介绍:
Pig是一个基于Hadoop的大规模数据分析框架。
提供的类SQL语言为Pig Lalin。PigLatin语言的编译器会将类SQL的数据分析请求转换成一系列经过优化处理的MapReduce程序进行计算。
支持的数据格式非常灵活,可以自由转化,并且在运算过程中用关系进行存储,减少了文件的输出。
应用场景:
对数据存储的要求较低,适用于非结构化的数据集,支持复合数据类型,如Map、Tuple、Bag等。
支持常见的数据操作,如筛选、排序和连接。
适用于日志数据的处理。雅虎和推特均采用了Pig处理数据。
介绍:
Sqoop是一款开源的工具。
主要用于在Hadoop与关系型数据库(如MySQL、PoslgreSQL等)之间传输数据,可以将一个关系型数据库中的数据导人至Hadoop的HDFS中,也可以将HDFS的数据导出至关系型数据库中。
应用场景:
对于结构化数据库,采用Sqoop进行数据传输是合适的,可以实现结构化数据库中的数据并行批量人库至HDFS进行存储。
介绍:
Flume是Cloudera提供的一个高可用的、高可靠的、分布式的海量日志采集、聚合和传输系统。
支持在日志系统中定制各类数据发送方,用于收集数据。
可以对数据进行简单处理,并传输至各种数据接收方。
应用场景:
日志文件的采集。
介绍:
Oozie是基于Hadoop的调度器,编写xml格式的文件制定调度流程,可以调度MapReduce、Pig、Hive、Shell等任务。
当一个工作任务中需要调用几个任务时,一个任务完成再启动另一个是比较麻烦的,在这种情况下即可使用Oozie将任务串联,通过Oozie调动整个任务进程。
介绍:
ZooKeeper可解决分布式环境下的数据管理问题,如统一命名、状态同步、集群管理、配同步等。
ZooKeeper的使用主要是为了保证集群各项功能正常进行,并在出现异常时能够及时通知处理,保持数据一致性,是对整个集群的监控。
介绍:
Mahout的主要目标是创建一些可扩展的机器学习领城经典算法,旨在帮助开发人员更加方便快捷地创建智能应用程序。
现已包含了聚类、分类、推荐(协同过滤)和关联规则等广泛使用的机器学习算法。
除了算法外,Mahout还包含数据输人和输出的工具、与其他存储工具(如MySQL、MongoDB等)集成等支持架构。
应用场景:
通过提供机器学习算法包使得用户在使用的过程中能够直接通过调用算法包缩短编程时间,同时也减少用户复杂的算法程序对资源的消耗。
TAG:hadoop简介