13 物联网中的数据分析
前面讲了物联网中的数据怎样存储, 现在我们来看看物联网数据的处理。
数据的处理包括两个方面:
- 业务处理:通常来说,这样的处理是根据数据完成相应的业务,通常来说是对每一条提交的数据做对应的处理。
- 分析处理:通常是对所有的数据,或者具有某些共同特征的数据进行统计和分析。
业务处理和具体的业务逻辑相关,我们这里就不涉及了。关于数据的分析,我们这里只是范范的介绍一下相关的概念和开源的实现。毕竟任何一个方面展开了讲,都是一个很大的话题。
13.1 海量数据的分析
物联网的一个特征就是海量的数据。因此在进行数据分析的时候,我们面临的主要的问题就是海量数据如何进行分析。其实这一部分在大数据中已经有了很多方案。其中最出名的就是MapReduce和Spark。
1. MapReduce
最早出现的就是MapReduce,其中最著名的就是Hadoop MapReduce。MapReduce的思路就是分而治之。将海量的数据划分为多个数据块,在每个数据块上分别进行分析。这个过程称为Map。然后将分析的结果合并起来,这个过程称为Reduce。
但是Hadoop MapReduce无法应对越来越复杂的分析需求,主要体现在计算模型过于简单,以及多次落盘带来的性能问题。
2. Spark
为了解决Hadoop MapReduce的弊端,出现了Spark。Spark的计算模型是DAG (Directed Acyclic Graph, 有向无环图)。同时,Spark会将数据保存在内存中,直到最后结果才会落盘,大大提升了效率。
13.2 批处理和流处理
无论是MapReduce还是Spark,最开始要解决的都是批量数据处理的问题。这种方式我们称为批处理。通常来说,批处理的特点是吞吐量大,但是延迟长。
这种处理方式能够应对很多场景,但是也有很多场景是应对不了的,尤其是对延迟要求比较高的场景,例如个性化的广告、商品推荐等待。这些场景也有一些共同的特点:
- 会不断的收到数据(或者说数据会不断的“流入”系统中)
- 要求能够快速的分析处理数据,快速的返回结果。(实时计算)
因此,这样的处理方式被称为“流处理”。
目前业界使用的最广泛的流处理框架包括:
** 1. Storm**
流处理最早的代表性框架是Storm。Storm提出了Stream的概念,一个Stream就是元组(Tuple)的无限序列。这些Tuple从Spout(喷嘴)中流出,经过一个个bolt(螺栓)的处理,最终得到我们需要的结果。如下图所示:
其实从上图中也可以看出,Storm的拓扑结构,也是一个DAG。
** 2. Spark **
不是说Spark是批处理吗?怎么变成了流处理?Spark中也提供了Spark Stream用来做流处理,但是本质上还是批处理,只不过是将海量的数据划分为一小块一小块,当每一块都足够小的时候,就变成流处理了。(感觉在说微积分 :-) )。这种方式被称为“微批处理”。
** 3. Flink **
Spark通过“微批处理”的方式模拟了流处理。那么有没有同时支持批处理和流处理的框架呢?答案是Flink。Flink出现的比Storm和Spark要晚一些,它最初是为了解决流式处理问题的框架,但是它将数据块作为一种特殊的数据流,提供了批处理的能力。
13.3 小结
在对海量数据进行分析的时候,有批处理和流处理两种方式,也有很多的开源实现。具体使用哪种实现,则由具体的需求而定。 我们这里只是做了简单的介绍,要详细了解各个框架的细节和使用方式,需要去学习相应的资料。