大数据平台是指以海量数据存储、计算及不间断流数据实时计算等场景为主的一套基础设施。这套基础设施既可以采用开源平台,也可以采用华为、星环等商业级解决方案;既可以部署在私有云上,也可以部署在公有云上。典型的大数据平台包括Hadoop系列、Spark、Storm、Flink、Flume以及Kafka等集群。大数据平台具有以下特点:
(1)容纳海量数据。大数据平台利用了计算机集群的存储和计算能力 [8] ,不仅在性能上有所提高,对传入的大量数据流,其处理能力也有相应的提高。
(2)速度快。大数据平台结合了列式数据库架构(相对于基于行的非并行处理传统数据库)和大规模并行处理技术,不仅能够大幅提高性能(通常约100~1000倍),还可以实现更低且更透明的定价机制。
(3)兼容传统工具。大数据平台已经过认证,可以兼容传统工具。
(4)提供数据分析功能。大数据平台不仅支持在数秒内准备并加载数据,还支持利用高级算法建立预测模型,轻松部署模型以进行数据库内的计算分析。不仅如此,数据科学家还能够选择使用现有统计软件包和首选语言。
下面分别介绍Hadoop、Spark、Storm、Flink、Flume和Kafka集群。
Hadoop是一个由Apache基金会开发的分布式系统基础架构,它是一个能够对大量数据进行分布式处理的软件框架,以一种可靠、高效、可伸缩的方式进行数据处理 [9] 。用户可以在不了解分布式系统底层细节的情况下开发分布式程序,还能充分利用集群的优势进行高速运算和存储。
Hadoop实现了一个分布式文件系统HDFS(Hadoop Distributed File System)。HDFS有高容错性的特点,被设计用来部署在低廉的硬件上,它能够高吞吐量地访问应用程序的数据,适合具有超大数据集的应用程序。HDFS放宽了POSIX的要求,能够以流的形式访问文件系统中的数据。
Hadoop框架最核心的设计是HDFS和MapReduce。HDFS为海量数据提供存储,而MapReduce为海量数据提供计算。HDFS存储Hadoop集群中所有存储节点上的文件。HDFS的上一层是MapReduce引擎,该引擎由JobTrackers和TaskTrackers组成。Hadoop分布式计算平台核心技术包括HDFS、MapReduce处理过程,以及数据仓库工具Hive和分布式数据库HBase。
Hadoop支持任意超大文件存储,其硬件节点可不断扩展,存储成本低,系统设计具有高容错性。对于上层应用,Hadoop隐藏分布式部署结构,提供统一的文件系统访问接口,应用程序无须知道文件的具体存放位置,使用非常简单。在Hadoop中,文件是分块存储的(每块的大小默认为64MB),不同的块可分布在不同的机器节点上,通过元数据记录文件块位置,应用程序顺序读取各个块。
对应上述Hadoop的优势,它也有一些不足。首先,它适合大数据文件保存和分析,不适合小文件,因为分布存储需要从不同的节点读取数据,效率反而没有集中存储高;一次写入多次读取,也不支持文件修改。其次,由于没有索引支持,因此Hadoop不支持信息实时检索。再次,Hadoop是最基础的大数据技术,也是海量数据库技术的底层依托,但其基于文件系统层面提供的文件访问能力不如数据库技术强大。另外,文件系统接口完全不同于传统文件系统,应用程序需要重新开发。
Hadoop在大数据处理中应用广泛得益于其自身在数据提取、变形和加载(ETL)方面的天然优势。Hadoop的分布式架构将大数据处理引擎尽可能地靠近存储,相对适用于像ETL这样的批处理操作,因为类似这样操作的批处理结果可以直接进行存储。如图2.9所示,Hadoop的MapReduce功能实现了将单个任务打碎,并将碎片任务发送到多个节点上,之后再以单个数据集的形式加载到数据仓库里。
图2.9 MapReduce的数据共享机制
Hadoop极大地简化了大数据分析,但是,随着大数据需求和使用模式的扩大,用户的需求也越来越多,比如更复杂的多重处理需求(迭代计算),以及低延迟的交互式查询需求(Ad-Hoc Query)等。MapReduce计算模型的架构导致上述两类应用先天缓慢,用户迫切需要一种更快的计算模型来弥补MapReduce的先天不足。
Apache Spark是专为大规模数据处理而设计的快速通用的计算引擎。它是加州大学伯克利分校的AMP实验室所开源的类Hadoop MapReduce的通用并行框架,拥有Hadoop MapReduce所具有的优点,但不同于MapReduce。任务的中间输出结果可以保存在内存中,从而不再需要读写HDFS,因此Spark能够更好地适用于需要迭代MapReduce算法的数据挖掘和机器学习等领域 [10] 。
Spark是一种与Hadoop相似的开源集群计算环境,两者之间存在着一些不同之处,这些有用的不同之处使Spark在某些工作负载方面表现得更加优异,换句话说,Spark启用了内存分布数据集,除了能够提供交互式查询外,还可以优化迭代工作负载。
尽管创建Spark是为了支持分布式数据集上的迭代作业,但实际上它是对Hadoop的补充,可以在Hadoop文件系统中并行运行。名为Mesos的第三方集群框架可以支持此行为。Spark是一个通用引擎,可用它来完成各种各样的运算,包括SQL查询、文本处理、机器学习等,而在Spark出现之前,一般需要使用各种各样的引擎来分别处理这些需求。Spark的速度很快且支持交互式计算和复杂算法,使Spark应用开发者可以专注于应用需要的计算本身。
如图2.10所示,Spark数据共享机制的基本原理是将数据分成小的时间片段(几秒),以类似批量处理的方式来处理这小部分数据。小批量处理的方式使得它可以同时兼容批量和实时数据处理的逻辑与算法,其速度快于网络和磁盘,方便了一些需要历史数据和实时数据联合分析的特定应用场合。
图2.10 Spark数据共享机制
Storm是一个分布式的、容错的实时计算系统,它由BackType开发,被托管在GitHub上,遵循Eclipse Public License 1.0。
Storm为分布式实时计算提供了一组通用原语,可用于“流处理”中,实时处理消息并更新数据库。这是管理队列及工作者集群的另一种方式。Storm也可用于“连续计算”中,对数据流做连续查询,在计算时就将结果以流的形式输出给用户。它还可用于“分布式RPC”,以并行的方式运行复杂的运算。Storm具有如下特点。
(1)简单的编程模型。类似于MapReduce降低了并行批处理复杂度,Storm降低了进行实时处理的复杂度。
(2)可以使用多种编程语言。Storm默认支持Clojure、Java、Ruby和Python。要增加对其他语言的支持,只需实现一个简单的Storm通信协议即可。
(3)容错性。Storm会管理工作进程和节点的故障。
(4)水平扩展。计算是在多个线程、进程和服务器之间并行进行的。
(5)可靠的消息处理。Storm保证每个消息至少能得到一次完整处理。任务失败时,它会负责从消息源重试消息处理。
(6)快速。系统的设计保证了消息能得到快速的处理,使用ØMQ作为其底层消息队列。
(7)本地模式。Storm有一个“本地模式”,可以在处理过程中完全模拟Storm集群,这让使用者可以快速进行开发和单元测试。
作为基于数据流的实时处理系统,Storm提供了大吞吐量的实时计算能力。在一条数据到达系统的时候,系统会立即在内存中进行相应的计算,因此Storm适合实时性要求较高的数据分析场景。此外,Storm支持分布式并行计算,即使海量数据大量涌入,也能得到实时处理。Storm还具备以下几个优点:低延迟、高可用、分布式、可扩展、数据不丢失,并且提供简单易用的接口,便于开发。相比其他实时处理框架(如Spark),Storm的实时性较高,延时低,作为纯实时的计算框架,Storm的实时计算达到毫秒级。
Apache Flink(简称Flink)是由Apache软件基金会开发的开源流处理框架,其核心是用Java和Scala编写的分布式流数据流引擎。Flink以数据并行和流水线方式执行任意流数据程序,Flink的流水线运行时系统可以执行批处理和流处理程序。此外,Flink的运行时本身也支持迭代算法的执行。
Flink的数据流编程模型在有限和无限数据集上提供单次事件(event-at-a-time)处理。在基础层面,Flink程序由流和转换组成。Flink的API包括有界或无界数据流的数据流API、用于有界数据集的数据集API和表API。其编程语言有Java和Scala。
Flume是Cloudera提供的一个高可用、高可靠、分布式的海量日志采集、聚合和传输系统。Flume支持在日志系统中定制各类数据发送方,用于收集数据。同时,Flume提供对数据进行简单处理并写到各种数据接收方(可定制)的能力。Flume可以将应用产生的数据存储到任何集中存储器中,比如HDFS和HBase。当收集数据的速度超过写入数据的时候,也就是当收集信息遇到峰值时,Flume会在数据生产者和数据收容器间做出调整,保证其能够在两者之间提供平稳的数据。Flume可靠、容错性高、可升级、易管理、可定制,并且能够提供上下文路由特征,其管道是基于事务的,保证了数据在传送和接收时的一致性。
除了具备对数据进行简单处理和可定制的功能,Flume还提供了从console(控制台)、RPC(Thrift-RPC)、text(文件)、tail(UNIX tail)、syslog(syslog日志系统)、exec(命令执行)等数据源上收集数据的功能。
Kafka是由Apache软件基金会开发的一个开源流处理平台,用Scala和Java编写。Kafka是一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者规模的网站中的所有动作流数据。这些数据通常由于吞吐量的要求而通过处理日志和日志聚合来解决。对于像Hadoop这样的日志数据和离线分析系统,当要求实时处理时,这是一个可行的解决方案。Kafka的目的是通过Hadoop的并行加载机制来统一线上和离线的消息处理,通过集群来提供实时的消息。
Kafka以时间复杂度 O (1)的方式提供消息持久化能力,即使对TB数量级的消息存储,也能够保持长时间的稳定性能 [11] 。Kafka吞吐量高,即使是非常普通的硬件,也可以支持每秒数百万兆的消息。在支持通过Kafka服务器和消费机集群来分区消息的同时,Kafka也支持Hadoop并行数据加载。
作为一个可扩展、高可靠的消息系统,在流处理中,Kafka经常用来保存收集的流数据,并提供给之后对接的流数据框架进行处理。与大多数消息系统相比,Kafka具有更好的吞吐量、内置分区、副本和故障转移等功能,这有利于及时处理大规模的消息。