从Storm和Spark 学习流式实时分布式计算的设计

流式实时分布式计算系统在互联网公司占有举足轻重的地位,尤其在在线和近线的海量数据处理上。在线系统负责处理在线请求,因此低延时高可靠是核心指标。在线系统是互联网公司的核心,系统的好坏直接影响了流量,而流量对互联网公司来说意味着一切。在线系统使用的数据是来自于后台的计算系统产生的。

对于在线(区别于响应互联网用户请求的在线系统,这个在线系统主要是内部使用的,也就是说并不直接服务于互联网用户)/近线系统来说,处理的是线上产生的数据,比如在线系统产生的日志,记录用户行为的数据库等,因此近线系统也需要低延时高可靠的处理海量数据。对于那些时效性很强的数据,比如新闻热点,电商的促销,微博热词等都需要在很短的时间内完成数据处理以供在线系统使用。

而处理这些海量数据的,就是实时流式计算系统。Spark是实时计算的系统,支持流式计算,批处理和实时查询。它使用一个通用的stack解决了很多问题,毕竟任何公司都想要Unified的平台去处理遇到的问题,可以减少开发和维护的人力成本和部署平台的物力成本。除了Spark,流式计算系统最有名的就是Twitter的Storm和Yahoo的S4(其实Spark的流式计算还是要弱于Storm的,个人认为互联网公司对于Storm的部署还是多于Spark的)。

本文主要探讨流式计算系统的设计要点,并且通过对Spark和Storm的实现来给出实例。通过对于系统设计要点的梳理,也可以帮助我们更好的学习这些系统的实现。最后,看一下国内互联网公司对于这些流式系统的应用(仅限于公开发表的内容)。

流式计算的背景和特点

现在很多公司每天都会产生数以TB级的大数据,如何对这些数据进行挖掘,分析成了很重要的课题。比如:

 

  1. 电子商务:需要处理并且挖掘用户行为产生的数据,产生推荐,从而带来更多的流量和收益。最理想的推荐就是根据兴趣推荐给用户本来不需要的东西!而每天处理海量的用户数据,需要一个低延时高可靠的实时流式分布式计算系统。
  2. 新闻聚合:新闻时效性非常重要,如果在一个重大事情发生后能够实时的推荐给用户,那么肯定能增大用户粘性,带来可观的流量。
  3. 社交网站:大家每天都会去社交网站是为了看看现在发生了什么,周围人在做什么。流式计算可以把用户关注的热点聚合,实时反馈给用户,从而达到一个圈子的聚合效果。
  4. 交通监管部门:每个城市的交通监管部门每天都要产生海量的视频数据,这些视频数据也是以流的形式源源不断的输系统中。实时流式计算系统需要以最快的速度来处理这些数据。
  5. 数据挖掘和机器学习:它们实际上是互联网公司内部使用的系统,主要为线上服务提供数据支撑。它们可以说是互联网公司的最核心的平台之一。系统的效率是挖掘的关键,理想条件下就是每天产生的海量数据都能得到有效处理,对于原来的数据进行全量更新。
  6. 大型集群的监控:自动化运维很重要,集群监控的实时预警机制也非常重要,而流式系统对于日志的实时处理,往往是监控系统的关键。
  7. 等等。

 

流式实时分布式计算系统就是要解决上述问题的。这些系统的共同特征是什么?

 

  1. 非常方便的运行用户编写的计算逻辑:就如Hadoop定义了Map和Reduce的原语一样,这些系统也需要让用户关注与数据处理的具体逻辑上,他们不应该也不需要去了解这些usder defined codes是如何在分布式系统上运转起来的。因为他们仅仅关注与数据处理的逻辑,因此可以极大的提高效率。而且应该尽量不要限制编程语言,毕竟不同的公司甚至同一公司的不同部门使用的语言可能是千差万别的。支持多语言无疑可以抢占更多的用户。
  2. Scale-out的设计:分布式系统天生就是scale-out的。
  3. 无数据丢失:系统需要保证无数据丢失,这也是系统高可用性的保证。系统为了无数据丢失,需要在数据处理失败的时候选择另外的执行路径进行replay(系统不是简单的重新提交运算,而是重新执行调度,否则按照来源的call stack有可能使得系统永远都在相同的地方出同样的错误)。
  4. 容错透明:用户不会也不需要关心容错。系统会自动处理容错,调度并且管理资源,而这些行为对于运行于其上的应用来说都是透明的。
  5. 数据持久化:为了保证高可用性和无数据丢失,数据持久化是无法躲避的问题。的确,数据持久化可能在低延时的系统中比较影响性能,但是这无法避免。当然了,如果考虑到出错情况比较少,在出错的时候我们能够忍受数据可以从头replay,那么中间的运算可以不进行持久化。注意,这只有在持久化的成本要比计算的replay高的情况下有效。一般来说,计算的结果需要replica,当然了,可以使用将数据replica到其他的节点的内存中去(这又会占用集群的网络带宽)。
  6. 超时设置:超时之所以在在这里被提出来,因为超时时间的大小设置需要重视,如果太短可以会误杀正常运行的计算,如果太长则不能快速的检测错误。还有就是对于错误的快速发现可以这类系统的一个设计要点,毕竟,超时了才发现错误很多时候在时效性上是不可接受的。

 

原语设计

Hadoop定义了Map和Reduce,使得应用者只需要实现MR就可以实现数据处理。而流式系统的特点,允许它们可以进行更加具体一些的原语设计。流式的数据的特点就是数据时源源不断进入系统的,而这些数据的处理一般都需要几个阶段。拿普通的日志处理来说,我们可能仅仅关注Error的日志,那么系统的第一个计算逻辑就是进行filer。接下来可能需要对这个日志进行分段,分段后可能交给不同的规则处理器进行处理。因此,数据处理一般是分阶段的,可以说是一个有向无环图,或者说是一个拓扑。实际上,Spark抽象出的运算逻辑就是由RDD(Resilient Distributed Dataset)构成DAG(Directed Acyclic Graph),而Storm则有Spout和Blot构成Topology(拓扑)。

Spark的设计

Spark Streaming是将流式计算分解成一系列短小的批处理作业。这里的批处理引擎是Spark,也就是把Spark Streaming的输入数据按照batch size(如1秒)分成一段一段的数据,每一段数据都转换成Spark中的RDD,然后将Spark Streaming中对DStream的Transformation操作变为针对Spark中对RDD的Transformation操作,将RDD经过操作变成中间结果保存在内存中。整个流式计算根据业务的需求可以对中间的结果进行叠加,或者存储到外部设备。下图显示了Spark Streaming的整个流程。

 

WordCount的例子:

 

这个例子使用Scala写的,一个简单优雅的函数式编程语言,同时也是基于JVM的后Java类语言。

Storm的设计

Storm将计算逻辑成为Topology,其中Spout是Topology的数据源,这个数据源可能是文件系统的某个日志,也可能是MessageQueue的某个消息队列,也有可能是数据库的某个表等等;Bolt负责数据的护理。Bolt有可能由另外两个Bolt的join而来。

而Storm最核心的抽象Streaming就是连接Spout,Bolt以及Bolt与Bolt之间的数据流。而数据流的组成单位就是Tuple(元组),这个Tuple可能由多个Fields构成,每个Field的含义都在Bolt的定义的时候制定。也就是说,对于一个Bolt来说,Tuple的格式是定义好的。

 

原语设计的要点

流式系统的原语设计,要关注一下几点:

 

  1. 如何定义计算拓扑:要方便算法开发者开发算法与策略。最好的实现是定义一个算法与框架的交互方式,定义好算法的输入结构和算法的输出结构。然后拓扑能够组合不同的算法来为用户提供一个统一的服务。计算平台最大的意义在于算法开发者不需要了解程序的运行,并发的处理,高可用性的实现,只需要提供算法与计算逻辑即可以快速可靠的处理海量的数据。
  2. 拓扑的加载与启动:对于每个节点来说,启动时需要加载拓扑,节点需要其他的信息,比如上游的数据来源与下游的数据输出。当然了下游的数据输出的拓扑信息可以存储到Tuple中,对于数据需要放到那里去拓扑本身是无状态的。这就取决于具体的设计了。
  3. 拓扑的在线更新:对于每个算法逻辑来说,更新是不可避免的,如何在不停止服务的情况下进行更新是必要的。由于实现了架构与算法的剥离,因此算法可以以一个单独的个体进行更新。可以操作如下:Master将算法实体保存到一个Worker可见的地方,比如HDFS或者是NFS或者ZK,然后通过心跳发送命令到拓扑,拓扑会暂时停止处理数据而加载新的算法实体,加载之后重新开始处理数据。数据一般都会放到buffer中,这个buffer可能是一个queue。但是从外界看来,拓扑实际上是一直处于服务状态的。
  4. 数据如何流动:流式系统最重要的抽象就是Streaming了。那么Steaming如何流动?实际上涉及到消息的传递和分发,数据如何从一个节点传递到另外一个节点,这是拓扑定义的,具体实现可以参照第三小节。
  5. 计算的终点及结果处理:流式计算的特点就是计算一直在进行,流是源源不断的流入到系统中的。但是对于每个数据单位来说它的处理结果是确定的,这个结果一般是需要返回调用者或者需要持久化的。比如处理一个时间段的交通违章,那么输入的数据是一段时间的视频监控,输出这是违章的信息,比如车牌,还有违章时刻的抓拍的图片。这个数据要么返回调用者,由调用者负责数据的处理,包括持久化等。或者是拓扑最后的节点将这些信息进行持久化。系统需要对这些常见的case进行指导性的说明,需要在Programmer Guide的sample中给出使用例子。

消息传递和分发

对于实现的逻辑来说,它们都是有向无环图的一个节点,那么如何设计它们之间的消息传递呢?或者说数据如何流动的?因为对于分布式系统来说,我们不能假定整个运算都是在同一个节点上(事实上,对于闭源软件来说,这是可以的,比如就是满足一个特定运算下的计算,计算平台也不需要做的那么通用,那么对于一个运算逻辑让他在一个节点完成也是可以了,毕竟节省了调度和网络传输的开销)。或者说,对于一个通用的计算平台来说,我们不能假定任何事情。

消息传递和分发是取决于系统的具体实现的。通过对比Storm和Spark,你就明白我为什么这么说了。

Spark的消息传递

对于Spark来说,数据流是在通过将用户定义的一系列的RDD转化成DAG图,然后DAG Scheduler把这个DAG转化成一个TaskSet,而这个TaskSet就可以向集群申请计算资源,集群把这个TaskSet部署到Worker中去运算了。当然了,对于开发者来说,他的任务是定义一些RDD,在RDD上做相应的转化动作,最后系统会将这一系列的RDD投放到Spark的集群中去运行。

 

Storm的消息传递     

对于Storm来说,他的消息分发机制是在定义Topology的时候就显式定义好的。也就是说,应用程序的开发者需要清楚的定义各个Bolts之间的关系,下游的Bolt是以什么样的方式获取上游的Bolt发出的Tuple。Storm有六种消息分发模式:

 

  1. Shuffle Grouping: 随机分组,Storm会尽量把数据平均分发到下游Bolt中。
  2. Fields Grouping:按字段分组, 比如按userid来分组, 具有同样userid的tuple会被分到相同的Bolt。这个对于类似于WordCount这种应用非常有帮助。
  3. All Grouping: 广播, 对于每一个Tuple, 所有的Bolts都会收到。这种分发模式要慎用,会造成资源的极大浪费。
  4. Global Grouping: 全局分组, 这个Tuple被分配到storm中的一个bolt的其中一个task。这个对于实现事务性的Topology非常有用。
  5. Non Grouping: 不分组, 这个分组的意思是说stream不关心到底谁会收到它的tuple。目前这种分组和Shuffle grouping是一样的效果, 有一点不同的是storm会把这个bolt放到这个bolt的订阅者同一个线程里面去执行。
  6. Direct Grouping: 直接分组,  这是一种比较特别的分组方法,用这种分组意味着消息的发送者指定由消息接收者的哪个task处理这个消息。

 

消息传递要点

消息队列现在是模块之间通信的非常通用的解决方案了。消息队列使得进程间的通信可以跨越物理机,这对于分布式系统尤为重要,毕竟我们不能假定进程究竟是部署在同一台物理机上还是部署到不同的物理机上。RabbitMQ是应用比较广泛的MQ,关于RabbitMQ可以看我的一个专栏:RabbitMQ

提到MQ,不得不提的是ZeroMQ。ZeroMQ封装了Socket,引用官方的说法: “ZMQ (以下 ZeroMQ 简称 ZMQ)是一个简单好用的传输层,像框架一样的一个 socket library,他使得 Socket 编程更加简单、简洁和性能更高。是一个消息处理队列库,可在多个线程、内核和主机盒之间弹性伸缩。ZMQ 的明确目标是“成为标准网络协议栈的一部分,之后进入 Linux 内核”。现在还未看到它们的成功。但是,它无疑是极具前景的、并且是人们更加需要的“传统”BSD 套接字之上的一层封装。ZMQ 让编写高性能网络应用程序极为简单和有趣。”

因此, ZeroMQ不是传统意义上的MQ。它比较适用于节点之间和节点与Master之间的通信。Storm在0.8之前的Worker之间的通信就是通过ZeroMQ。但是为什么0.9就是用Netty替代了ZeroMQ呢?说替代不大合适,只是0.9的默认的Worker之间的通信是使用了Netty,ZeroMQ还是支持的。Storm官方认为ZeroMQ有以下缺点:

 

  1. 不容易部署,尤其是在云环境下:以为ZMQ是以C写的,因此它还是紧依赖于操作系统环境的。
  2. 无法限制其内存。通过JVM可以很容易的限制java所占用的内存。但是ZMQ对于Storm来说是个黑盒似得存在。
  3. Storm无法从ZMQ获取信息。比如Storm无法知道当前buffer中有多少数据为发送。

 

当然了还有所谓的性能问题,具体可以访问Netty作者的blog。结论就是Netty的性能比ZMQ(在默认配置下)好两倍。不知道所谓的ZMQ的默认配置是什么。反正我对这个结果挺惊讶。当然了,Netty使用Java实现的确方便了在Worker之间的通信加上授权和认证机制。这个使用ZMQ的确是不太好做。

高可用性

HA是分布式系统的必要属性。如果没有HA,其实系统是不可用的。那么如果实现HA?对于Storm来说,它认为Master节点Nimbus是无状态的,无状态意味着可以快速恢复,因此Nimbus并没有实现HA(不知道以后的Nimbus是否会实现HA,实际上使用ZooKeeper实现节点的HA是开源领域的通用做法)。为什么说Nimbus是无状态的呢?因为集群所有的元数据都保存到了ZooKeeper(ZK)中。Nimbus定时从ZK获取信息,并且通过向ZK写信息来控制Worker。Worker也是通过从ZK中获取信息,通过这种方式,Worker执行从Nimbus传递过来的命令。

Storm的这种使用ZK的方式还是很值得借鉴的。

Spark是如何实现HA的?我的另外一篇文章分析过Spark的Master是怎么实现HA的:Spark技术内幕:Master基于ZooKeeper的High Availability(HA)源码实现 。

也是通过ZK的leader 选举实现的。Spark使用了百行代码的级别实现了Master的HA,由此可见ZK的功力。

除了这些Master的HA,还有每个Worker的HA。或者说Worker的HA说法不太准确,因此对于集群里的工作节点来说,它可以非常容易失败的。这里的HA可以说是如何让Worker失败后快速重启,重新提供服务。实现方式也可以由很多种。一个简单的方法就是使用一个容器(Container)启动Worker并且监控Worker的状态,如果Worker异常退出,那么就重新启动它。这个方法很简单也很有效。

如果是节点宕机呢?上述方法肯定是不能用的。这种情况下Master会检测到Worker的心跳超时,那么就会从资源池中把这个节点删除。回到正题,宕机后的节点重启涉及到了运维方面的知识。对于一个集群来说,硬件宕机这种情况应该需要统一的管理,也就是集群也可以由一个Master,维持每个节点的心跳来确定硬件的状态。如果节点宕机,那么集群首先是重启它。如果启动失败可能会通过电话或者短信或者邮件通知运维人员。因此运维人员为了保证集群的高可用性付出了很多的努力,尤其是大型互联网公司的运维人员,非常值得点赞。当然了这个已经不是Storm或者Spark所能涵盖的了。

存储模型与数据不丢失

其实,数据不丢失有时候和处理速度是矛盾的。为了数据不丢失就要进行数据持久化,数据持久化意味着要写硬盘,在固态硬盘还没有成为标配的今天,硬盘的IO速度永远是系统的痛点。当然了可以在另外节点的内存上进行备份,但是这涉及到了集群的两个稀缺资源:内存和网络。如果因为备份而占用了大量的网络带宽的话,那必将影响系统的性能,吞吐量。

当然了,可以使用日志的方式。但是日志的话对于错误恢复的时间又是不太能接受的。流式计算系统的特点就是要快,如果错误恢复时间太长,那么可能不如直接replay来的快,而且系统设计还更为简单。

其实如果不是为了追求100%的数据丢失,可以使用checkpoint的机制,允许一个时间窗口内的数据丢失。

回到系统设计本身,实际上流式计算系统主要是为了离线和近线的机器学习和数据挖掘,因此肯定要保证数据的处理速度:至少系统可以处理一天的新增数据,否则数据堆积越来越大。因此即使有的数据处理丢失了数据,可以让源头重新发送数据。

还有另外一个话题,就是系统的元数据信心如何保存,因为系统的路由信息等需要是全局可见的,需要保存类似的这些数据以供集群查询。当然了Master节点保持了和所有节点的心跳,它完全可以保存这些数据,并且在心跳中可以返回这些数据。实际上HDFS的NameNode就是这么做的。HDFS的NN这种设计非常合理,为什么这么说?HDFS的元数据包含了非常多的数据:

 

  1. 目录文件树结构和文件与数据块的对应关系:会持久化到物理存储中,文件名叫做fsimage。
  2. DN与数据块的对应关系,即数据块存储在哪些DN中:在DN启动时会上报到NN它所维护的数据块。这个是动态建立的,不会持久化。因此,集群的启动可能需要比较长的时间。

 

那么对于流式计算系统这种算得上轻量级的元数据来说,Master处理这些元数据实际上要简单的多,当然了,Master需要实现服务的HA和数据的HA。这些不是一个轻松的事情。实际上,可以采用ZooKeeper来保存系统的元数据。ZooKeeper使用一个目录树的结构来保存集群的元数据。节点可以监控感兴趣的数据,如果数据有变化,那么节点会收到通知,然后就保证了系统级别的数据一致性。这点对于系统比较重要,因为节点都是不稳定的,因此系统的其他服务可能都会因为节点失效而发生变化,这些都需要通知相关的节点更新器服务列表,保证了部分节点的失效并不会影响系统的整体的服务,从而也就实现了故障对于用户的透明性。

如何与公司已有的生产环境进行融合

包括Spark和Storm,在国内著名的互联网公司比如百度,淘宝和阿里巴巴都有应用,但是它究竟贡献了多少流量是不得而知的。我了解到的是实际上大部分的流量,尤其是核心流量还是走公司的老架构的。著名的博主陈皓在微博上关于闭源软件和开源软件“特点”之争算是引起了轩然大波,具体讨论可以见知乎。之所以引用这个争论也是为了切合本小节的主题:如何与公司已有的生产环境进行融合。

虽然互联网公司的产品迭代很快,但是公司的核心算法和架构基本上改动不会那么多,因此公司不可能为了推动Storm和Spark这种开源产品而进行大规模的重新开发。只有那么后起的项目,从零开始的项目,比如小规模的调研项目才可能用这些产品。当然了开源产品首先是一个通用的平台,但是通用有可能产生的代价就是不那么高效,对于某些特殊地方的不能根据特殊的应用场景进行优化。如果对这个开源平台进行二次开发,使得性能方面满足自己的需求,首先不管法务上的问题,对于自己私有版本和社区版本进行merge也是个很大的challenge。就像现在很多公司对于Linux进行了二次裁剪,开发自己需要的Linux一样。都需要一些对于这些架构非常熟悉,并且非常熟悉社区动态的人去做这些事情。而这些在互联网公司,基本上是不可能的。因此大部分时候,都是自己做一个系统,去非常高效切合的去满足自身的需求。

当然了,开源社区的闪光点也会影响到闭源产品,闭源产品也会影响开源产品,这个相互影响是良性的,可以推动技术向前发展。

总结

Storm和Spark的设计,绝对不是一篇文章所能解决的。它里边由非常多的哲学需要我们仔细去学习。它们可以说是我们进行系统设计的良好的范例。本博客在接下来的半年会通过Spark的源码来学习Spark的系统架构。敬请期待!

越来越注重信息安全 中国政府将禁用赛门铁克和卡巴斯基

北京时间8月4日消息,据国内多家媒体报道,中国政府目前已将美国赛门铁克和俄罗斯的卡巴斯基排除在采购名单之外。

据媒体报道,《人民日报》周日已经在Twitter上确认了这一消息。另外,被政府批准的反病毒厂商皆是国内厂商,分别是360、瑞星、江民、启明星辰和冠群金辰。

在信息安全上,这也是继前几个月政府对Windows 8系统持“有色眼镜”、CCTV报道苹果手机存后门事件之后,国家在信息安全上又一重大举动。

是的,棱镜门曝光之后,各个国家对信息安全有了重新的认识,而中国也在这方面开始布局,逐渐在政府机关和一些有保密需求的单位中,逐步放弃使用国外的软硬件产品,转而支持和使用国内的产品。这所带来的好处,一个是保证了信息安全的需要,另外一个则是给国内厂商、国内的创业者带来大好机会。

另外,再联想到上段时间国家工商总局对微软进行立案调查,虽然主要是调查垄断问题,但实际上也是对微软涉嫌侵犯用户隐私等安全问题进行调查。

这不是意味着赛门铁克和卡巴斯基等产品不能在国内使用了?

刚才在微博上,看到一用户发出了上面这样的疑惑?实际上正如标题所言,这只是政府机构的行为,并不会影响以及扩展到消费者市场,这主要原因是中国已加入WTO,一般不会对并没有违反法律法规的产品在国内市场完全禁止。

不过由此延伸,未来或将有更多的国外软硬件产品被禁止在政府机关中使用,对于开发者而言,这将是一片蓝海。

大数据与数据挖掘的相对绝对关系

泄密者爱德华·斯诺登(Edward Snowden)还在寻求容身之所的时候,美国国家安全局(NSA)全方位收集电话和电子邮件记录之事经过他的披露,已经引发了不安和愤怒。奥巴马当局声称,监听数据带来了安全,然而左翼和右翼都在谴责这种窥探行为是对隐私的侵犯。

数据不是信息,而是有待理解的原材料。但有一件事是确定无疑的:当NSA为了从其海量数据中“挖掘”出信息,耗资数十亿改善新手段时,它正受益于陡然降落的计算机存储和处理价格。

麻省理工学院的研究者约翰·古塔格(John Guttag)和柯林·斯塔尔兹(Collin Stultz)创建了一个计算机模型来分析之心脏病病患丢弃的心电图数据。他们利用数据挖掘和机器学习在海量的数据中筛选,发现心电图中出现三类异常者——一年内死于第二次心脏病发作的机率比未出现者高一至二倍。这种新方法能够识别出更多的,无法通过现有的风险筛查被探查出的高危病人。

数据挖掘这一术语含义广泛,指代一些通常由软件实现的机制,目的是从巨量数据中提取出信息。数据挖掘往往又被称作算法。

威斯康星探索学院主任大卫·克拉考尔(David Krakauer)说,数据量的增长——以及提取信息的能力的提高——也在影响着科学。“计算机的处理能力和存储空间在呈指数增长,成本却在指数级下降。从这个意义上来讲,很多科学研究如今也遵循摩尔定律。”

在 2005年,一块1TB的硬盘价格大约为1,000美元,“但是现在一枚不到100美元的U盘就有那么大的容量。”研究智能演化的克拉考尔说。现下关于大数据和数据挖掘的讨论“之所以发生是因为我们正处于惊天动地的变革当中,而且我们正以前所未有的方式感知它。”克拉劳尔说。

随着我们通过电话、信用卡、电子商务、互联网和电子邮件留下更多的生活痕迹,大数据不断增长的商业影响也在如下时刻表现出来:

 

  • 你搜索一条飞往塔斯卡鲁萨的航班,然后便看到网站上出现了塔斯卡鲁萨的宾馆打折信息
  • 你观赏的电影采用了以几十万G数据为基础的计算机图形图像技术
  • 你光顾的商店在对顾客行为进行数据挖掘的基础上获取最大化的利润
  • 用算法预测人们购票需求,航空公司以不可预知的方式调整价格
  • 智能手机的应用识别到你的位置,因此你收到附近餐厅的服务信息

 

大数据在看着你吗?

除了安全和商业,大数据和数据挖掘在科研领域也正在风起云涌。越来越多的设备带着更加精密的传感器,传回愈发难以驾驭的数据流,于是人们需要日益强大的分析能力。在气象学、石油勘探和天文学等领域,数据量的井喷式增长对更高层次的分析和洞察提供了支持,甚至提出了要求。

 

2005年6月至2007年12月海洋表面洋流示意图。数据源:海面高度数据来自美国航空航天局

(NASA)的Topex/Poseidon卫星、Jason-1卫星,以及海形图任务/Jason-2卫星测高仪;重力数据来自NASA/德国航空航天中心的重力恢复及气候实验任务;表面风压数据来自NASA的 QuikScat任务;海平面温度数据来自NASA/日本宇宙航空研究开发机构的先进微波扫描辐射计——地球观测系统;海冰浓度和速度数据来自被动微波辐射计;温度和咸度分布来自船载、系泊式测量仪器,以及国际Argo海洋观测系统。

这幅2005年6月至2007年12月海洋表面洋流的示意图集成了带有数值模型的卫星数据。漩涡和窄洋流在海洋中传送热量和碳。海洋环流和气候评估项目提供了所有深度的洋流,但这里仅仅使用了表层洋流。这些示意图用来测量海洋在全球碳循环中的作用,并监测地球系统的不同部分内部及之间的热量、水和化学交换。

在医学领域,2003年算是大数据涌现过程中的一个里程碑。那一年第一例人类基因组完成了测序。那次突破性的进展之后,数以千计人类、灵长类、老鼠和细菌的基因组扩充着人们所掌握的数据。每个基因组上有几十亿个“字母”,计算时出现纰漏的危险,催生了生物信息学。这一学科借助软件、硬件以及复杂算法之力,支撑着新的科学类型。

 

精神障碍通常是具体病例具体分析,但是一项对150万名病人病例的研究表明,相当多的病人患有超过同一种疾病。芝加哥大学的西尔维奥·康特中心利用数据挖掘理解神经精神障碍的成因以及之间的关系。“好几个(研究)团队都在致力于这个问题的解决。”中心主任安德烈·柴斯基(Andrey Rzhetsky)说,“我们正试图把它们全部纳入模型,统一分析那些数据类型……寻找可能的环境因素。”

另一例生物信息学的应用来自美国国家癌症研究所。该所的苏珊·霍尔贝克(Susan Holbeck)在60种细胞系上测试了5000对美国食品和药品管理局批准的抗癌药品。经过30万次试验之后,霍尔贝克说:“我们知道每种细胞系里面每 一条基因的RNA表达水平。我们掌握了序列数据、蛋白质数据,以及微观RNA表达的数据。我们可以取用所有这些数据进行数据挖掘,看一看为什么一种细胞系对混合药剂有良好的反应,而另一种没有。我们可以抽取一对观察结果,开发出合适的靶向药品,并在临床测试。”

互联网上的火眼金睛

当医学家忙于应对癌症、细菌和病毒之时,互联网上的政治言论已呈燎原之势。整个推特圈上每天要出现超过5亿条推文,其政治影响力与日俱增,使廉洁政府团体面临着数据挖掘技术带来的巨大挑战。

印第安纳大学Truthy(意:可信)项目的目标是从这种每日的信息泛滥中发掘出深层意义,博士后研究员埃米利奥·费拉拉(Emilio Ferrara)说。“Truthy是一种能让研究者研究推特上信息扩散的工具。通过识别关键词以及追踪在线用户的活动,我们研究正在进行的讨论。”

Truthy是由印第安纳研究者菲尔·孟泽(Fil Menczer)和亚力桑德罗·弗拉米尼(Alessandro Flammini)开发的。每一天,该项目的计算机过滤多达5千万条推文,试图找出其中蕴含的模式。

 

大数据盯着“#bigdata”(意为大数据)。这些是在推特上发布过“bigdata”的用户之间的连接,用户图标的尺寸代表了其粉丝数多寡。蓝线表示一次回复或者提及,绿线表示一个用户是另一个的粉丝。

一个主要的兴趣点是“水军”,费拉拉说:协调一致的造势运动本应来自草根阶层,但实际上是由“热衷传播虚假信息的个人和组织”发起的。

2012年美国大选期间,一系列推文声称共和党总统候选人米特·罗姆尼(Mitt Romney)在脸谱网上获得了可疑的大批粉丝。“调查者发现共和党人和民主党人皆与此事无关。”费拉拉说,“幕后另有主使。这是一次旨在令人们相信罗姆尼在买粉从而抹黑他的造势运动。”

水军的造势运动通常很有特点,费拉拉说。“要想发起一场大规模的抹黑运动,你需要很多推特账号,”包括由程序自动运行、反复发布选定信息的假账号。“我们通过分析推文的特征,能够辨别出这种自动行为。”

推文的数量年复一年地倍增,有什么能够保证线上政治的透明呢?“我们这个项目的目的是让技术掌握一点这样的信息。”费拉拉说,“找到一切是不可能的,但哪怕我们能够发现一点,也比没有强。”

头脑里的大数据

人脑是终极的计算机器,也是终极的大数据困境,因为在独立的神经元之间有无数可能的连接。人类连接组项目是一项雄心勃勃地试图绘制出不同脑区之间相互作用的计划。

除了连接组,还有很多充满数据的“组”:

 

  • 基因组:由DNA编码的,或者由RNA编码的(比如病毒)——全部基因信息
  • 转录组:由一个有机体的DNA产生的全套RNA“读数”
  • 蛋白质组:所有可以用基因表达的蛋白质
  • 代谢组:一个有机体新陈代谢过程中的所有小分子,包括中间产物和最终产物

连接组项目的目标是“从1,200位神经健康的人身上收集先进的神经影像数据,以及认知、行为和人口数据”,圣路易斯市华盛顿大学的连接组项目办事处的信息学主任丹尼尔·马库斯(Daniel Marcus)说。 

项目使用三种磁共振造影观察脑的结构、功能和连接。根据马库斯的预期,两年之后数据收集工作完成之时,连接组研究人员将埋首于大约100万G数据。

 

20名健康人类受试者处于休息状态下接受核磁共振扫描,得到的大脑皮层不同区域间新陈代谢活动的关联关系,并用不同的颜色表现出来。黄色和红色区域在功能上与 右半脑顶叶中的“种子”位置(右上角黄斑)相关。绿色和蓝色区域则与之关联较弱或者根本没有关联。

绘制脑区分布图的“分区”是一项关键的任务,这些脑区最早于两到三世纪之前通过对少量大脑染色被识别出来。“我们将拥有1,200个人的数据,”马库斯说,“因此我们可以观察个人之间脑区分布的差别,以及脑区之间是如何关联的。”

为了识别脑区之间的连接,马库斯说,“我们在受试者休息时获取的扫描图中,观察脑中的自发活动在不同区域之间有何关联。”比如,如果区域A和区域B自发地以每秒18个周期的频率产生脑波,“这就说明它们处于同一网络中。”马库斯说。“我们将利用整个大脑中的这些关联数据创建一个表现出脑中的每一个点如何与其 他每一个点关联的矩阵。”(这些点将比磁共振成像无法“看到”的细胞大得多。)

星系动物园:把天空转包给大众

星系动物园项目打破了大数据的规矩:它没有对数据进行大规模的计算机数据挖掘,而是把图像交给活跃的志愿者,由他们对星系做基础性的分类。该项目2007年 启动于英国牛津,当时天文学家凯文·沙文斯基(Kevin Schawinski)刚刚蹬着眼睛瞧完了斯隆数字巡天计划拍摄的5万张图片。

阿拉巴马大学天文学教授、星系动物园科学团队成员威廉·基尔(William Keel)说,沙文斯基的导师建议他完成95万张图像。“他的眼睛累得快要掉出眼窝了,便去了一家酒馆。他在那里遇到了克里斯·林托特(Chris Lintott)。两人以经典的方式,在一张餐巾的背面画出了星系动物园的网络结构。”

星系是一个经典的大数据问题:一台最先进的望远镜扫描整个天空,可能会看到2000亿个这样的恒星世界。然而,“一系列与宇宙学和星系统计学相关的问题可以 通过让许多人做相当简单的分类工作得以解决。”基尔说,“五分钟的辅导过后,分类便是一项琐碎的工作,直到今日也并不适合以算法实现。”

星系动物园的启动相当成功,用户流量让一台服务器瘫痪了,基尔说。

斯隆巡天的全部95万张图片平均每张被看过60次之后,动物园的管理者们转向了更大规模的巡天数据。科学受益匪浅,基尔说。“我的很多重要成果都来自人们发现的奇怪物体,”包括背光星系。

这是星系动物园志愿者们发现的差不多2000个背光星系之一。它被其后方的另一个星系照亮。来自背后的光令前景星系中的尘埃清晰可辨。星际尘埃在恒星的形成中扮演了关键的角色,但它本身也是由恒星制造的,因此检测其数量和位置对于了解星系的历史至关重要。

星系动物园依赖统计学、众多观察者以及处理、检查数据的逻辑。假如观察某个特定星系的人增加时,而认为它是椭圆星系的人数比例保持不变,这个星系就不必再被观察了。

然而,对一些稀有的物体,基尔说,“你可能需要40至50名观察者。”

大众科学正在发展自己的法则,基尔补充道。志愿者们的工作“已经对一个真实存在的重大问题做出了贡献,是现存的任何软件都无法实现的。鼠标的点击不该被浪费。”

这种动物园方法在zooniverse.org 网站上得到了复制和优化。这是一个运行着大约20项目的机构,这些项目的处理对象包括热带气旋、火星表面和船只航行日志上的气象数据。

最终,软件可能会取代志愿者,基尔说。但是计算机和人类之间的界线是可互换的。比如说超新星动物园项目在软件学会了任务之后就关闭了。

我们惊讶地得知志愿者们积累的庞大数据是计算机学习分类的理想材料。“一些星系动物园用户真的很反感这一点。”基尔说,“他们对于自己的点击被用来训练软件表达出明显的怨恨。但是我们说,不要浪费点击。如果某人带来了同样有效的新算法,人们就不必做那些事情了。”

学习的渴望

人们长久以来改进对图像和语音的模式识别的努力已经受益于更多的训练,威斯康星大学麦迪逊分校的克拉考尔说。“它不仅仅是有所改善,更是有了实际的效果。5到10年之前,iPhone上的Siri是个想都不敢想的点子,语音识别一塌糊涂。现在我们拥有了这样一批庞大的数据来训练算法,忽然之间它们就管用了。”

 

随着数据及通讯价格持续下跌,新的思路和方法应运而生。如果你想了解你家中每一件设备消耗了多少水和能量,麦克阿瑟奖获得者西瓦塔克·帕特尔 (Shwetak Patel)有个解决方案:用无线传感器识别每一台设备的唯一数字签名。帕特尔的智能算法配合外挂传感器,以低廉的成本找到耗电多的电器。位于加利福尼亚 州海沃德市的这个家庭惊讶地得知,录像机消耗了他们家11%的电力。等到处理能力一次相对较小的改变令结果出现突破性的进展,克拉考尔补充道,大数据的应用可能会经历一次“相变”。

“大数据”是一个相对的说法,不是绝对的,克拉考尔指出。“大数据可以被视作一种比率——我们能计算的数据比上我们必须计算的数据。大数据一直存在。如果你想一下收集行星位置数据的丹麦天文学家第谷布拉赫(Tycho Brahe,1546-1601),当时还没有解释行星运动的开普勒理论,因此这个比率是歪曲的。这是那个年代的大数据。”

大数据成为问题“是在技术允许我们收集和存储的数据超过了我们对系统精推细研的能力之后。”克拉考尔说。

我们好奇,当软件继续在大到无法想象的数据库上执行复杂计算,以此为基础在科学、商业和安全领域制定决策,我们是不是把过多的权力交给了机器。在我们无法觑探之处,决策在没人理解输入与输出、数据与决策之间的关系的情况下被自动做出。“这正是我所从事的领域,”克拉考尔回应道,“我的研究对象是宇宙中的智能演化,从大爆炸到大脑。我毫不怀疑你说的。”