批处理流处理模型有哪些分析算法有几类7千

作者:蒋博士

清华大学计算机博士

百度大数据专家顾问、云计算专家

文章摘自联想超级课

大数据分析与可视化

目录:

一.大数据分析技术–批处理

二.大数据分析技术–流处理

三.大数据分析算法

四.大数据可视化

一、大数据分析技术–批处理

进行大数据分析通常有两种方式:

1、Scale-up

是指增加单个设备的处理能力。以前对大数据进行处理的时候,设备可能只有12个CPU处理和32G的物理内存。如果采用Scale-up的方法,就可以增加处理服务器的单机能力,比如把处理器增加到24核或48核,把服务器的内存增加到96G或者是G。

以前在单台服务器上可能用的是机械硬盘,如果使用Scale-up的话,可以把机械硬盘换成固态硬盘,数据读写速度将极大提高。

2、Scale-out

是指不再使用单一的设备对数据进行分析,而是使用多台设备并行来对数据进行分析。如图所示,我们对数据进行分析的时候,会增加很多台服务器来对数据进行处理。

Scale-out的好处是,无论数据有多少,都可以通过增加设备来完成对数据的处理。这也是大数据分析技术当中一种基本的方法。后面讲到的批处理、流处理,都是采用了Scale-out的方法。

MapReduce批处理模型

在大数据批处理技术当中有一个核心的处理模型:MapReduce。它的产生就是为了处理大规模数据集。

MapReduce是在年由Google公司提出来。当初的需求也是为了去处理搜索引擎的索引,或者是进行日志分析。如果在对大数据进行处理的过程中采用Scale-up方法,当数据量达到一定程度以后,成本就太高。所以MapReduce采用的思路,就是前面所说的Scale-out的思路。

MapReduce的定义是指一种可以用于大规模集群进行数据处理的编程模型。我们可以采用多种语言编写MapReduce程序,如Java、Python等。这种多语言的支撑就可以使得MapReduce被广泛应用。

它的特点是,处理模型分成Map和Reduce两个阶段,并且遵从数据在哪计算在哪的原则。

上图呈现的就是一个MapReduce处理模型的基本框架。这些节点在实际应用当中就是一个处理服务器,我们要进行处理的数据也保存在这些节点上。这一个个磁盘一样的节点就是实际数据,也存放在上面。

MapReduce分成map和Reduce阶段。

首先,处理模型进行处理的时候会在每个节点上起map程序。这些Map程序从节点上读取相应数据,也就是“数据在哪计算在哪”的特点。

在map阶段,这些程序把输入的数据中我们关心的数据提取出来后,就会把这些数据进行预处理。比如把一些不需要的字段给过滤掉,或者是对一些数据格式进行转换。转换完成后,这些map程序就会把预处理后的数据汇总到Reduce端。

如图,下面这部分有很多的reduce,接收从map端传输过来的经过预处理的数据,这个传输过程我们称之为shuffle。在每一个reduce上面都有一个shuffle的方框,表明map处理后的数据是通过shuffle这么一个过程传输到reduce端的。

那么,reduce端就会拿到map传输过来的数据,并且reduce端是可以收到每一个map所处理的相应的数据。reduce拿到map处理的数据之后,因为它接收的是所有map的输出,所以对于reduce而言它这就能看到全局数据。

那么在reduce阶段所要做的事情,就是对这些全局的数据进行处理。比如计算一些平均值、计算最大值最小值等等。那么reduce阶段最后的输出结果又会写到我们的存储系统上面去。

总结一下,在整个mapreduce阶段中,首先我们有多个map程序在并行的运行对数据进行预处理(或者叫做提取),之后通过shuffle这么一个过程把数据从map端传递到reduce,最后reduce端对数据进行最终的全局处理之后,把数据输出到存储系统当中去,来完成整个mapreduce的批处理过程。

举个例子。现在有一些气象的数据文件要进行处理,左边这个截图呈现的是气象文件中的一些数据,每一行代表的是某一年某一天某一个时刻的气象数据。

比如,表示的就是年1月6号晚上8点钟的一个气象值。在这一行后面的某些地方保存的实际上是当前十个点的气温值、湿度值、风向值等。

现在有大量的这种气象数据,保存的是不同年份里面的各个时刻的气温值。现在要做的一个事,是希望能够把每一年里面的最高气温值给计算出来。

如果使用mapreduce批处理模型进行处理的话,将分成这么几个阶段:

①首先是map阶段

map阶段要做的事情就是提取数据。如刚才介绍,对数据做一些提取或者是预处理。

每一个map程序会从这些数据文件当中,从每一行提一个年份和气温值出来。

所以map阶段的输出就是0、22、35、、这样的这种年份和气温值的形式的数据。

②其次是shuffle阶段

map数据要经过shuffle汇聚到reduce那一端。所以,在shuffle的过程当中会做“分组归并”。也就是会把相同年份的气温值放在一起。

比如我们可以看到年的气温值被聚在一起:。这一年的气温值也被聚在一起,比如说18、26。“分组归并”在shuffle完成之后也相应地完成,并且这个值实际上就是reduce的输入。

③reduce阶段

那么reduce这一端拿到了分组归并之后的值,就可以针对每一年的这一堆气温值进行计算。比如计算每年的最高气温值,reduce阶段就会从年所对应的这一堆气温值当中找出最大值,从年对应的这个位置当中找出最大值,所以最后的结果就是35、这样的值。

总结一下,在整个过程中,map阶段可以充分的并行执行,分组归并会把数据进行汇总,最后reduce针对汇总后的数据来进行处理。这样就可以完成使用mapreduce对数据进行处理。

上面这幅图也是mapreduce批处理模型执行的一个逻辑框图。

图片顶端有一堆输入的数据,我们可以起很多的map程序对这些数据进行处理。每一个map相对应的都会提取出来一些KV对,比如像刚才例子中的年22℃、年16℃这样的值,就是KV的结果。分组规定按照相应的key进行分组,在刚才的例子当中,我们就是按照年份进行分组。最后这些分组后的数据送给reduce进行处理,比如说从这个Key当中的一堆值里面找出最大值。这个时候,就完成了整个reduce的处理。

所以大家也可以看到,从这幅图上来说,map和reduce都可以充分的并行来执行。有再多量的数据也没关系,只要有相应的资源能够去起这些map和reduce,就能够进行大数据的分析。所以这也是为什么mapreduce批处理模型可以对海量数据进行分析和处理的原因。

Saprk批处理模型

在大数据的批处理模型当中,除了mapreduce以外,在年的时候还出现了一个批处理模型——spark。spark处理机制和mapreduce基本是相同的,也是分而治之再规约。

saprk和mapreduce有两个区别:

首先,如果要做的一个分析包含有多轮的mapreduce要完成,那么在这个时候我们采用mapreduce模型做处理的时候的话,每一轮结束以后的中间数据结果,是要保存到HDFS上面去的。

上图所展示的是每做完一轮分析,结果需要写HDFS。HDFS本身是大数据的存储系统,那么做完一轮,数据要写HDFS,做完下一轮又要去写HDFS,开销较大。

对于spark而言,区别就在于,每一轮做完以后,它的中间数据结果并不会要写到HDFS,而是保存到内存当中。所以和mapreduce相比,spark也是批处理模型,但是它更适合迭代运算比较多的应用,比如像机器学习或数据挖掘。

其次,spark提供的操作类型更多。mapreduce就提供两种类型,map操作和reducec操作。而spark在执行过程当中,提供了更加丰富的操作接口。

spark分成两种操作:一种叫Transformation。这种主要是对数据进行各种变换操作,如map、filter、flatmap、sample等等。是对数据进行展开、过滤或者是采样等等操作。另一种是action操作,主要是把数据进行输出,或者对数据进行最终的计算。

因为spark提供了更多类型的操作,所以使用spark进行批处理操作的时候,更加的便捷一些。这个是spark和mapreduce相比两个最大的特点。

二、大数据分析技术—流处理

流处理,通常也称为流计算,是针对流式数据的一种实时计算方法。流式数据是指实时、持续不断到达的数据,比如像我们一些传感器采集的数据,或者是用户在网页前端所点击的行为,都称为流式数据。

流式数据来源众多,就像刚才所说,有可能是业务系统里面产生的日志数据,也有可能是传感器传入的数据,还有可能是我们用户的点击行为数据等等。并且数据规模通常较大。如果我们在一个生产环境中有大量的传感器在同时采集数据的话,数据的规模往往是巨大的。

流式数据的特点也就决定了流计算框架要具备高性能的特点,比如说每秒能够处理几万甚至几十万条数据,以及能够去做到海量数据的处理,包括还有实时性和可伸缩性。

可伸缩性主要是指流计算框架能够在规模集群上进行部署,从而能够处理海量的数据。就像我们这图上所展示的一样,一个流里面其实有很多的这种Tuple,我们一般称之为原组组成,不停地到达不停的进行处理。

流计算应用场景通常有4种:

①日志分析。从日志中分析出特定的数据,并将分析的结果存入外部存储器如数据库。

②管道系统。将一个数据从一个系统传输到另外一个系统,比如将数据库同步到Hadoop。

③消息转化器。将接受到的消息按照某种格式进行转化,存储到另外一个系统如消息中间件。

④统计分析器。从日志或消息中,提炼出某个字段,做count或sum计算,将统计值存入外部存储器。中间处理过程可能更复杂。

本课程中,我们介绍两个流计算框架。

1、Storm

Storm是一种分布式的实时计算系统。它的特点是编程模型比较简单,同时可以高并发、高可靠、高可伸缩来完成流计算任务。

这幅图呈现的就是storm的部署架构。我们可以在一堆的服务器上,或者是一堆虚拟机上面去部署storm集群。里面包括它的主节点,我们叫做nimbus;以及从节点,也就是实际进行流计算程序运行的节点,我们称之为supervisor;以及它还依赖于zookeeper这种分布式的协调工具来进行状态的保存。这个是storm流框架的一个系统架构。

来看一个使用storm分析的实际应用案例。

这个是一个实时的路况分析。我们需要计算十多万条的道路的平均时速,进行实时的路况播报,这一般是要求秒级响应。通常在一些公车或者出租车上面,会部署这种GPS定位仪,每15秒发一条位置定位。这样的话一共有6万多定位仪,每天产生35亿条数据,空间大概占G左右,这是一个典型的流计算的场景,对时速进行实时播报。

通过storm的解决方案,可以写这么一个storm流程去分析,对数据进行处理。通常来讲,首先要把数据采集的数据发送到数据中心,然后数据中心的服务器会把数据一份送给我们的大数据存储系统,一份就会送到虚框。框出来的storm的程序当中,虚框框的就是storm的程序。它这个里面包含有跟数据源对接的组件,这个主要是用来去获取我们实际到来的流数据,以及定型数据实际处理的组件。

像MapMatchBolt、SpeedCalBolt、还有DBWriteBolt这三个组件,分别是对GPS定位仪数据进行实际的道路定位、以及道路的时速计算、以及最后把道路的时速写到数据库当中去。

通过这么一个一直不停运行的流程序的执行,前端可以通过查询MySQL数据库来获得实时更新的道路的时速。这个是一个典型的storm的流程序的应用场景。

2、SparkStreaming

SparkStreaming流计算框架,是构建在spark上的一个实时计算框架。它是采用了spark作为底层的执行引擎,同样可以达到秒级的响应。

SparkStreaming跟storm相比的一个好处是,它可以集成Spark的批处理和交互查询的特点。所以大家也可以看到在这个图上SparkStreaming可以对接一些采集工具,比如像Kafka、Flume,或者对接存储系统,它经过处理之后,可以把处理后的数据再写到比如说数据库或者是一些仪表盘,或者是HDFS存储系统当中。

前面跟大家介绍的Spark本身是一个批处理引擎。我们采用SparkStreaming巨流数据进行分析的时候,本质上来讲,是对不停到达的流数据通过一个固定大小的时间片进行拆分。就像上图所示,数据流不停的进来,SparkStreaming这个组件会对流数据按照时间片切分成一片片小的数据,这一片片的小的数据又可以被Spark的执行引擎用类似于批处理的方式进行处理,从而实现了对流数据的处理。

需要注意的是,SparkStreaming是把流数据变成了小批次的批处理数据来进行处理,这个是和Storm所不一样的地方。

三、大数据分析算法

大数据分析算法主要来自于人工智能里的一些经典的算法。从这幅图上可以看到,在人工智能里面,包含有机器学习,而机器学习里面又包含有神经网络。

目前我们用于大数据分析的算法当中,绝大部分是来自于机器学习里的算法。也可以看到现在比较火热的神经网络算法,其实也是属于机器学习算法中的一类。只不过对于神经网络算法而言,我们现在一般更加把它应用于一些,比如图片视频音频的处理。

所以大家要有一个概念,对于大数据分析来讲,可以借鉴于机器学习当中的一些经典算法来进行数据的处理和分析。

简单介绍一下大数据算法的分类。

1、有监督学习

有监督学习是指输入数据已经是训练数据,也就是说每一组训练数据有明确的一个标识。

比如说我们要对数据进行分类,把数据分成正类和负类,有监督学习的情况下,这些训练的数据已经明确地标好了它是属于正类还是负类。那么在学习过程当中,我们就是要去建立数据模型,这个模型的预测结果要和我们这些训练数据的实际结果进行比对,通过调整模型参数,直到模型预测结果和这些训练数据的实际结果可比较。

如上图,在有监督学习的情况下,数据分成正类和负类,然后通过训练之后,能够得到一个模型。这个模型预测出来的结果,也是对我们的数据类别进行一个区分。我们在调参的过程当中,其实就是通过调模型的参数,从而能够获得这个数据准确的分类。

那么在有监督学习下,通常的分析算法是属于分类算法或者是回归算法。在这个地方再一次强调,在有监督学习的情况下,数据本身已经做了标注,也就是已经分好了正类和负类这种标识了,这种称之为有监督学习。

2、无监督学习

和有监督学习相对应的,就是这类算法里面数据本身并没有被特别的标记,也不存在一个特别的目标变量,要把数据分成正类或者是负类。

这类算法主要是希望能够通过数据本身的关系特点,来去识别这些数据变量之间的模式和特征。就像上图所示,有监督学习情况下,我们要对不同的类别的数据做一个明确的分类,而无监督学习情况下,更多是基于数据本身的特点把数据分成不同的类别。这个类别在对模型进行训练的时候并没有明确指定,这个是和有监督学习所区别的地方。

通常我们的关联分析或者是聚类算法,都是属于无监督学习的。

在大数据分析过程当中,算法的分析过程通常分成四个步骤。

第一步:输入数据

这个里面包括数据的获得、数据的标注等等。对于有监督学习,需要对数据进行一个标注的。

第二步:特征提取

对于数据获得之后,数据本身可能会包含很多维度的特征。到底用哪些特征来进行模型的训练,是在这步需要进行考虑的。一般来讲,特征选取的越多,模型本身也会越精确,但是处理的难度也会越大。

第三步:模型训练和设计

依赖于对数据进行分析和处理,以及一些算法对这些数据的关联进行分析,从而获得具体模型。

第四步:数据预测

有了模型以后,最后就是使用这个模型进行预测。这里的数据预测是指我们可以获得实际的新的数据,然后再拿模型进行预测。

简单介绍两个算法示例。

1、线性回归

如上图所示,本身的数据是这些散的点,我们希望通过模型训练能够获得一条直线。这个直线就是这些散点的一个模型。后续再有新的点进来,直接通过这个模型就可以预测出来它相对应的结果是什么。

通常是用一些连续变量来估计实际的数值。比如说,根据一些实际情况变化来去预测房价,或者是预测销售额。那么线性回归从模型上来讲,也是指要和一些最佳的直线来建立自变量和因变量之间的关系,通常类似于Y=a*X+B这种模型,这种是属于线性回归。

2、分类算法

也是经常用到的算法。分类算法当中,决策树是一种常见的算法。

决策树通常是构建一个树形的结构,比如要进行一个决策,是否进行一个比赛的执行,或者是说是否举行一个比赛。那么这个比赛就是我们的决策变量。最终的结果就是要判断举行还是不举行。

在进行判断过程当中,就要依赖于一系列的判断条件进行一个预测,或者是进行一个判断。所以在整个决策树构建过程当中,可以看到每一个节点基本上是我们的一个判断条件。

比如,我们可以根据天气的情况来判断天气晴天雾霾天或者是雨天,我们进行比赛举行的概率有多少。当某个条件情况下我们不能做最终决策的时候,要进一步的再去采取另外一个维度特征进行判断。比如说在晴天的情况下,举行比赛和不举行比赛的概率各占一半,这个时候就需要进行一个进一步的判断。

我们采用湿度进行判断,比如说当湿度=70的时候,有5/8的概率是进行比赛,当湿度70的时候,有3/4的概率是不进行比赛。这个时候就可以通过天气情况以及湿度情况,对是否举行比赛进行一个判断。这个就是一个典型的决策树的分析过程。

决策树属于分类算法,也是在日常的实际应用中使用的非常广泛的一类算法。

刚才介绍了有监督学习和无监督学习。那么具体的算法分类,还包括比如像分类算法、聚类算法、关联规则挖掘、回归算法以及协同过滤。

协同过滤通常会用在一些推荐系统当中,比如说给用户推荐一些商品、服务,可以使用协同过滤这种算法。

常用的算法库包括:Pythonsklearn、MapReduceMahout以及SparkMLIib。

这三个库本身已经实现了上述这些经典算法的机制,算法的本身的过程也在这些库里面有实现。我们使用这些库的时候,通常主要就是填充好这些算法的参数,对所获得的数据进行训练,从而获得实际的模型。

这个就是我们常用的大数据分析算法,以及相应的库的一个支撑。

四、大数据可视化

最后来介绍一下大数据可视化的工具。通常用于大数据可视化的工具有两类。

1、Pythonmatplotlib

matplotlib这个库提供了诸如像饼图、折线图、直方图还有散点图等多种形式的可视化效果。一般采用python对大数据进行分析的时候可以使用这个库对数据进行一个可视化的展示,也可以帮助我们更好地认识数据相互之间的关系。

2、Zeppelin

Zeppelin提供了Web形式的数据可视化工具。一般Zeppelin是用来跟spark对接的,后台数据引擎用spark提供给Zeppelin数据,Zeppelin就可以采用像饼图、直方图还有像折线图来呈现spark所分析的数据。

当想使用大数据可视化对数据做展示的时候,这两个工具是我们常用的。




转载请注明:http://www.aierlanlan.com/rzfs/4828.html