Kafka 和 Spark 有什么区别?
Apache Kafka 是流处理引擎,Apache Spark 是分布式数据处理引擎。在分析中,组织以两种主要方式处理数据:批处理和流处理。批处理是在单个工作负载中处理非常大量的数据,流处理则是在实时流中连续处理小单元。最初,Spark 是为批处理而设计的,而 Kafka 是为流处理而设计的。后来,Spark 添加了 Spark Streaming 模块作为其底层分布式架构的附加组件,而 Kafka 则为大多数流数据应用场景提供更低的延迟和更高的吞吐量。
Kafka 和 Spark 有什么相似之处?
Apache Kafka 和 Apache Spark 均由 Apache Software Foundation 设计,旨在以更快的速度处理数据。组织需要现代数据架构,该架构可以摄取、存储和分析来自各种数据源的实时信息。
Kafka 和 Spark 具有重叠的特性,可以管理高速数据处理。
大数据处理
Kafka 提供跨多个服务器的分布式数据管道,以实时摄取和处理大量数据。Kafka 支持大数据使用案例,这些使用案例需要在不同来源之间进行高效的持续数据传输。
同样,可以使用 Spark 以各种实时处理和分析工具大规模处理数据。例如,借助 Spark 的机器学习库 MLlib,开发人员可以使用存储的大型数据集来构建商业智能应用程序。
数据多样性
Kafka 和 Spark 都摄取非结构化、半结构化和结构化的数据。可以使用 Kafka 或 Spark 从企业应用程序、数据库或其他流式传输来源创建数据管道。这两个数据处理引擎都支持分析中常用的纯文本、JSON、XML、SQL 和其他数据格式。
它们还会在将数据移动到集成存储(如数据仓库)之前对其进行转换,但这可能需要额外的服务或 API。
可扩展性
Kafka 是高度可扩展的数据流式传输引擎,可以垂直和水平扩展。可以向托管特定 Kafka 代理的服务器添加更多计算资源,以处理不断增长的流量。或者,可以在不同的服务器上创建多个 Kafka 代理,以实现更妥善的负载平衡。
同样,也可以通过向集群添加更多节点来扩展 Spark 的处理能力。例如,Spark 使用弹性分布式数据集(RDD),在多个节点上存储不可变数据的逻辑分区以进行并行处理。因此,使用 Spark 处理大量数据时,它也能保持最佳性能。
工作流程:Kafka 与Spark
Apache Kafka 和 Apache Spark 以不同的架构构建而成。Kafka 通过主题、代理、集群的分布式排列以及软件 ZooKeeper 支持实时数据流。同时,Spark 将数据处理工作负载分配给多个工作线程节点,由主节点进行协调。
Kafka 的工作原理
Kafka 使用实时分布式处理引擎连接数据生产者和使用者。Kafka 的核心组件如下:
- 促进使用者和生产者之间事务的代理
- 由驻留在不同服务器上的多个代理组成的集群
生产者向 Kafka 集群发布信息,而使用者检索信息进行处理。每个 Kafka 代理根据主题组织消息,然后代理将主题分成若干分区。对特定主题有共同兴趣的多个使用者可以订阅关联分区以开始流式传输数据。
即使在使用者读取数据之后,Kafka 也会保留数据的副本。这使得 Kafka 能够为生产者和使用者提供弹性、容错的数据流和消息传递功能。此外,ZooKeeper 会持续监控所有 Kafka 代理的运行状况。该软件可以确保由主管代理随时管理其他代理。
Spark 是如何运作的?
Spark Core 是包含基本 Spark 功能的主要组件。此功能包括分布式数据处理、内存管理、任务计划和分派以及与存储系统的交互。
Spark 使用分布式主要-辅助架构,该架构具有支持数据转换和批处理工作流程的多个连续层。主节点是中央协调器,负责为工作线程节点计划和分配数据处理任务。
当数据科学家提交数据处理请求时,将执行以下步骤:
- 主节点创建多个不可变的数据副本
- 该节点使用图形计划程序将请求分成一系列处理任务
- 它将任务传递给 Spark Core,Spark Core 会计划任务并将其分配给特定的工作线程节点
工作线程节点完成任务后,通过集群管理器将结果返回到主节点。
主要区别:有监督学习与无监督学习
在有监督学习中,可以使用已标记的香蕉图像来训练算法,以准确识别和计数香蕉。另一方面,无监督学习会根据相似性对图像进行分组。该模型有可能识别出不同品种的香蕉,或者将它们与其他水果分组,而无需明确知道它们是香蕉。接下来讨论其他一些差异。
目标
有监督学习的主要目标是根据已知输入预测输出。
但是,无监督学习的主要目标是识别输入数据点之间的有价值的关系信息,将这些信息应用于新的输入,并得出类似的见解。
方法
有监督学习旨在最大限度地减少预测输出和真实标签之间的误差。此类学习概括掌握的关系,以便对不可见的数据做出准确的预测。
相比之下,无监督机器学习模型侧重于在没有指导的情况下理解数据的固有结构。此模型优先考虑在数据中查找模式、相似性或异常。
复杂性
有监督学习和无监督学习技术存在各种差异,从相对基本的统计建模函数到高度复杂的算法,具体取决于问题集。
有监督学习应用程序非常普遍,非技术型用户也可以基于先前存在的模型开发自定义解决方案。
相比之下,无监督学习应用程序可能更难开发,因为数据中很有可能存在模式和关系。
主要区别:Kafka 与 Spark
Apache Kafka 和 Apache Spark 都为组织提供快速的数据处理能力。但是,它们采用不同的架构设置,这会影响它们在大数据处理使用案例中的操作方式。
ETL
提取、转换、加载(ETL)过程将多个来源的数据组合到大型中央存储库中。ETL 需要使用数据转换功能将各种数据转换为标准格式。
Spark 具有许多内置的转换和加载功能。用户可以从集群中检索数据,然后将其转换并存储在相应的数据库中。
另一方面,Kafka 默认不支持 ETL。相反,用户必须使用 API 对数据流执行 ETL 函数。例如:
- 借助 Kafka Connect API,开发人员可以在两个系统之间启用提取(E)和加载(L)操作
- Kafka Streams API 提供了数据转换(T)功能,开发人员可以使用这些功能以不同的格式操作事件消息
延迟
Spark 的开发是为了取代 Apache Hadoop,后者无法支持实时处理和数据分析。Spark 提供近乎实时的读/写操作,因为它将数据存储在 RAM 而非硬盘上。
但是,Kafka 凭借超低延迟的事件流式传输功能而优于 Spark。开发人员可以使用 Kafka 构建事件驱动的应用程序,以此回应实时数据更改。例如,数字音乐提供商 The Orchard 使用 Kafka 近乎实时地与员工和客户共享孤立的应用程序数据。
编程语言
开发人员可以使用 Spark 在数据处理平台上以多种语言构建和部署应用程序。这些语言包括 Java、Python、Scala 和 R。Spark 还提供用户友好的 API 和数据处理框架,开发人员可以使用这些框架实现图形处理和机器学习模型。
相反,Kafka 不为数据转换使用案例提供语言支持。因此,如果没有额外的库,开发人员就无法在平台上构建机器学习系统。
可用性
Kafka 和 Spark 都是具有高可用性和容错能力的数据处理平台。
Spark 在多个节点上维护工作负载的持久副本。如果其中一个节点出现故障,系统可以根据其余的活跃节点计算结果。
与此同时,Kafka 不断将数据分区复制到不同的服务器。如果某个 Kafka 分区离线,Kafka 会自动将使用者请求定向到备份分区。
多个数据源
Kafka 同时流式传输来自多个数据源的消息。例如,可以将来自不同 Web 服务器、应用程序、微服务和其他企业系统的数据实时发送到特定的 Kafka 主题。
另一方面,Spark 可以随时连接到单个数据源。但是,使用 Spark 结构化流式传输库可让 Spark 处理来自多个来源的微批次数据流。
主要区别:Kafka 与Spark 结构化流式传输
Spark Streaming 允许 Apache Spark 对传入的流采用微批处理方法。此后,Spark 结构化流式传输对该方法进行增强,使用 DataFrame 和 Dataset API 来提高其流处理性能。这种方法可让 Spark 像 Apache Kafka 一样处理连续的数据流,但是两个平台之间存在一些差异。
处理模型
Kafka 是分布式流式传输平台,它连接不同的应用程序或微服务以实现持续处理。其目标是确保客户端应用程序始终如一地实时从来源接收信息。
与 Kafka 不同,Spark 结构化流式传输是扩展程序,可为 Spark 架构提供额外的事件流式传输支持。您可以使用该扩展程序来捕获实时数据流,将数据转化为小型批次,并使用 Spark 的数据分析库和并行处理引擎处理这些批次。尽管如此,Spark 流式传输无法与 Kafka 的实时数据摄取速度相提并论。
数据存储
Kafka 将生产者发送的消息存储到称为主题的日志文件中。日志文件需要持久存储,以确保在停电时存储的数据不受影响。通常,日志文件作为备份复制到不同的物理服务器上。
同时,Spark 结构化流式传输在 RAM 中存储和处理数据流,但如果数据超过 RAM 的容量,它可能会使用磁盘作为辅助存储。Spark 结构化流式传输与 Apache Hadoop Distributed File System(HDFS)无缝集成,但它也可以与其他云存储配合使用,包括 Amazon Simple Storage Service(Amazon S3)。
API
Kafka 可让开发人员发布、订阅和设置 Kafka 数据流,然后使用不同的 API 对数据流进行处理。这些 API 支持各种编程语言,包括 Java、Python、Go、Swift 和 .NET。
同时,Spark 结构化流式传输的 API 专注于对从各种来源摄取的实时输入数据进行数据转换。与 Kafka 不同,Spark 结构化流式传输 API 仅提供有限的语言版本。开发人员可以使用 Java、Python 和 Scala 版本的 Spark 结构化流式传输来构建应用程序。
使用时机:Kafka 与Spark
Kafka 和 Spark 是服务不同用途的两个数据处理平台。
Kafka 允许多个客户端应用程序通过可扩展的分布式消息代理架构发布和订阅实时信息。另一方面,Spark 允许应用程序批量处理大量数据。
因此,Kafka 是确保云端不同应用程序或服务之间可靠、低延迟、高吞吐量消息传递的更理想选择。同时,Spark 允许组织运行大量的数据分析和机器学习工作负载。
尽管 Kafka 和 Spark 有着不同的使用案例,但它们并非相互排斥。可以将这两种数据处理架构结合起来,形成容错的实时批处理系统。在此设置中,Kafka 会从多个来源摄取连续数据,然后将其传递给 Spark 的中央协调器。接下来,Spark 将需要批处理的数据分配给相应的工作线程节点。
差异摘要:Kafka 与Spark
Kafka |
Spark |
|
ETL |
需要 Kafka Connect API 和 Kafka Streams API 以执行 ETL 函数。 |
原生支持 ETL。 |
延迟 |
超低延迟。为每个传入的事件提供真正的实时处理。 |
低延迟。在 RAM 上执行读/写操作。 |
编程语言 |
需要额外的库来实施数据转换函数。 |
支持 Java、Python、Scala 和 R 来执行数据转换和机器学习任务。 |
可用性 |
在不同的服务器上备份数据分区。当活跃分区出现故障时,将请求直接发送到备份。 |
在多个节点上维护持久数据。在节点出现故障时重新计算结果。 |
数据来源 |
可以同时支持多个数据源。 |
连接到单个数据源。需要 Spark 结构化流式传输以使用多个数据源进行流式传输。 |
AWS 如何帮助您满足 Kafka 和 Spark 要求?
无论您使用 Apache Kafka 还是 Apache Spark,Amazon Web Services(AWS)都能提供托管数据基础设施支持。
使用 Amazon Managed Streaming for Apache Kafka(Amazon MSK)轻松部署、运行和管理 Kafka 集群。该工具可以自动执行以下操作:
- 为整个 Kafka 集群配置所有必要的资源
- 跨多个可用区复制和分发 Kafka 集群
- 在 Amazon Virtual Private Cloud(Amazon VPC)中运行 Kafka 集群,从而在节点之间提供私有连接
使用 Amazon EMR 支持您的 Spark 大数据、交互式分析和机器学习应用程序。使用 Amazon EMR,您可以执行以下操作:
- 相比于本地数据处理解决方案节省一半以上的成本。
- 自动为大数据应用程序预置计算资源,以满足不断变化的需求。
- 将 Spark 与各种可扩展的云存储集成,包括 Amazon S3、Amazon DynamoDB 和 Amazon Redshift
立即创建账户,开始在 AWS 上使用 Spark 和 Kafka。