为什么越来越多的公司在使用 Spark Streaming

  • 孙镜涛

2016 年 1 月 3 日

话题:语言 & 开发架构

Databricks 最近对 1400 多家 Spark 用户进行了一次调查,结果显示这些用户对 Spark Streaming 的使用率与 2014 年相比增长了 56%,另外,有 48% 的受访者将 Spark Streaming 标记为最常用的 Spark 组件。在 Spark Streaming 不断增长的用户群中,Uber、Netflix 和 Pinterest 等家喻户晓的公司赫然在列,那么为什么使用 Spark Streaming 加速业务发展的公司越来越多呢?最近 Spark Streaming 的主要开发人员 Tathagata Das 在 DataNami 上发表了一篇文章,从需求、功能以及用户场景等方面对此进行了介绍

流分析的需求

现在,几乎所有的公司都是一家软件公司,它们实时地监控传感器、物联网设备、社交网络和在线事务系统产生的数据,然后通过大规模、实时的流处理系统对其进行分析从而实现快速响应。此外,公司还会使用这些数据生成日报和业务模型。也就是说,现代流处理框架不仅需要应对实时场景,还需要处理预处理和后处理等非实时场景。

例如,电商需要对用户在线购买时产生的数据(包括日期、时间、物品、价格等)进行实时分析完成广告推送和相关性推荐。银行需要使用训练好的欺诈模型实时地对每一笔交易进行检测从而定位欺诈行为。

Spark Streaming 不仅能够非常好地解决这些问题,同时它还统一了技术框架,使用了与 Spark 一致的编程模型和处理引擎。而在 Spark Streaming 出现之前,用户需要借助多种开源软件才能构建出具有流处理、批处理和机器学习能力的系统。

Spark Streaming 的能力

Spark Streaming 是在 2013 年被添加到 Apache Spark 中的,作为核心 Spark API 的扩展它允许数据工程师和数据科学家实时地处理来自于 Kafka、Flume 以及 Amazon Kinesis 等多种源的数据。这种对不同数据的统一处理能力就是 Spark Streaming 会被大家迅速采用的关键原因之一。

Spark Streaming 能够按照 batch size(如 1 秒)将输入数据分成一段段的离散数据流(Discretized Stream,即 DStream),这些流具有与 RDD 一致的核心数据抽象,能够与 MLlib 和 Spark SQL 等 Spark 组件无缝集成。

通过 Spark Streaming 开发者能够容易地使用一种框架满足所有的处理需求,例如通过 MLlib 离线训练模型,然后直接在 Spark Streaming 中使用训练好的模型在线处理实时数据。同时,开发者编写的代码和业务逻辑也能够在流处理、批处理和交互式处理引擎中共享和重用。此外,流数据源中的数据还可以与很多其他的 Spark SQL 能够访问的静态数据源进行联合。例如,在将 Amazon Redshift 的静态数据推送到下游系统之前,可以先将其加载到 Spark 的内存中进行处理以丰富流数据。

用例——从 Uber 到 Pinterest

虽然针对不同的目标和业务案例使用 Spark Streaming 的方式也不同,但其主要场景包括:

  • 流 ETL——将数据推入存储系统之前对其进行清洗和聚合
  • 触发器——实时检测异常行为并触发相关的处理逻辑
  • 数据浓缩——将实时数据与静态数据浓缩成更为精炼的数据以用于实时分析
  • 复杂会话和持续学习——将与实时会话相关的事件(例如用户登陆 Web 网站或者应用程序之后的行为)组合起来进行分析。

例如,Uber 通过 Kafka、Spark Streaming 和 HDFS 构建了持续性的 ETL 管道,该管道首先对每天从移动用户那里收集到的 TB 级的事件数据进行转换,将原始的非结构化事件数据转换成结构化的数据,然后再进行实时地遥测分析。Pinterest 的 ETL 数据管道始于 Kafka,通过 Spark Streaming 将数据推入 Spark 中实时分析全球用户对 Pin 的使用情况,从而优化推荐引擎为用户显示更相关的 Pin。Netflix 也是通过 Kafka 和 Spark Streaming 构建了实时引擎,对每天从各种数据源接收到的数十亿事件进行分析完成电影推荐。


感谢杜小芳对本文的审校。

给 InfoQ 中文站投稿或者参与内容翻译工作,请邮件至editors@cn.infoq.com。也欢迎大家通过新浪微博(@InfoQ@丁晓昀),微信(微信号:InfoQChina)关注我们,并与我们的编辑和其他读者朋友交流(欢迎加入 InfoQ 读者交流群(已满),InfoQ 读者交流群(#2))。

语言 & 开发架构