处理服务器的作用 很显然,处理服务器就是处理接收到的数据的地方。“处理”是一个抽象的词语,例如保存数据,以及转换数据以使其看上去更易懂,还有从多台传感器的数据中发现新的数据,这些都是处理。使用者的目的不同,处理服务器的内容也各异。不过说到数据的处理方法,它可以归纳成以下 4 种:数据分析、数据加工、数据保存以及向设备发出指令(图 2.20)。
关于数据的分析和加工,有两种典型的处理方式,分别叫作“批处理”和“流处理”。首先就来说说这个“批处理”和“流处理”。 批处理 批处理的方法是隔一段时间就分批处理一次积攒的数据。一般情况下是先把数据存入数据库里,隔一段时间就从数据库获取数据,执行处理。批处理的重点在于要在规定时间内处理所有数据。因此,数据的数量越多,执行处理的机器性能就得越好。 今后设备的数量将会增加,这一点在第一章已经解释过了。人们需要处理从数量庞大的设备发来的传感器数据和图像等大型数据,这被称为“大数据”。不过,通过使用一种叫作分布式处理平台的平台软件,就能高效地处理数兆、数千兆这种大型数据了。具有代表性的分布式处理平台包括 Hadoop 和Spark。
Apache Hadoop Apache Hadoop 是一个对大规模数据进行分布式处理的开源框架.Hadoop 有一种叫作 MapReduce 的机制,用来高效处理数据。MapReduce是一种专门用于在分布式环境下高效处理数据的机制,它基本由 Map、Shuffle、 Reduce 这 3 种处理构成(图 2.21)。
Hadoop 对于每个被称为节点的服务器执行 MapReduce,并统计结果。首先是分割数据,这里的数据指的是各个服务器的处理对象。最初负责分割数据的是 Map。Map 对于每条数据反复执行同一项处理,通过Map 而发生变更的数据会被移送到下一项处理,即 Shuffle。Shuffle 会跨 Hadoop 的节点来把同种类的数据进行分类。最后, Reduce 把分类好的数据汇总。 也就是说, MapReduce 是一种类似于收集硬币,按种类给硬币分类后再点数的方法。用 Hadoop 执行处理的时候,为了能用 MapReduce 实现处理内容,使用者需要下一番工夫。 另外, Hadoop 还有一种叫分布式文件系统( HDFS)的机制,用于在分布式环境下运行 Hadoop。HDFS 把数据分割并存入多个磁盘里,读取数据时,就从多个磁盘里同时读取分割好的数据。这样一来,跟从一台磁盘里读出巨大的文件相比,这种方法更能高速地进行读取。如上所述,如果使用MapReduce 和 HDFS 这两种机制, Hadoop 就能高速处理巨型数据。 Apache Spark Apache Spark 也和 Hadoop 一样,是一个分布式处理大规模数据的开源框架。Spark 用一种叫作 RDD( Resilient Distributed Dataset,弹性分布数据集)的数据结构来处理数据(图 2.22)。
RDD 能够把数据放在内存上,不经过磁盘访问也能处理数据。而且 RDD 使用的内存不能被写入,所以要在新的内存上展开处理结果。通过保持内存之间的关系,就能从必要的时间点开始计算,即使再次计算也不用从头算起。根据这些条件, Spark 在反复处理同一数据时(如机器学习等),就能非常高速地运行了。 对物联网而言,传输的数据都是一些像传感器数据、语音、图像这种比较大的数据。批处理能够存储这些数据,然后导出当天的设备使用情况,以及通过图像处理从拍摄的图像来调查环境的变化。随着设备的增加,想必今后这样的大型数据会越来越多。因此,重要的是学会在批处理中使用我们介绍的分布式处理平台。
流处理 批处理是把数据攒起来,一次性进行处理的方法。相对而言,流处理是不保存数据,按照到达处理服务器的顺序对数据依次进行处理。想实时对数据做出反应时,流处理是一个很有效的处理方法。因为批处理是把数据积攒之后隔一段时间进行处理,所以从数据到达之后到处理完毕为止,会出现时间延迟。因此,流处理这种把到达的数据逐次进行处理的思路就变得很重要了。此外,流处理基本上是不会保存数据的。只要是被使用过的数据,如果没必要保存,就会直接丢弃。 举个例子,假设有个系统,这个系统会对道路上行驶的车辆的当前位置和车辆雨刷的运转情况进行搜集。仅凭搜集那些雨刷正在运转的车辆的当前位置,就能够实时确定哪片地区正在下雨。此时,使用者可能想保存下过雨的地区的数据,这时候只要保存处理结果就好,所以原来的传感器数据可以丢掉不要,流处理正适用于这种情况。用流处理平台就能实现流处理。 流处理和批处理一样,也准备了框架。在这里就给大家介绍一下Apache Spark 和 Apache Storm 这两个框架。 Spark Streaming Spark Streaming 是作为 Apache Spark(在“批处理”部分介绍过)的库被公开的。通过 Spark Streaming,就能够把 Apache Spark 拿到流处理中来使用(图 2.23)。
Spark Streaming 是用 RDD 分割数据行的,它通过对分割的数据执行小批量的批处理来实现流处理。输入的数据会被转换成一种叫作Stream 的细且连续的 RDD。先对一个 RDD 执行 Spark 的批处理,将其转换成别的 RDD,然后按顺序对所有 RDD 反复执行上述处理来实现流处理。 Apache Storm Apache Storm 是用于实现流处理的框架,结构如图 2.24 所示。
用 Storm 处理的数据叫作 Tuple,这个 Tuple 的流程叫作 Streams。 Storm 的处理过程由 Spout 和 Bolts 两项处理构成,这种结构叫作Topology。Spout 从其他处理接收到数据的时候, Storm 处理就开始了。Spout 把接收到的数据分割成 Tuple,然后将其流入 Topology 来生成Streams,这就形成了流处理的入口。接下来, Bolts 接收 Spout 以及从其他 Bolts 输出的 Streams,并以 Tuple 为单位处理收到的 Streams,然后将其作为新的 Streams 输出。可以自由组合 Bolts 之间的连接,也可以根据想执行的处理自由组合 Topology,还可以随意决定 Tuple 使用的数据类型,以及使用 JSON 等数据格式。