大数据(Big Data)概念是1998年由SGI首席科学家John Masey在USENIX大会上提出的。他当时发表了一篇名为Big Data and the Next Wave of Infrastress的论文,使用了大数据来描述数据爆炸的现象。但大数据真正得到业界关注,则是其后多年的事情了。其中大数据最重要的发酵素则是2003-2006年Google发布的GFS、MapReduce和BigTable三篇论文。
大数据是指海量数据或巨量数据,其规模巨大到无法通过目前主流的计算机系统在合理时间内获取、存储、管理、处理并提炼以帮助使用者决策。
大数据的4V特征,即Variety(多样化)、Volume(大量化)、Velocity(快速化)、Value(价值密度低)。如下图所示。其中,Variety表示来源多和格式多,数据可以来源于搜索引擎、社交网络、通话记录、传感器等等,这些数据要么以结构化形式存储,要么以非结构化数据存储;Volume表示数据量比较大,从TB级别,跃升到PB级别。尤其是在移动互联时代,视频、语言等非结构化数据快速增长;Velocity表示数据存在时效性,需要快速处理,并得到结果出来,这一点也是和传统的数据挖掘技术有着本质的区别;Value表示大量不相关信息,不经过处理则价值较低,属于价值密度低的数据。
大数据处理流程
一般的大数据处理流程都有以下几个过程:数据采集、数据存储、数据处理、数据展现。如下图所示。
在大数据时代,由于数据种类多,数据大,从结构化的数据到非结构化的数据,数据采集的形式也变得更加复杂而多样。
当存储技术的发展变得步履蹒跚,赶不上数据发展的速度时,分布式存储成为了必然选择,非结构型数据也对存储格式提出了新的要求。层出不穷的数据源也使得数据量产生了井喷似的迅猛增长。此时分布式存储与NoSQL的诞生回应了这样的需求,解决了大数据存储的根本难题。
数据处理包括数据计算、分析,这部分是大数据技术的核心,本文剩余部分将详细介绍这部分。数据展示指的是通过提供报表等可视化界面反应目前平台或业务运行的各项指标。
大数据的演进
提到大数据技术,最基础和核心的仍是大数据的分析和计算。在2017年,大数据分析和计算技术仍旧在飞速的发展,无论老势力Hadoop还是当红小生Spark,亦或是人工智能,都在继续自己的发展和迭代。
目前绝大部分传统数据计算和数据分析服务均是基于批量数据处理模型:使用ETL系统或OLTP系统进行构造数据存储,在线的数据服务通过构造SQL语言访问上述数据存储并取得分析结果。这套数据处理的方法伴随着关系型数据库在工业界的演进而被广泛采用。但在大数据时代下,伴随着越来越多的人类活动被信息化、进而数据化,越来越多的数据处理要求被实时化、流式化。Andrew NG揭示大数据未来发展的趋势就是人工智能。下面将对批量计算、流式计算以及人工智能进行详细介绍,其中人工智能部分将在下一期中介绍。
批量计算
传统的批量数据处理模型通常基于如下处理模型:
1. 使用ETL系统或者OLTP系统构造原始的数据存储,以提供后续的数据服务进行数据分析和数据计算。如下图所示,用户装载数据,系统根据自己的存储和计算情况,对于装载的数据进行索引构建等一些列查询优化工作。因此,对于批量计算,数据一定需要加载到计算机系统,后续计算系统才在数据加载完成后方能进行计算。
2. 用户或系统主动发起一个计算作用并向上述数据系统进行请求。此时计算系统开始调度(启动)计算节点进行大量数据计算,该过程的计算量可能巨大,耗时长达数分钟乃至数小时。同时,由于数据累计的不可及时性,上述计算过程的数据一定是历史数据,无法保证数据的实时性。
3. 计算结果返回,计算作业完成后将数据以结果集形式返回用户,或者可能由于计算结果数量巨大保存着数据计算系统中,用户进行再次数据集成到其他系统。一旦数据结果巨大,整体的数据集成过程漫长,耗时可能长达数分钟乃至数小时。
典型代表:Hadoop
Hadoop是Apache的一个开源项目,是可以提供开源、可靠、可扩展的分布式计算工具。它主要包括HDFS和MapReduce两个组件,分别用于解决大数据的存储和计算。
HDFS是独立的分布式文件系统,为MapReduce计算框架提供存储服务,具有较高的容错性和高可用性,基于块存储以流数据模式进行访问,数据节点之间项目备份。默认存储块大小为64M,用户也可以自定义大小。
HDFS是基于主从结构的分布式文件系统,结构上包括NameNode目录管理、DataNode的数据存储和Client的访问客户端3部分。NameNode主要负责系统的命名空间、集群的配置管理以及存储块的复制;DataNode是分布式文件系统存储的基本单元;Client为分布式文件系统的应用程序。体系结构如下图所示。
如上图所示,NameNode通过主从模式实现高可用性,但是在以前的版本,Standby只能是一个主机。为了实现更高的可靠性,在Hadoop3.0中可以配置超过一个的Standby的NameNode,从而保证更高的可靠型。对于数据存储,HDFS采用的是多副本的方式来存储数据,即Client将数据首先通过NameNode获取数据将要存储在哪些DataNode上,之后这些存储到最新数据的DataNode将变更数据以同步或异步方式同步到其他DataNode上。但是这几年数据规模的增加远远大于人的想象,而这些产生的数据,必然会存在冷热数据的区分。无论冷热,数据对于一个公司都是核心资产,谁都不想数据丢失。可是对于冷数据,如果采用多副本方式,会浪费大量的存储空间。在Hadoop3.0之后,采用Erasure Coding可以大大的降低数据存储空间的占用。对于冷数据,可以采用EC来保存,这样才能降低存储数据的花销,而需要时,还可以通过CPU计算来读取这些数。
MapReduce是一种分布式计算框架,适用于离线大数据计算。采用函数式编程模式,利用Map和Reduce函数来实现复杂的并行计算,主要功能是对一个任务进行分解,以及对结果进行综合汇总。其中,Map的主要功能是把一个作业任务分解成多个子任务,然后发送到对应的节点服务器中,接着进行并行计算。Reduce的主要功能把并行计算得到的结果进行归并后得到的结果返回到中央服务器。
具体来说,MapReduce是将那些没有经过处理的海量数据进行数据分片,即分解成多个小数据集;每个Map并行地处理每一个数据集中的数据,然后将结果存储为<key,value>,并把key值相同的数据进行归并发送到Reduce处理。原理如下图所示。
流计算
不同于批量计算模型,流式计算更加强调计算数据流和低时延,流式计算数据处理模型如下:
1. 使用实时集成工具,将数据实时变化传输到流式数据存储(即消息队列,如RabbitMQ);此时数据的传输编程实时化,将长时间累积大量的数据平摊到每个时间点不停地小批量实时传输,因此数据集成的时延得以保证。
2. 数据计算环节在流式和批量处理模型差距更大,由于数据集成从累计变成实时,不同于批量计算等待数据集成全部就绪后才启动计算作业,流式计算作业是一种常驻计算服务,一旦启动将一直处于等待事件触发的状态,一旦小批量数据进入流式数据存储,流计算立刻计算并迅速得到结果。
3. 不同于批量计算结果数据需要等待数据计算结果完成后,批量将数据传输到在线系统;流式计算作业在每次小批量数据计算后可以立刻将数据写入在线系统,无需等待整个数据的计算结果,可以立刻将数据结果投递到在线系统,进一步做到实时计算结果的实时化展现。
典型代表:Spark
Spark是一个快速且通用的集群计算平台。它包含Spark Core、Spark SQL、Spark Streaming、MLlib以及Graphx组件。如下图所示。Spark Core
Spark SQL是处理结构化数据的库,它支持通过SQL查询数据。Spark Streming是实时数据流处理组件。MLlib是一个包含通用机器学习的包。GraphX是处理图的库,并进行图的并行计算一样。
Spark提出了弹性分布式数据集的概念(Resilient Distributed Dataset),简称RDD,每个RDD都被分为多个分区,这些分区运行在集群的不同节点上。一般数据操作分为3个步骤:创建RDD、转换已有的RDD以及调用RDD操作进行求值。
在Spark中,计算建模为有向无环图(DAG),其中每个顶点表示弹性分布式数据集(RDD),每个边表示RDD的操作。RDD是划分为各(内存中或者交换到磁盘上)分区的对象集合。在DAG上,从顶点A到顶点B的边缘E意味着RDD B是RDD A上执行操作E的结果。有两种操作:转换和动作。转换(例如;映射、过滤器、连接)对RDD执行操作并产生新的RDD。
下面介绍下Spark与Hadoop的区别:
总结
本文主要介绍了大数据的定义、特征、大数据的一般流程,并且着重介绍了大数据技术演进过程中的前两步(批量计算和流计算)。对于批量计算,介绍了Hadoop的HDFS和MapReduce的重要思想。同时,针对频繁迭代计算场景下,由于Hadoop需要频繁的进行I/O操作降低了系统性能。人们发明了Spark,它在一般情况下将数据存储在内存中,此外,提出了RDD和DAG思想,有效的管理数据。下一期我们将详细介绍大数据技术演进过程中的第3步。