您好,欢迎来到12图资源库!分享精神,快乐你我!我们只是素材的搬运工!!
  • 首 页
  • 当前位置:首页 > 开发 > WEB开发 >
    用Spark,Kafka和k8s构建下一代数据管道
    时间:2021-08-09 08:00 来源:网络整理 作者:网络 浏览:收藏 挑错 推荐 打印

    用Spark,Kafka和k8s构建下一代数据管道

    【51CTO.com快译】数据集成,通常在企业的信息架构中扮演着重要的角色。详细而言,企业的剖析流程在很大水平上会依赖于此类集成形式,以便从买卖系统中,提取方便剖析与加载的数据格式。

    过去,在传统的架构范式中,由于系统之间缺乏互连,事务和剖析常常出现延迟,我们只能依赖Batch以完成集成。在Batch形式中,大文件(即数据的dump文件)通常是由操作系统生成,并且经过验证、清算、标准化、以及转换等处置,进而输入文件以供系统剖析。由于此类大文件的读取会占用少量的内存,因此数据架构师通常会依赖一些暂存类型的数据库,来继续存储已完成处置的数据输入。

    近年来,随着以Hadoop为代表的散布式计算的普遍开展与运用,MapReduce经过在商用硬件上的水平扩展,以散布处置的方式,处置了高内存的运用需求。如今,随着计算技术的进一步开展,我们已可以在内存中运转MapReduce,并使之成为了处置大型数据文件的标准。

    就在Batch方式停止演化的进程中,非批(non-batch)处置方式也失掉了严重停顿。多年来,面向用户的物联网设备已逐渐成为数据系统中的重要一环。少量数据源于物联网设备的采集,而事情驱动型架构也成为了基于微效劳的云原生开发办法的盛行选择。由于数据处置频率的成倍添加,数据流的处置才能成为了数据集成任务的主要非功用性需求。因此,曾经是大文件数据集成成绩,已演化成为了流处置需求。这就需求我们提供一个具有足够缓冲区的数据管道,经过耐久性来避免数据包的丧失。

    在那些以云效劳为主体的平台上,各种组件的水平扩展才能,相关于数据流和运用者而言,要比垂直扩展愈减轻要。因此,对流的水平可伸缩性以及流的运用者有明白的关注。这也是诸如Kafka之类的数据流处置方案、以及Kubernetes集群需求向运用者(consumer)提供的。目前,Lambda架构的Speed层、以及Kappa架构的构建也都在向此办法开展。

    采用Spark、Kafka和k8s构建下一代数据管道的目的,本文将讨论相关架构形式,以及对应的示例代码,您可以跟着一步一步在本人的环境中搭建与完成。

    Lambda架构

    Lambda架构主要两个层次:Batch和Stream。Batch可以按照预定的批次转换数据,而Stream担任近乎实时地处置数据。Batch层通常被运用的场景是:在源系统中批量发送的数据,需求拜访整个数据集,以停止所需的数据处置,不过由于数据集太大,无法执行流式处置。相反,那些带有小块数据包的高速数据需求在Speed层被处置。这些数据包要么相互独立,要么按照速度相近的方式构成了对应的上下文。显然,这两种类型的数据处置方式,都属于计算密集型,虽然Batch层的内存需求要高于Speed层。与之对应的架构方案需求具有可扩展性、容错性、功用优势、成本效益、灵敏性、以及散布式。

    用Spark,Kafka和k8s构建下一代数据管道

    图 1:Lambda架构

    由上图可知,由于Lambda需求两个独自的组件,来停止Batch和Speed层面的数据处置,因此其架构较为复杂。假设我们可以用某个单一的技术组件,来同时满足这两个目的,则会大幅降低复杂性。而这正是Apache Spark大显神通之处。

    散布式计算的最新选择

    仰仗着包括SparkSQL和SparkStreaming在内的一系列库,Apache Spark作为一种有效的方案,可经过内存计算,来完成散布式Lambda架构。其中,SparkSQL可以支持各种Batch操作,例如:经过火布式架构加载、验证、转换、聚合、以及映射数据,进而增加关于单台机器的内存需求。异样,基于SparkStreaming的作业义务,可以近乎实时地处置来自Kafka等来源的数据流,并将剖析结果提供应诸如:数据仓库或数据湖等更为耐久的组件。

    用Spark,Kafka和k8s构建下一代数据管道

    图 2:Batch和Speed层的上下文

    Kubernetes是一种云平台集群管理器,其最新版本的Spark,可以运转在由 Kubernetes管理的集群上。可以说,基于Kubernetes的Spark是在云端完成Lambda架构的绝佳组合。

    虽然我们可以独自地运用Kubernetes停止散布式计算,但是在这种状况下我们仍需求依赖定制的处置方案。例如,在Batch层中,Spring Batch框架可以与Kubernetes集群结合运用,进而将任务义务分发到多个集群节点处。相似地,Kubernetes也可以将流数据分发到多个针对Speed层,而并行运转的Pod。Pod可以经过在其中生成容器,以完成轻松地水平扩展,进而可以依据数据的体量和速率去调整集群。

    Spark,针对Lambda架构的一站式处置方案

    针对Batch和Speed层的非功用性需求,Apache Spark具有如下特性:

    可扩展性:Spark集群可以按需停止扩、缩容。由于它由一个主节点和一组任务节点组成,因此这些任务节点会随着任务负载的添加,而提高水平扩展的才能。

    容错性:Spark框架可以处置由于任务节点的崩溃,而招致的集群缺点。由于每个数据帧都会被逻辑分区,而每个分区的数据处置都会发作在某个节点上。那么,在处置数据时,假设某个节点发作了缺点,那么集群管理器会按照有向无环图(Directed Acyclic Graph,DAG)的逻辑,分配另一个节点来执行数据帧的相反分区,进而确保相对的零数据丧失。

    效率高:由于Spark支持内存计算,因此在执行时期,数据可以依据Hadoop的需求,被存储在RAM中,而非磁盘上。其效率显然要高得多。

    灵敏的负载分配:由于Spark支持散布式计算,可以横跨多个节点共享义务的组件,并作为一个集成单元生成输入。Spark可以运转在 Kubernetes 管理的集群上,这使得它在云环境中愈加适宜。

    成本:Spark是开源的,本身不包含任何成本。当然,假设选择托管效劳,则需求付出一定的代价。

    如今让我们深化了解Spark以了解它如何协助Batch和蒸汽处置。Spark由两个主要组件组成:Spark中心 API 和Spark库。中心 API 层提供对四种言语的支持:R、Python、Scala 和 Java。在中心 API 层之上,我们有以下Spark库,每个库都针对不同的目的。

    SparkSQL:处置(半)结构化数据,执行基本转换功用并在数据集上执行 SQL 查询SparkStreaming:可以处置流数据;支持近实时数据处置

    SparkMLib:用于机器学习;依据需求用于数据处置

    SparkGraphX:用于图形处置;这里讨论的范围很少运用 

    用Spark,Kafka和k8s构建下一代数据管道

    图 3:Spark堆栈(来源:LearningSpark,O'Reilly Media, Inc.)

    Batch层的Spark

    在Lambda架构转换的Batch层,对(半)结构化数据的计算、聚合操作由SparkSQL 库处置。让我们进一步讨论SparkSQL 架构。

    用Spark,Kafka和k8s构建下一代数据管道

    图 4:SparkSQL 架构

    从上图中可以清楚看出,SparkSQL 具有三个主要架构层,如下所述:

    数据源 API:处置不同的数据格式,如 CSV、JSON、AVRO 和 PARQUET。它还有助于衔接不同的数据源,如 HDFS、HIVE、MYSQL、CASSANDRA 等。 用于加载不同格式数据的通用 API:

    Dataframe.read.load(“ParquetFile | JsonFile | TextFile | CSVFile | AVROFile”)

    数据帧API:Spark2.0 以后,Spark数据帧被少量运用。它有助于保存大型关系数据并地下多个转换函数以对数据集停止切片和切块。经过 Dataframe API 地下的此类转换函数的示例是:

    withColumn, select, withColumnRenamed, groupBy, filter, sort, orderBy etc.

    (责任编辑:admin)