使用Kafka和Spark开始数据处理
大数据处理是组织面临的最复杂的过程之一。当您拥有大量的实时数据时,这个过程变得更加复杂。
在本文章中,我们将探讨大数据处理是什么,如何进行以及探索Apache Kafka和Spark – 这两个最著名的数据处理工具!
什么是数据处理?如何进行?
数据处理被定义为任何操作或一组操作,无论是否使用自动化过程执行。可以将其视为根据逻辑和适当的方式收集、排序和组织信息以供解释。
当用户访问数据库并获取他们搜索的结果时,正是数据处理使他们获得他们所需的结果。作为搜索结果提取的信息是数据处理的结果。这就是为什么信息技术的存在重点集中在数据处理上的原因。
传统的数据处理是使用简单的软件进行的。然而,随着 Big Data的出现,情况发生了变化。大数据指的是容量可能超过一百个TB和PB的信息。
此外,这些信息定期更新。例如,来自联系中心、社交媒体、股票交易数据等的数据。这样的数据有时也被称为数据流 – 一个持续的、无控制的数据流。其主要特点是数据没有定义的限制,因此无法确定流何时开始或结束。
数据在到达目的地时进行处理。有些作者称之为实时或在线处理。另一种方法是块、批量或离线处理,在这种方法中,数据块在几小时或几天的时间窗口内进行处理。通常批处理是在夜间运行的过程,用于整合当天的数据。有些情况下,一周甚至一个月的时间窗口会生成过时的报告。
由于最好的大数据处理平台通过流式处理是开源的,例如Kafka和Spark,这些平台允许使用其他不同和互补的工具。这意味着作为开源,它们的发展速度更快,使用的工具更多。这样,数据流可以以可变的速率从其他地方接收,并且没有任何中断。
现在,我们将介绍两个最为广为人知的数据处理工具并进行比较:
Apache Kafka
Apache Kafka是一个创建具有连续数据流的流应用程序的消息系统。Kafka最初是由LinkedIn创建的,它是基于日志的;日志是一种基本的存储形式,因为每个新的信息都添加到文件的末尾。
Kafka是大数据的最佳解决方案之一,因为它的主要特点是其高吞吐量。使用Apache Kafka,甚至可以将批处理转换为实时处理。
Apache Kafka是一个发布-订阅消息系统,其中一个应用程序发布消息,一个订阅应用程序接收消息。发布和接收消息之间的时间可以是毫秒级的,因此Kafka解决方案具有低延迟。
Kafka的工作原理
Apache Kafka的架构由生产者、消费者和集群本身组成。生产者是任何将消息发布到集群的应用程序。消费者是任何从Kafka接收消息的应用程序。Kafka集群是一组作为消息服务的单个实例的节点。
Kafka集群由多个代理组成。代理是一个接收来自生产者的消息并将其写入磁盘的Kafka服务器。每个代理管理一系列主题,每个主题被划分为多个分区。
收到消息后,代理将其发送给每个主题的注册消费者。
Apache Kafka的设置由Apache Zookeeper管理,该链接存储集群元数据,如分区位置、名称列表、主题列表和可用节点。因此,Zookeeper在集群的不同元素之间保持同步。
Zookeeper很重要,因为Kafka是一个分布式系统,即写入和读取是由多个客户端同时进行的。当发生故障时,Zookeeper选举一个替代者并恢复操作。
用例
Kafka变得流行,尤其是作为消息传递工具的使用,但其多功能性不止于此,它可以在各种场景中使用,如下面的示例所示。
消息传递
一种解耦通信方的异步通信方式。在这种模型中,一方将数据作为消息发送到Kafka,以便另一个应用程序稍后消费它。
活动跟踪
使您能够存储和处理跟踪用户与网站的交互的数据,例如页面浏览、点击、数据输入等;这种类型的活动通常会生成大量数据。
指标
涉及从多个来源聚合数据和统计信息以生成集中报告。
日志聚合
集中聚合和存储来自其他系统的日志文件。
流处理
数据流水线处理由多个阶段组成,原始数据从主题中消费,并被聚合、丰富或转换为其他主题。
为了支持这些功能,该平台基本上提供了三个API:
- Streams API:充当从一个主题消费数据、对其进行转换并将其写入另一个主题的流处理器。
- Connectors API:它允许将主题连接到现有系统,如关系型数据库。
- 生产者和消费者API:它允许应用程序发布和消费Kafka数据。
优点
复制、分区和有序
Kafka中的消息在到达时按顺序在集群节点的分区之间进行复制,以确保安全和快速交付。
数据转换
使用Apache Kafka,甚至可以使用批处理ETL流API将批处理处理转换为实时处理。
顺序磁盘访问
Apache Kafka将消息持久化到磁盘而不是内存中,因为这样做应该更快。事实上,在大多数情况下,内存访问更快,特别是考虑到访问内存中随机位置的数据。然而,Kafka进行顺序访问,在这种情况下,磁盘更高效。
Apache Spark
Apache Spark是一个用于在集群上处理并行数据的大数据计算引擎和一组库。它可以比传统的Map-Reduce编程范例快100倍,这要归功于其高效利用内存而不将数据持久化到磁盘中进行处理。
Spark分为三个层次:
- 低级API:该层次包含运行作业所需的基本功能和其他组件所需的功能。该层的其他重要功能包括安全性管理、网络、调度和对文件系统HDFS、GlusterFS、Amazon S3等的逻辑访问。
- 结构化API:结构化API层通过DataSets或DataFrames处理数据操作,可以读取Hive、Parquet、JSON等格式的数据。使用SparkSQL(允许我们以SQL编写查询的API),我们可以按照我们想要的方式操作数据。
- 高级别:在最高级别上,我们有带有各种库的Spark生态系统,包括Spark Streaming、Spark MLlib和Spark GraphX 。它们负责处理流式摄入和周围的流程,如崩溃恢复、创建和验证经典机器学习模型以及处理图形和算法。
Spark的工作方式
Spark应用程序的架构由三个主要部分组成:
Driver程序:负责编排数据处理的执行。
集群管理器:负责管理集群中的不同机器。仅在Spark运行分布式时需要。
工作节点:这些是执行程序任务的机器。如果在本地机器上运行Spark,它将起到驱动程序和工作器角色。这种运行Spark的方式称为独立模式。
Spark代码可以使用多种不同的语言编写。称为Spark Shell的Spark控制台是用于学习和探索数据的交互式工具。
所谓的Spark应用程序由一个或多个作业组成,支持大规模数据处理。
在执行方面,Spark有两种模式:
- 客户端:驱动程序直接在客户端上运行,不通过资源管理器。
- 集群:驱动程序通过资源管理器在应用程序主节点上运行(在集群模式下,如果客户端断开连接,应用程序将继续运行)。
必须正确使用Spark,以便链接的服务,如资源管理器,可以识别每个执行的需求,提供最佳性能。因此,开发人员需要知道运行其Spark作业的最佳方法,构造所做的调用,并且可以按您希望的方式构造和配置执行程序Spark。
Spark作业主要使用内存,因此通常需要调整工作节点执行程序的Spark配置值。根据Spark的工作负载,可以确定某个非标准的Spark配置是否提供更优化的执行。为此,可以对各种可用的配置选项和默认Spark配置本身进行比较测试。
使用案例
Apache Spark有助于处理大量数据,无论是实时的还是归档的,结构化的还是非结构化的。以下是一些常见的用例。
数据增强
公司通常将历史客户数据与实时行为数据结合使用。Spark可以帮助构建连续的ETL管道,将非结构化事件数据转换为结构化数据。
触发事件检测
Spark Streaming可以快速检测和响应可能表示潜在问题或欺诈的一些罕见或可疑行为。
复杂会话数据分析
使用Spark Streaming,可以对与用户会话相关的事件(例如登录应用程序后的活动)进行分组和分析。此信息还可以持续用于更新机器学习模型。
优点
迭代处理
如果任务是重复处理数据,则Spark的弹性分布式数据集(RDDs)允许多个内存中的映射操作,而无需将中间结果写入磁盘。
图形处理
Spark的计算模型和GraphX API非常适合图形处理的迭代计算。
机器学习
Spark具有内置的机器学习库MLlib,其中包含现成的算法,也可以在内存中运行。
Kafka与Spark
尽管人们对Kafka和Spark的兴趣几乎相似,但两者之间确实存在一些重要的差异。让我们来看一看。
#1. 数据处理
Kafka是一个实时数据流和存储工具,负责在应用程序之间传输数据,但仅仅使用Kafka还不足以构建一个完整的解决方案。因此,还需要其他工具来完成Kafka无法完成的任务,例如Spark。而Spark则是一个以批处理为首要的数据处理平台,它从Kafka主题中提取数据并将其转换为组合模式。
#2. 内存管理
Spark使用鲁棒分布式数据集(RDD)进行内存管理。它将大数据集分布在集群中的多个节点上,而不是尝试处理大数据集。相比之下,Kafka使用类似HDFS的顺序访问方式,并将数据存储在缓冲内存中。
#3. ETL转换
Spark和Kafka都支持ETL转换过程,即将记录从一个数据库复制到另一个数据库,通常是从transactional basis (OLTP) to an analytical basis (OLAP)复制。然而,与内置ETL流程能力的Spark不同,Kafka依赖于Streams API来支持它。
#4. 数据持久化
Spark使用RDD可以将数据存储在多个位置以供以后使用,而在Kafka中,必须在配置中定义数据集对象来持久化数据。
#5. 难度
由于Spark支持多种高级编程语言,因此Spark是一个完整的解决方案并且更容易学习。而Kafka依赖于许多不同的API和第三方模块,这可能使得与之一起工作变得困难。
#6. 恢复
Spark和Kafka都提供恢复选项。Spark使用RDD,可以持续保存数据,如果集群发生故障,可以进行恢复。
Kafka在集群内部持续复制数据,并在代理之间进行复制,这使得如果发生故障,可以切换到不同的代理。
Spark和Kafka之间的相似之处
Apache Spark | Apache Kafka |
开源 | 开源 |
构建数据流应用 | 构建数据流应用 |
支持有状态处理 | 支持有状态处理 |
支持SQL | 支持SQL |
最后的话
Kafka和Spark都是用Scala和Java编写的开源工具,可以用于构建实时数据流应用程序。它们有许多共同之处,包括有状态处理、对SQL的支持和ETL。Kafka和Spark也可以作为互补工具,帮助解决应用程序之间数据传输复杂性的问题。