2.5 大数据分析技术
大数据分析的应用领域有很多,其中最重要的应用领域之一就是预测性分析,预测性分析结合了多种高级分析功能,包括特别统计分析、预测建模、数据挖掘、文本分析、实体分析、优化、实时评分、机器学习等。
数据挖掘是从大量、不完全、有噪声、模糊、随机的数据中提取隐含在其中的、人们事先不知道的、但又是潜在有用的信息和知识的过程。根据信息存储格式,挖掘的对象有关系型数据库、面向对象数据库、数据仓库、文本数据源、多媒体数据库、空间数据库、时态数据库、异质数据库及Internet等。目前常用的数据挖掘方法有神经网络方法、遗传算法、决策树、模糊集、粗糙集及统计分析等。
要想从急剧增长的数据资源中挖掘出有价值的信息,需要先进的分析技术做支撑。从宏观上看,大数据分析技术发展所面临的问题主要有以下3个:第一,数据量庞大,并且以惊人的速度在增长;第二,数据种类与结构多样,以半结构化数据和非结构化数据为主;第三,需要进行实时快速处理。传统的数据分析技术无法解决这3个问题,大数据时代需要更加先进的平台来满足日益增长的数据处理需求。而目前分析处理大数据应用最广泛的核心技术为Hadoop。前面讲到的HDFS为Hadoop核心组件之一,负责大数据的存储。Hadoop 的另一个核心组件为 MapReduce,它是一个分布式计算框架。
传统的分布式计算框架MPI(Message Passing Interface,信息传递接口)虽然编程接口灵活且功能强大,但由于编程接口复杂,并且对容错性支持不高,无法支撑在大规模数据上的复杂操作,研究人员转而开发了一系列接口简单、容错性强的分布式计算框架服务于大数据分析算法,以MapReduce和Spark等为代表。
分布式计算框架MapReduce将对数据的处理归结为Map和Reduce两大类操作,从而简化了编程接口,提高了系统的容错性。但是,MapReduce 受制于过于简化的数据操作抽象,而且不支持循环迭代,因而对复杂的机器学习算法支持较差。基于MapReduce的分布式机器学习库Mahout,需要将迭代运算分解为多个连续的Map和Reduce操作,通过读写HDFS文件的方式,将上一轮循环的运算结果传入下一轮,完成数据交换。在此过程中,大量的训练时间被用于磁盘的读写操作,训练效率非常低。为了解决上述问题,Spark基于RDD定义了包括Map 和Reduce在内的、更加丰富的数据操作接口。不同于MapReduce的是Job中间输出和结果可以保存在内存中,从而不再需要读写HDFS,这些特性使得Spark适用于数据挖掘与机器学习等需要迭代的大数据分析算法。基于Spark实现的机器学习算法库MLlib,已经显示出了其相对于Mahout的优势,在实际应用系统中得到了广泛的使用。
图 2-18 是典型的大数据技术栈。底层是基础设施,包括计算资源、存储资源和互联资源,具体为管理节点、计算节点、集群、机柜、交换机和数据中心(图2-18中未画出)。往上为数据存储层与数据管理层,包括文件系统、类似于YARN的资源管理系统及各类数据库。然后是业务计算层,如Hadoop、MapReduce和Spark,以及在此之上的各种不同计算范式,如批处理、流处理、图计算等,包括衍生出来的各种计算模型,如BSP (Bulk Synchronous Parallel)、分布式图计算GAS(Gather Apply Scatter)等。数据挖掘及可视化是基于业务计算层的,包括简单的查询分析、流分析及复杂分析(如机器学习、图计算等),查询分析多基于表结构和关系函数,流分析基于数据、事件流及简单的统计分析,而复杂分析则基于更复杂的数据结构与方法(矩阵、迭代计算和线性代数)。一般静态可视化是对分析结果的展示,还有一种可视化是交互式可视化,可以探索性地提出问题,进行可视化分析,并获得新的线索,从而形成迭代的分析和可视化。目前,实时交互式可视化分析是一个值得探索的研究热点。
大数据处理的关键在于并行处理。其实,大数据的基本处理流程与传统的数据处理流程并无太大的差异,只是前者数据量巨大,同时对处理速度要求很高,已经超出传统的机器处理能力。此外,大数据类型多样化,除了传统的结构化数据,还有很多非结构化数据。对于海量数据、非结构化数据,有很多通用的处理方法,主要为分布式并行处理方法。
图2-18 大数据技术栈
目前,Hadoop、MapReduce和Spark等分布式处理方式已经成为大数据处理各环节的通用处理方法。Hadoop 是一个能够让用户轻松架构和使用的分布式计算平台。用户可以轻松地在Hadoop上开发和运行处理海量数据的应用程序。Hadoop是一个数据管理系统,作为数据分析的核心,汇集了结构化和非结构化数据,这些数据分布在传统的企业数据栈的每一层。Hadoop 也是一个大规模并行处理框架,拥有超级计算能力,定位于推动企业级应用的执行。Hadoop 又是一个开源社区,主要为解决大数据问题提供工具和软件。虽然Hadoop提供了很多功能,但仍然应该把它归类为由多个组件组成的生态圈,这些组件包括数据存储、数据集成、数据处理和其他进行数据分析的专门工具。同时,Hadoop还是一个大数据生态系统的核心,围绕Hadoop体系产生了很多大数据架构,包括传统大数据架构、流式架构、Lambda架构、Kappa架构、Unifield架构等。
传统大数据架构—数据分析的业务没有发生任何变化,但是因为数据量、性能等问题导致系统无法正常使用,需要进行升级改造,此类架构便是为了解决这个问题的。
流式架构—在传统大数据架构的基础上,全程以流的形式处理数据,在数据接入端将ETL替换为数据通道。经过流处理加工后的数据,以消息的形式被直接推送给消费者。存储部分在外围系统以窗口的形式进行存储。此架构适用于预警、监控、对数据有有效期要求的情况。
Lambda 架构—Lambda 架构在大数据系统中占有举足轻重的地位,数据通道分为两条:实时流和离线。实时流采用流式架构,保障了其实时性;而离线则以批处理方式为主,保障了最终一致性。此架构适用于同时存在实时和离线需求的情况。
Kappa 架构—Kappa 架构在 Lambda 架构的基础上进行了优化,将实时和流部分进行了合并,将数据通道以消息队列进行替代。因此,对于Kappa架构来说,依旧以流处理为主,但是数据在数据湖层面进行存储,当需要进行离线分析或再次计算时,则将数据湖中的数据经过消息队列重播一次。
Unifield架构—Unifield架构将机器学习和数据处理融为一体,在流处理层新增了机器学习层。数据在经过数据通道进入数据湖后,新增了模型训练部分,并且将其在流式层进行使用。同时,流式层不仅使用模型,也包含对模型的持续训练。此架构适用于有大量数据需要分析,同时对机器学习方面又有非常大的需求或有规划的情况。
这些架构都是由基于 Hadoop 的一些开源组件构成的,如 HDFS、MapReduce、ZooKeeper、Pig、HBase等,还有与其他系统融合的数据采集工具Sqoop、Flume等。目前,Hadoop生态系统还在不断扩大,基于内存计算的Spark、Spark Streaming、Spark SQL等计算框架已成为后起之秀。低成本、高可靠、高扩展、高有效、高容错等特性,使Hadoop成为当前最流行的大数据分析系统。
2.5.1 MapReduce
MapReduce是一种分布式计算模型,是Hadoop的主要组件之一,用于大规模数据集(大于1TB)的并行运算。它的主要思想是从函数式编程语言借鉴而来的。
在MapReduce中,主要有两个阶段:Map和Reduce。map()函数以key/value对作为输入,产生另外一系列key/value 对作为中间输出写入本地磁盘。MapReduce框架会自动将这些中间数据按照key值进行聚集,且key值相同(用户可设定聚集策略,默认情况下是对key值进行哈希取模)的数据会被统一交给reduce()函数处理。reduce()函数以key及对应的value列表作为输入,经合并key相同的value值后,产生另外一系列key/value 对作为最终输出写入 HDFS。指定的三个组件分别是 InputFormat、Partitioner和OutputFormat,它们均需要用户根据自己的应用需求配置。
MapReduce 的这种策略被称为“分而治之”策略,它的基本原则是将一个分布式文件系统中的大规模数据集分成许多独立的分片。这些分片可以被多个Map任务并行处理。MapReduce 的设计理念就是“计算向数据靠拢”,而不是“数据向计算靠拢”,原因是移动数据需要大量的网络传输开销。MapReduce 框架采用了 Master/Slave 架构,包括一个Master和若干个Slave,Master上运行JobTracker,Slave上运行TaskTracker。Hadoop框架是用Java语言编写的,但是,MapReduce应用程序不一定要用Java语言编写。Java、Python、C++都可以实现MapReduce程序的编写。
2.5.2 Spark
Spark最初由美国加州伯克利大学的AMP实验室于2009年开发,是基于内存计算的大数据并行计算框架,可用于构建大型、低延迟的数据分析应用程序。
Spark使用先进的DAG(Directed Acyclic Graph,有向无环图)执行引擎,以支持循环数据流与内存计算,基于内存的执行速度可比Hadoop MapReduce快上百倍,基于磁盘的执行速度也能快十倍。
Spark支持使用Scala、Java、Python和R语言进行编程,简洁的API设计有助于用户轻松构建并行程序,并且可以通过Spark Shell进行交互式编程。Spark提供了完整而强大的技术栈,包括SQL查询、流式计算、机器学习和图算法组件,这些组件可以无缝整合在同一个应用中,足以应对复杂的计算。
Spark可运行于独立的集群模式中,或者运行于Hadoop中,也可运行于Amazon EC2等云环境中,并且可以访问HDFS、Cassandra、HBase、Hive等多种数据源。
Hadoop 虽然已成为大数据技术的事实标准,但其本身还存在诸多缺陷,最主要的缺陷是其MapReduce计算模型延迟过高,无法满足实时、快速计算的需求,因而只适用于离线批处理的应用场景。MapReduce表达能力有限,计算都必须转化成Map和Reduce两个操作,但这并不适合所有的情况,而且难以描述复杂的数据处理过程。每次执行都需要从磁盘读取数据,并且在计算完成后需要将中间结果写入磁盘,IO开销较大。一次计算可能需要分解成一系列按顺序执行的MapReduce任务,任务之间的衔接涉及IO开销,会产生较高延迟。而且,在一个任务执行完成之前,其他任务无法开始,因此难以胜任复杂、多阶段的计算任务。
虽然Spark的计算模式也属于MapReduce,但它不局限于Map和Reduce操作,还提供了多种数据集操作类型,编程模型比MapReduce更灵活;Spark提供了内存计算,将中间结果直接放到内存中,带来了更高的迭代运算效率;Spark 基于 DAG 的任务调度执行机制,要优于MapReduce的迭代执行机制。Spark最大的特点就是将计算数据、中间结果都存储在内存中,大大减少了IO开销。Spark提供了多种高层次、简洁的API,通常情况下,对于实现相同功能的应用程序,Spark的代码量仅为Hadoop的20%~50%。但Spark并不能完全替代Hadoop,主要用于替代Hadoop中的MapReduce计算模型。实际上,Spark已经很好地融入了Hadoop生态圈,并成为其中的重要一员,它可以借助YARN实现资源调度管理,借助HDFS实现分布式存储。
目前,Spark 也逐渐形成了自己的生态系统。Spark 的生态系统主要包含 Spark Core、Spark SQL、Spark Streaming、MLlib和GraphX等组件。Spark Core包含Spark 的基本功能,如内存计算、任务调度、部署模式、故障恢复、存储管理等。Spark建立在统一的抽象 RDD 之上,使其可以以基本一致的方式应对不同的大数据处理场景,通常所说的Apache Spark,就是指Spark Core。Spark SQL允许开发人员直接处理RDD,同时可查询Hive、HBase等外部数据源。Spark SQL的一个重要特点是能够统一处理关系表和RDD,使得开发人员可以轻松地使用SQL命令进行查询,并进行更复杂的数据分析。Spark Streaming支持高吞吐量、可容错处理的实时流数据处理,其核心思想是将流式计算分解成一系列短小的批处理作业。Spark Streaming支持多种数据输入源,如Kafka、Flume和TCP套接字等。MLlib提供了常用机器学习算法的实现,包括聚类、分类、回归、协同过滤等,降低了机器学习的门槛,开发人员只要具备一定的理论知识就能进行机器学习的工作。GraphX 是 Spark 中用于图计算的 API,可将其看成 Pregel在Spark上的重写及优化。GraphX性能良好,拥有丰富的功能和运算符,能在海量数据上自如地运行复杂的图算法。