Apache Spark 是一个开源集群计算框架。与 Hadoop 基于磁盘的两阶段 MapReduce 范式相比,Spark 的内存原语在某些应用中可提供高达 100 倍的性能提升。
Spark Streaming 作为 Spark 0.7 的一部分发布,在 Spark 0.9 中脱离 alpha 阶段,并且从一开始就相当稳定。它可用于许多近乎实时的用例,例如监控网站上的用户流量和实时检测欺诈交易。
为什么需要 Spark Streaming?
有状态流处理系统是一种需要使用数据流更新其状态的系统。这种系统的延迟应该很低,即使节点发生故障,状态也不应丢失(例如,基于车辆 GPS 位置流计算车辆行驶的距离,或在数据流中计算单词“spark”的出现次数)。
像 Hadoop 这样的批处理系统具有高延迟,不适用于近乎实时的处理需求。Storm 保证处理未处理的记录,但这可能会导致不一致,因为一条记录可能会被处理两次。如果运行 Storm 的节点出现故障,则状态会丢失。在大多数环境中,Hadoop 和 Storm(或其他流处理系统)分别用于批处理和流处理。使用两种不同的编程模型会导致代码量增加、需要修复的错误数量增加、开发工作量增加、引入学习曲线以及引起其他问题。Spark Streaming 有助于解决这些问题,并提供可扩展、高效、弹性且 可集成 (与批处理)的系统。
在 Spark Streaming 中,弹性分布式数据集 (RDD) 的批次被传递到 Spark Streaming,后者使用 Spark Engine 处理这些批次,并返回已处理的批次流。已处理的流可以写入文件系统。批次大小可以低至 0.5 秒,从而实现不到 1 秒的端到端延迟。
Spark Streaming 以 Scala、Java 和 Python 提供 API。Python API 仅在 Spark 1.2 中引入,并且仍然缺少许多功能。Spark Streaming 允许有状态计算——根据数据流中的数据维护状态。它还允许窗口操作(即,允许开发人员指定一个时间范围,并对该时间窗口内流动的数据执行操作。窗口具有滑动间隔,即更新窗口的时间间隔。如果我定义一个 10 秒的时间窗口,滑动间隔为 2 秒。我将在过去 10 秒内流到数据流中的数据上执行计算,并且窗口将每 2 秒更新一次。
除了这些功能之外,Spark Streaming 的优势在于它能够与批处理相结合。可以使用普通的 Spark 编程创建 RDD,并将其与 Spark 流连接。此外,代码库相似,如果需要,可以轻松迁移——并且从 Spark 过渡几乎没有学习曲线。
在下面的示例中,wordCount
是一个 dStream
;使用 dStream 的 transform 操作,可以将 dStream 连接到另一个 RDD spamInfoRDD。此 RDD 是作为 Spark 作业的一部分生成的。
val spamInfoRDD = ssc.sparkContext.newAPIHadoopRDD(…) // 包含垃圾邮件信息的 RDD val cleanedDStream = wordCounts.transform(rdd => { rdd.join(spamInfoRDD).filter(…) // 将数据流与垃圾邮件信息连接以进行数据清理… })
Spark Streaming 允许从 Kafka、Flume、HDFS 或原始 TCP 流中摄取数据,并且允许用户从 RDD 创建流。您可以提供您的 RDD,Spark 会将它们视为 RDD 流。它甚至允许您创建自己的接收器。Scala 和 Java API 可以从所有来源读取数据,而 Python API 只能从 TCP 网络读取数据。
容错能力是系统克服故障的能力。Spark Streaming 中的容错能力类似于 Spark 中的容错能力。与 RDD 分区一样,dStreams 数据在发生故障时会重新计算。原始输入在集群中跨内存复制。如果节点发生故障,可以使用血统 (lineage) 重新生成数据。系统可以在不到一秒的时间内从故障中恢复。
Spark Streaming 能够处理每节点每秒 100,000-500,000 条记录。这比 Storm 快得多,并且与其他流处理系统相当。在 Sigmoid,我们能够使用 Kafka 作为源,在每节点机器上每秒消耗 480,000 条记录。我们不断突破性能的极限,并尝试从相同的基础设施中获得最大收益。
Sigmoid 与一家领先的供应链分析公司合作,帮助他们使用 Spark Streaming 处理实时工厂车间数据。关键问题是在几秒钟的周转时间内,从各种来源消化批处理和流数据。他们有一个具有挑战性的要求,即确保系统在生产中使用时易于扩展、高可用性和低延迟。我们克服了这些挑战,实施了一个稳定且可维护的实时流系统。
Spark Streaming 是目前最好的流平台,并且可以实现亚秒级延迟。处理能力随集群大小线性扩展。包括 Netflix、Cisco、Datastax 等在内的许多组织都在生产中使用 Spark Streaming。
感谢 Matei Zaharia、Tathagata Das 和其他提交者在 Apache 许可证下开源 Spark。
请留下评论,让我们知道您对 Spark Streaming 的看法以及如何从中受益。
本文的早期版本最初发表在 SIGMOID 博客上。
评论已关闭。