实战大数据(Hadoop+Spark+Flink):从平台构建到交互式数据分析(离线/实时)
上QQ阅读APP看书,第一时间看更新

1.2 大数据平台架构

结合大数据在企业的实际应用场景,可以构建出如图1-1所示的大数据平台架构。最上层为应用提供数据服务与可视化,解决企业实际问题。第2层是大数据处理核心,包含数据离线处理和实时处理、数据交互式分析以及机器学习与数据挖掘。第3层是资源管理,为了支撑数据的处理,需要统一的资源管理与调度。第4层是数据存储,存储是大数据的根基,大数据处理框架都构建在存储的基础之上。第5层是数据获取,无论是数据存储还是数据处理,前提都是快速、高效地获取数据。除了数据服务与可视化外(与业务联系紧密,每个公司不同),本章会通过具体小节分别讲解大数据平台架构的各个层级。

图1-1 大数据平台架构

1.2.1 数据获取

在大数据时代,数据是第一生产力,因为大数据技术的核心就是从数据中挖掘价值,那么最重要的是要有所需要的数据,而第一步需要做的就是弄清楚有什么样的数据、如何获取数据。在企业运行的过程中,特别是互联网企业,会产生各种各样的数据,如果企业不能正确获取数据或没有获取数据的能力,就无法挖掘出数据中的价值,浪费了宝贵的数据资源。

数据从总体上可以分为结构化数据和非结构化数据。结构化数据也称作行数据,是由二维表结构来逻辑表达和实现的数据,严格地遵循数据格式与长度规范,主要通过关系型数据库进行存储和管理。非结构化数据是指数据结构不规则或不完整,没有预定义的数据模型,不方便用数据库的二维逻辑表来表现的数据,包括所有格式的办公文档、文本、图片、XML、HTML、各类报表、图像和音频/视频信息等。

数据的来源不同、格式不同,获取数据所使用的技术也不同。Web网站的很多数据来自用户的点击,可以使用低侵入的浏览器探针(一种Web脚本程序,实质上是通过网页编程语言(ASP、PHP、ASP.NET等)实现探测服务器敏感信息的脚本文件)技术采集用户浏览数据、使用爬虫技术获取网页数据、使用组件Canal采集MySQL数据库的binlog日志,以及使用组件Flume采集Web服务器的日志数据。数据获取之后,为了方便不同应用消费数据,可以将数据存入Kafka消息中间件。

1.2.2 数据存储

存储是所有大数据技术组件的基础,存储的发展远远低于CPU和内存的发展,虽然硬盘存储容量多年来在不断地提升,但是硬盘的访问速度却没有与时俱进。所以对于大数据开发人员来说,对大数据平台的调优很多情况下主要集中在对磁盘I/O的调优。

实验数据得出:1TB的硬盘,在数据传输速度约为100MB/s的情况下,读完整个磁盘中的数据至少要花2.5h。试想,如果将1TB数据分散存储在100个硬盘,并行读取数据,那么不到2min就可以读完所有数据。通过共享硬盘对数据并行读取,可以大大缩短数据读取的时间。

虽然如此,但要对多个硬盘中的数据并行进行读写,首要解决的是硬件故障问题。一旦开始使用多个硬件,其中个别硬件就很有可能发生故障。为了避免数据丢失,最常见的做法是复制(replication):系统保存数据的副本(replica),一旦有系统发生故障,就可以使用另外保存的副本。一种方式是使用冗余硬盘阵列(RAID),另外一种方式是本书稍后会讲到的Hadoop分布式文件系统(Hadoop Distributed File System, HDFS)。另外还有构建在HDFS之上的分布式列式数据库HBase,其可以提供实时的多维分析。

1.2.3 数据处理

有了数据采集和数据存储系统,可以对数据进行处理。对于大数据处理按照执行时间的跨度可以分为:离线处理和实时处理。

离线处理即批处理,用于处理复杂的批量数据,通常数据处理的时间跨度在几分钟到数小时之间。数据的批处理发展的最早,应用也最为广泛,最主要的应用场景是对数据做ETL(Extract-Transform-Load),如广电领域的收视率计算。用户收看节目的数据经过机顶盒采集上来之后,按照一定的规则将数据转换成以分钟为单位的原始数据,然后根据业务需求,按每小时、每天、每周、每月等粒度计算收视率。早期离线计算主要使用MapReduce离线计算框架,但MapReduce模型单一、计算速度慢、编程复杂。后来出现了Spark内存计算框架以及Flink实时计算框架,简化了编码,同时提升了执行效率,逐步取代了MapReduce。当然Spark和Flink既支持离线处理也支持实时处理,Spark Core和Flink DataSet支持离线处理,Spark Streaming和Flink DataStream支持实时处理。

实时处理即流处理,用于处理实时数据流,通常数据处理的时间跨度在数百毫秒到数秒之间。流处理是一种重要的大数据处理手段,主要特点是其处理的数据是源源不断且实时到来的。分布式流处理是一种面向动态数据的细粒度处理模式,基于分布式内存,对不断产生的动态数据进行处理。其对数据的处理具有快速、高效、低延迟等特性,在当前企业和用户对实时性要求越来越高的情况下,流处理应用越来越广泛。前面提到的Spark Streaming和Flink DataStream是当前比较流行的流处理模型,后续章节会详细讲解。

1.2.4 交互式分析

在实际应用中,经常需要对离线或实时处理后的历史数据,根据不同的条件进行多维分析查询并及时返回结果,这时就需要交互式分析。交互式分析是基于历史数据的交互式查询,通常的时间跨度在数十秒到数分钟之间。在大数据领域,交互式查询通常用于实时报表分析、实时大屏、在线话单查询等。

因为是查询应用,所以交互式查询通常具有以下特点。

低延时。

查询条件复杂。

查询范围大。

返回结果数据量小。

并发数要求高。

需要支持SQL等接口。

传统的方式常常使用数据库做交互式查询,比如MySQL、Oracle。随着数据量的增大,传统数据库无法支撑海量数据的处理,交互式查询采用分布式技术成为最佳的选择。大数据领域中的交互式查询,主要是基于SQL on Hadoop。SQL on Hadoop是一个泛化的概念,是指Hadoop生态圈中一系列支撑SQL接口的组件和技术。本书后续会讲解几个常见的SQL on Hadoop技术,比如Hive SQL、Spark SQL。

1.2.5 机器学习与数据挖掘

在利用大数据技术对海量数据进行分析的过程中,常规的数据分析可以使用离线分析、实时分析和交互式分析,复杂的数据分析需要利用数据挖掘和机器学习的方法。

机器学习是一门多领域交叉学科,涉及高等数学、概率论、线性代数等多门学科,专门研究计算机怎样模拟或实现人类的学习行为,以获取新的知识或技能,重新组织已有的知识结构,使之不断改善自身的性能。

数据挖掘是从海量数据中通过算法搜索隐藏于其中的信息的过程。数据挖掘中用到了大量机器学习中的数据分析技术和数据管理技术。机器学习是数据挖掘中的一种重要工具,数据挖掘不仅要研究、扩展、应用一些机器学习的方法,还要通过许多非机器学习技术解决数据存储、数据噪声等实际问题。机器学习不仅可以用在数据挖掘上,还可以应用在增强学习与自动控制等领域。总体来讲,从海量数据获取有价值信息的过程中,数据挖掘是强调结果,机器学习是强调使用方法,两个领域有相当大的交集,但不能画等号。

在大数据开发的过程中,利用机器学习对海量数据进行数据分析挖掘,大数据开发人员通常会使用机器学习库即可,不需要自己开发算法。目前,使用较多、比较成熟的机器学习库是Spark框架中的Spark ML,大数据开发人员可以直接利用Spark ML进行数据挖掘。当然也可以使用Flink框架中的Flink ML,不过Flink ML还在发展过程中,有待成熟和完善。

1.2.6 资源管理

资源管理的本质是集群、数据中心级别资源的统一管理和分配。其中多租户、弹性伸缩、动态分配是资源管理系统要解决的核心问题。

为了应对数据处理的各种应用场景,出现了很多大数据处理框架(如MapReduce、Hive、Spark、Flink、JStorm等),相应地,也存在着多种应用程序与服务(如离线作业、实时作业等)。为了避免服务和服务之间、任务和任务之间的相互干扰,传统的做法是为每种类型的作业或服务搭建一个单独的集群。在这种情况下,由于每种类型作业使用的资源量不同,有些集群的利用率不高,而有些集群则满负荷运行、资源紧张。

为了提高集群资源利用率、解决资源共享问题,YARN在这种应用场景下应运而生。YARN是一个通用的资源管理系统,对整个集群的资源进行统筹管理,其目标是将短作业和长服务混合部署到一个集群中,并为它们提供统一的资源管理和调度功能。在实际企业应用中,一般都会将各种大数据处理框架部署到YARN集群上(如MapReduce on YARN、Spark on YARN、Flink on YARN等),方便资源的统一调度与管理。