Hadoop是一个分布式系统基础架构,用户可以在不了解分布式底层细节的情况下,开发分布式程序、搭建大型数据仓库、PB级数据的存储、处理,、分析,、统计等,充分利用集群的威力高速运算和存储。
Hadoop可以分为狭义和广义两种:
Hadoop的生态系统是非常庞大的,下面介绍生态系统中一些主要部件:
HDFS是Hadoop体系中数据存储管理的基础。它是一个高度容错的系统,能检测和应对硬件故障,用于在低成本的通用硬件上运行。HDFS简化了文件的一致性模型,通过流式数据访问,提供高吞吐量应用程序数据访问功能,适合带有大型数据集的应用程序。
MapReduce是一种计算模型,用以进行大数据量的计算。其中Map对数据集上的独立元素进行指定的操作,生成键-值对形式中间结果。Reduce则对中间结果中相同“键”的所有“值”进行规约,以得到最终结果。MapReduce这样的功能划分,非常适合在大量计算机组成的分布式并行环境里进行数据处理。
Spark是一种类似MapReduce的基于内存的分布式计算框架
Storm是Twitter开源的分布式实时大数据计算框架,类似于Spark的流式处理模块Spark Streaming和Structured Streaming
Flink是一款综合Spark、Storm优点的实时的分布式计算框架,用于对无界和有界数据流进行状态计算
Hive定义了一种类似SQL的查询语言(HQL),将SQL转化为MapReduce任务在Hadoop上执行,可以交互式查询。通常用于离线分析。
HBase查询非常快,底层还是存储在HDFS上,是一个针对结构化数据的可伸缩、高可靠、高性能、分布式和面向列的动态模式数据库。和传统关系数据库不同,HBase采用了BigTable的数据模型:增强的稀疏排序映射表(Key/Value),其中,键由行关键字、列关键字和时间戳构成。HBase提供了对大规模数据的随机、实时读写访问,同时,HBase中保存的数据可以使用MapReduce来处理,它将数据存储和并行计算完美地结合在一起。
解决分布式环境下的数据管理问题:统一命名,状态同步,集群管理,配置同步等。
Sqoop是SQL-to-Hadoop的缩写,主要用于传统数据库和Hadoop之前传输数据。数据的导入和导出本质上是Mapreduce程序,充分利用了MR的并行化和容错性。
由yahoo开源,设计动机是提供一种基于MapReduce的ad-hoc(计算在query时发生)数据分析工具。定义了一种数据流语言—Pig Latin,将脚本转换为MapReduce任务在Hadoop上执行。通常用于进行离线分析。
Mahout的主要目标是创建一些可扩展的机器学习领域经典算法的实现,旨在帮助开发人员更加方便快捷地创建智能应用程序。Mahout现在已经包含了聚类、分类、推荐引擎(协同过滤)和频繁集挖掘等广泛使用的数据挖掘方法。除了算法,Mahout还包含数据的输入/输出工具、与其他存储系统(如数据库、MongoDB 或Cassandra)集成等数据挖掘支持架构。
Cloudera开源的日志收集系统,具有分布式、高可靠、高容错、易于定制和扩展的特点。它将数据从产生、传输、处理并最终写入目标的路径的过程抽象为数据流,在具体的数据流中,数据源支持在Flume中定制数据发送方,从而支持收集各种不同协议数据。同时,Flume数据流提供对日志数据进行简单处理的能力,如过滤、格式转换等。此外,Flume还具有能够将日志写往各种数据目标(可定制)的能力。总的来说,Flume是一个可扩展、适合复杂环境的海量日志收集系统。
Oozie是一个基于工作流引擎的服务器,可以在上面运行Hadoop的Map Reduce和Pig任务。它其实就是一个运行在Java Servlet容器(比如Tomcat)中的Javas Web应用。
Hadoop HDFS、Hadoop MapReduce、Hadoop YARN、Hadoop Common
HDFS(Hadoop Distributed File System)分布式文件系统,是一个高可靠、高吞吐量的分布式文件系统,主要负责数据的存储。
在HDFS中,文件是以block(块)的形式存储在不同的DataNode机器上的,默认块大小为128M, 文件存储默认是采用备份机制(默认为3),也就是说对于同一个文件块,会将其保存在多个不同的DataNode机器上,以达到数据高可用性。
HDFS的特点:
在Hadoop 1.0中,HDFS有三个组件 NameNode、DataNode、SecondaryNameNode
NameNode位于主节点中心服务器。在V1.0中主节点是单节点,因为SecondaryNode和NameNode的同步有时间差不会时刻保持一致,因此有单点故障风险。
NameNode: 主要负责管理文件的**元数据(Metadata)**如:文件名、文件目录结构、文件属性(生成时间、副本数、文件权限),以及datablock和datanode之间的映射关系(即每个文件的块列表和块存放在哪个DataNode中)。运行NameNode会占用大量内存和I/O资源,一般NameNode不会存储用户数据或执行MapReduce任务。
元数据(MetaData): 用来描述数据的数据,描述数据的概要(schema)信息。比如数据库的表的元数据:表的名称、表的字段名、字段的数据类型等。
SecondaryNameNode会周期性的合并EditLogs和FsImage。元数据一般存在于内存中,为避免数据丢失需要对元数据进行持久化操作保存在磁盘上的镜像文件FsImage中,之后重启机器时加载FsImage文件。数据持久化的过程为: 内存———>EditLogs——>FsImage
NameNode有两种映射关系数据:
SecondaryNameNode要是与NameNode进行交互,定期通过合并编辑日志文件(EditLogs)和命名空间镜像(FsImage)来备份元数据。当NameNode发生故障时它会通过加载FsImage副本来恢复。但SecondaryNameNode保存的状态总是滞后于NameNode,所以这种方式也致丢失部分数据。
EditLogs和FsImage合并过程:
Hadoop 2.0除了单机模式外,还有HA模式(高可用模型)和Federation模式(联邦模式)
在高可用模型中,HDFS有两个NameNode:NameNode Active和NameNode Standby
两台 NameNode 形成互备,共享存储系统(共享HDFS的元数据信息、HDFS数据块与DataNode 之间的映射关系)。一台处于Active状态为主 NameNode,另外一台处于 Standby状态为备 NameNode,只有主 NameNode对外提供读写服务。DataNode同时向两个NameNode汇报数据块信息。
ZK:Zookeeper (实现当NameNode Active挂掉之后,切换NameNode Standby )
ZKFC:Zookeeper FailOver Controller,自动切换系统
JN:日志同步系统(保证两个NameNode数据的同步),用来存储两个NN元数据导出来的EditLogs文件,保证文件——>block的一致性
NN:NameNode
DN:DataNode对两个NameNode同时发送心跳:保证 block——>DataNode的一致性
NFS:远程挂载的文件系统
HA模式节点分配
NN和JN通常不在一个机器上
ZKFC和NN在同一台机器
ResourceManager(Yarn中的资源管理器,相当于1.0中Jobtracker部分功能)和NN在同一台机器
NodeManager(Yarn中从节点)和DN在同一个机器上
当前HDFS架构
当前HDFS架构HDFS包含两层结构:Name Space和Block Storage
当前HDFS的局限性
当前Name Node中的Name Space和block management的结合使得这两层架构耦合在一起,难以让其他可能Name Node实现方案直接使用block storage。
HDFS的底层存储是可以水平扩展的(底层存储指的是Data Node,当集群存储空间不够时,可简单的添加机器已进行水平扩展),但Name Space却不可以。当前的Name Space只能存放在单个Name Node上,而Name Node在内存中存储了整个分布式文件系统中的元数据信息,这限制了集群中数据块,文件和目录的数目。
文件操作的性能制约于单个Name Node的吞吐量,单个Name Node当前仅支持约60K的task,而新一代的Apache MapReduce将支持多于100K的并发任务,这隐含着要支持多个Name Node。
现在大部分公司的集群都是共享的,每天有来自不同group的不同用户提交作业。单个Name Node难以提供隔离性。如某个用户提交的负载很大的job会减慢其他用户的job,单一的Name Node难以像HBase按照应用类别将不同作业分派到不同Name Node上。
Federation模式架构
正式由于基于上述局限性,由此我们引出Federation架构。HDFS Federation对NameNode做了横向的拓展可以使用多个Name Node,减轻单一NN的压力,将一部分文件转移到其他NN上管理,从而很好的解决了上述存在的问题。
MapReduce是一个分布式的离线并行计算框架,用于对HDFS上的数据处理。是一种分而治之的计算思想,将任务分解、求解、合并。
我们主要负责map和reduce阶段的实现,其它阶段由MapReduce框架处理。
MapReduce采用Master/Slave架构,一个Master和多个Slave:
Master上(NameNode节点)运行JobTracker负责作业管理、状态监控和任务调度
Slave上(DataNode节点)运行TaskTracker负责任务的执行和任务状态的汇报
MapReduce Task的执行默认是先进先出的队列调度模式(FIFO),也可以设置优先级:very_high、high、normal、low、very low
JobTracker在主节点上,负责接收客户端作业提交,调度任务到从节点上运行,并监控工作节点状态、任务进度,一个MapReduce集群有一个jobtracker,一般运行在可靠的硬件上。
TaskTracker在从节点上,由jobtracker指派任务实例化用户程序,在本地执行任务,并周期性地向jobtracker汇报状态。在每一个工作节点上只有一个tasktracker
YARN主要负责集群的任务调度与资源管理和分配
YARN是Hadoop 2.0引入的,在Hadoop 2.0中YARN的ApplicationMaster和NodeManager分别代替了MapReduce的JobTracker和TaskTracker
全局的资源管理器,负责整个集群的资源管理、分配与调度。处理客户端请求,启动/监控ApplicationMaster,监控NodeManager。
为应用程序申请资源,并分配给内部任务,任务监控、容错、调度。每个运行在Yarn上的应用都有一个该进程在运行
Scheduler负责给应用分配资源。Yarn中的调度器有FIFO Scheduler(默认) 、Capacity Scheduler、FairScheduler三种
对每一个Slave上的任务和资源做调度和管理,单个节点上的资源管理,处理来自ResourceManager的命令,处理来自ApplicationMaster的命令
对任务运行环境的抽象,封装了CPU、内存等多维资源以及环境变量、启动命令等任务运行相关的信息
Common(工具类) 由原来的Hadoop Core更名而来,包括了Hadoop常用的工具类。为其它Hadoop模块提供基础设施,主要包括系统配置工具Configuration、远程过程调用RPC、序列化机制和Hadoop抽象文件系统FileSystem等。它们为在通用硬件上搭建云计算环境提供基本的服务,并为运行在该平台上的软件开发提供了所需的API。