1.3.2 Hadoop生态圈
Hadoop是目前应用最为广泛的分布式大数据处理框架,其具备可靠、高效、可伸缩等特点。
Hadoop的核心组件是HDFS、MapReduce。随着处理任务的不同,各种组件相继出现,极大地丰富了Hadoop生态圈,目前生态圈结构大致如图1.3.1所示。
图1.3.1 Hadoop生态圈结构
根据服务对象和层次分为:数据来源层、数据传输层、数据存储层、资源管理层、数据计算层、任务调度层、业务模型层。接下来对Hadoop生态圈中重要的组件进行简要介绍。
1.HDFS(分布式文件系统)
HDFS 是整个 Hadoop 体系的基础,负责数据的存储与管理。HDFS 有着高容错性(Fault-Tolerant)的特点,并且设计用来部署在低廉的(Low-Cost)硬件设备上,而且它提供高吞吐量(High Throughput)来访问应用程序的数据,适合那些有着超大数据集(Large Data Set)的应用程序。
Client:切分文件,访问 HDFS 时,首先与 NameNode 交互,获取目标文件的位置信息,然后与DataNode交互,读写数据。
NameNode:Master节点,每个HDFS集群只有一个,管理HDFS的命名空间和文件块映射信息,配置相关副本信息,处理客户端请求。
DataNode:Slave节点,存储实际数据,并报告状态信息给NameNode,默认一个文件会有3个文件分别备份在不同的DataNode中,实现高可靠性和高容错性。
Secondary NameNode:辅助NameNode,实现高可靠性,定期合并fsimage和fsedits,推送给NameNode。紧急情况下辅助和恢复NameNode,但其并非NameNode的热备份。
2.MapReduce(分布式计算框架)
MapReduce是一种基于磁盘的分布式并行批处理计算模型,用于处理大数据量的计算。其中“Map”对应数据集上的独立元素进行指定的操作,生成“键—值”对形式,“Reduce”则对中间结果中相同的键的所有值进行规约,以得到最终结果。
Jobtracker:Master节点,只有一个,负责管理所有作业、任务/作业的监控、错误处理等,它将任务分解成一系列任务,并分派给Tasktracker。
Tacktracker:Slave节点,运行Maptask和Reducetask,并与Jobtracker交互,报告任务状态。
Maptask:解析每条数据记录,传递给用户编写的map()函数并执行,将输出结果写入到本地磁盘(如果为Map—only作业,则直接写入HDFS)。
Reducetask:从 Maptask 的执行结果中,远程读取输入数据,对数据进行排序,将数据分组传递给用户编写的Reduce()函数执行。
3.Spark(分布式计算框架)
Spark 是一种基于内存的分布式并行计算框架,不同于 MapReduce 的是,Job 中间输出结果可以保存在内存中,从而不再需要读写 HDFS,因此 Spark 能更好地适用于数据挖掘与机器学习等需要迭代的MapReduce的算法。
ClusterManager:在Standalone模式中,Master为主节点,控制整个集群,监控Worker。在YARN模式中为资源管理器。
Worker节点:从节点,负责控制计算节点,启动Executor或者Driver。
Driver:运行Application的main()函数。
Executor:执行器,是为某个Application运行在WorkerNode上的一个进程。
Spark将数据抽象为RDD(弹性分布式数据集),内部提供了大量的库,包括SparkCore、Spark SQL、Spark Streaming、Spark MLlib、GraphX。开发者可以在同一个应用程序中无缝组合使用这些库。
SparkCore:是Spark中最重要的部分;SparkCore的核心为RDD(弹性分布式数据集)及其API,其他Spark的库都是构建在RDD和SparkCore之上的。
Spark SQL:提供通过Apache Hive的SQL变体HiveSQL(HiveQL)与Spark进行交互的API。每个数据库表被当作一个RDD,Spark SQL查询被转换为Spark操作。
Spark Streaming:对实时数据流进行处理和控制。Spark Streaming允许程序能够像普通RDD一样处理实时数据,通过短时批处理实现伪流处理。
Spark MLlib:一个常用的机器学习算法库,算法被实现为对RDD的Spark操作。这个库包含可扩展的学习算法,比如分类、回归等需要对大量数据集进行迭代的操作。
GraphX:控制图、并行图操作和计算的一组算法和工具的集合。GraphX扩展了RDD API,包含控制图、创建子图、访问路径上所有顶点的操作。
4.Flink(分布式并行处理框架)
Flink是一个基于内存的分布式并行处理框架,类似于Spark,但在部分设计思想上有较大出入。对 Flink 而言,其所要处理的主要场景就是流数据,批数据只是流数据的一个特例。
Spark中,RDD在运行时表现为JavaObject,而Flink主要表现为事件流。所以在Flink中使用的类Dataframeapi是被作为第一优先级来优化的。但在Spark RDD中就没有了这种优化处理了。
Spark中,对于批处理有RDD,对于事件流有DStream,不过内部实际还是RDD抽象;在Flink中,对于批处理有DataSet,对于事件流有DataStreams,是同一个公用的引擎之上两个独立的抽象,并且Spark是“伪流处理”,而Flink是真实的流处理。
5.Yarn/Mesos(分布式资源管理器)
Yarn是下一代MapReduce,即MRv2,是在第一代MapReduce基础上演变而来的,主要是为了解决原始Hadoop扩展性较差,不支持多计算框架而提出的。
Mesos诞生于UC Berkeley(加州大学伯克利分校)的一个研究项目,现已成为Apache项目,当前有一些公司使用Mesos管理集群资源,例如Twitter公司。与Yarn类似,Mesos是一个资源统一管理和调度的平台,同样支持比如MR、Steaming等多种运算框架。
6.Zookeeper(分布式协作服务)
用于解决分布式环境下的数据管理问题,如统一命名、状态同步、集群管理、配置同步等。
Hadoop 的许多组件依赖于 Zookeeper,它运行在计算机集群上面,用于管理 Hadoop操作。
7.Sqoop(数据同步工具)
Sqoop是SQL-to-Hadoop的缩写,利用数据库技术描述数据架构,用于在关系数据库、数据仓库和Hadoop之间转移数据。
8.Hive/Impala(基于Hadoop的数据仓库)
Hive 定义了一种类似 SQL 的查询语言(HQL),将 SQL 转化为 MapReduce 任务在Hadoop上执行。通常用于离线分析。
HQL用于运行存储在Hadoop上的查询语句,Hive让不熟悉MapReduce的开发人员也能编写数据查询语句,然后这些语句被翻译为Hadoop上面的MapReduce任务。
Impala是用于处理存储在Hadoop集群中的大量数据的MPP(大规模并行处理)SQL查询引擎。它是一个用C++和Java编写的开源软件。与Hive不同,Impala不基于MapReduce算法。它实现了一个基于守护进程的分布式架构,它负责在同一台机器上运行的查询执行的所有方面。因此执行效率高于Hive。
9.HBase(分布式列存储数据库)
HBase是一个建立在HDFS之上,面向列的针对结构化数据的可伸缩、高可靠、高性能、分布式和面向列的动态模式数据库。
HBase采用了BigTable的数据模型:增强的稀疏排序映射表(Key/Value),其中,键由行关键字、列关键字和时间戳构成。
HBase提供了对大规模数据的随机、实时读写访问,同时,HBase中保存的数据可以使用MapReduce来处理,它将数据存储和并行计算完美地结合在一起。
10.Flume(日志收集工具)
Flume 是一个可扩展、适合复杂环境的海量日志收集系统。它将数据从产生、传输、处理并最终写入目标的路径的过程抽象为数据流,在具体的数据流中,数据源支持在Flume中定制数据发送方,从而支持收集各种不同协议数据。
同时,Flume 数据流提供对日志数据进行简单处理的能力,如过滤、格式转换等。此外,Flume还具有能够将日志写至各种数据目标(可定制)的能力。
Flume以Agent为最小的独立运行单位,一个Agent就是一个JVM。单个Agent由Source、Sink和Channel三个组件构成,如图1.3.2所示。
图1.3.2 Flume结构
Source:从客户端收集数据,并传递给Channel。
Channel:缓存区,将Source传输的数据暂时存放。
Sink:从Channel收集数据,并写入到指定的外部存储。
11.Kafka(分布式消息队列)
Kafka 是一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者规模的网站中的所有动作流数据。实现了主题、分区及其队列模式以及生产者、消费者架构模式。
生产者组件和消费者组件均可以连接到Kafka集群,而Kafka被认为是组件通信之间所使用的一种消息中间件。Kafka 内部分为很多 Topic(一种高度抽象的数据结构),每个Topic又被分为很多分区(Partition),每个分区中的数据按队列模式进行编号存储。被编号的日志数据称为此日志数据块在队列中的偏移量(Offset),偏移量越大的数据块越新,即越靠近当前时间。
12.Oozie(工作流调度器)
Oozie 是一个可扩展的工作体系,集成于 Hadoop 体系中,用于协调多个 MapReduce作业的执行。它能够管理一个复杂的系统,基于外部事件来执行,外部事件包括数据的定时和数据的出现。
Oozie工作流是放置在控制依赖DAG(Direct Acyclic Graph,有向无环图)中的一组动作(例如,Hadoop的Map/Reduce作业、Pig作业等),其中指定了动作执行的顺序。